K-均值聚类算法

K-均值聚类算法是一种常用的无监督学习算法,用于将数据集分成 K 个簇。该算法的主要思想是通过迭代的方式将数据点分配到离它们最近的簇中,并更新簇的中心点,直到满足某个停止条件为止。

以下是 K-均值聚类算法的基本步骤:

  1. 初始化:选择 K 个初始簇中心点。可以随机选择数据集中的 K 个点作为初始中心,或者使用一些启发式方法进行初始化。

  2. 分配数据点到最近的簇:对于每个数据点,计算它与各个簇中心点的距离,然后将其分配到距离最近的簇中。

  3. 更新簇的中心点:对于每个簇,重新计算其中心点,通常是该簇所有数据点的平均值。

  4. 重复步骤2和3:重复步骤2和3直到满足停止条件,例如簇的中心点不再发生变化,或者达到了预先设定的迭代次数。

K-均值聚类算法的优点包括简单易实现、计算复杂度较低,适用于大型数据集。然而,它也有一些缺点,例如对初始中心点的敏感性较高,可能收敛到局部最优解,且需要事先确定簇的数量 K。

在实际应用中,K-均值聚类算法常用于数据压缩、图像分割、文本挖掘等领域。

按密度聚类

代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler# 导入葡萄酒数据集
wine = load_wine()
X = wine.data
y = wine.target
feature_names = wine.feature_names# 数据标准化
X = StandardScaler().fit_transform(X)# 使用K均值算法进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X)# 计算轮廓系数
silhouette_avg = silhouette_score(X, clusters)
print("轮廓系数:", silhouette_avg)# 绘制散点图
plt.figure(figsize=(10, 6))# 根据不同的聚类结果绘制散点图
for i in range(3):plt.scatter(X[clusters == i, 0], X[clusters == i, 1], label=f'聚类 {i}')# 绘制聚类中心
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='*', s=200, c='black', label='聚类中心')# 添加标题和标签
plt.title('葡萄酒数据集的K均值聚类')
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
plt.legend()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 显示图形
plt.show()

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, accuracy_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split# 导入葡萄酒数据集
wine = load_wine()
X = wine.data
y = wine.target
feature_names = wine.feature_names# 数据标准化
X = StandardScaler().fit_transform(X)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用K均值算法进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X_train)# 计算轮廓系数
silhouette_avg = silhouette_score(X_train, clusters)
print("训练集轮廓系数:", silhouette_avg)# 使用测试集进行预测
test_clusters = kmeans.predict(X_test)# 计算准确度
accuracy = accuracy_score(y_test, test_clusters)
print("测试集准确度:", accuracy)# 绘制分布散点图
plt.figure(figsize=(12, 6))# 绘制训练集分布散点图
plt.subplot(1, 2, 1)
for i in range(3):plt.scatter(X_train[clusters == i, 0], X_train[clusters == i, 1], label=f'聚类 {i}')plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='*', s=200, c='black', label='聚类中心')
plt.title('训练集分布散点图')
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
plt.legend()# 绘制测试集预测折线图
plt.subplot(1, 2, 2)
plt.plot(range(len(X_test)), test_clusters, marker='o', linestyle='-', color='b', label='预测值')
plt.plot(range(len(X_test)), y_test, marker='x', linestyle='--', color='r', label='真实值')
plt.title('测试集预测折线图')
plt.xlabel('样本编号')
plt.ylabel('类别')
plt.legend()# 显示图形
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.tight_layout()
plt.show()

 

 

按层次聚类-从上到下

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score, accuracy_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split# 导入葡萄酒数据集
wine = load_wine()
X = wine.data
y = wine.target
feature_names = wine.feature_names# 数据标准化
X = StandardScaler().fit_transform(X)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用层次聚类算法进行聚类
agg_clustering = AgglomerativeClustering(n_clusters=3)
clusters = agg_clustering.fit_predict(X_train)# 计算轮廓系数
silhouette_avg = silhouette_score(X_train, clusters)
print("训练集轮廓系数:", silhouette_avg)# 使用测试集进行预测
test_clusters = agg_clustering.fit_predict(X_test)# 计算准确度
accuracy = accuracy_score(y_test, test_clusters)
print("测试集准确度:", accuracy)# 绘制分布散点图
plt.figure(figsize=(12, 6))# 绘制训练集分布散点图
plt.subplot(1, 2, 1)
for i in range(3):plt.scatter(X_train[clusters == i, 0], X_train[clusters == i, 1], label=f'聚类 {i}')plt.title('训练集分布散点图')
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
plt.legend()# 绘制测试集预测折线图
plt.subplot(1, 2, 2)
plt.plot(range(len(X_test)), test_clusters, marker='o', linestyle='-', color='b')
plt.plot(range(len(X_test)), y_test, marker='x', linestyle='--', color='r', label='真实值')
plt.title('测试集预测折线图')
plt.xlabel('样本编号')
plt.ylabel('类别')# 显示图形
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.tight_layout()
plt.show()

 

 

按层次聚类-从下到上

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score, accuracy_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split# 导入葡萄酒数据集
wine = load_wine()
X = wine.data
y = wine.target
feature_names = wine.feature_names# 数据标准化
X = StandardScaler().fit_transform(X)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用层次聚类算法进行聚类
agg_clustering = AgglomerativeClustering(n_clusters=3, linkage='ward')
clusters = agg_clustering.fit_predict(X_train)# 计算轮廓系数
silhouette_avg = silhouette_score(X_train, clusters)
print("训练集轮廓系数:", silhouette_avg)# 使用测试集进行预测
test_clusters = agg_clustering.fit_predict(X_test)# 计算准确度
accuracy = accuracy_score(y_test, test_clusters)
print("测试集准确度:", accuracy)# 绘制分布散点图
plt.figure(figsize=(12, 6))# 绘制训练集分布散点图
plt.subplot(1, 2, 1)
for i in range(3):plt.scatter(X_train[clusters == i, 0], X_train[clusters == i, 1], label=f'聚类 {i}')plt.title('训练集分布散点图')
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
plt.legend()# 绘制测试集预测折线图
plt.subplot(1, 2, 2)
plt.plot(range(len(X_test)), test_clusters, marker='o', linestyle='-', color='b')
plt.plot(range(len(X_test)), y_test, marker='x', linestyle='--', color='r', label='真实值')
plt.title('测试集预测折线图')
plt.xlabel('样本编号')
plt.ylabel('类别')
plt.legend()# 显示图形
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.tight_layout()
plt.show()

 

 

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target# 使用PCA进行降维
pca = PCA(n_components=2)  # 降维到2维
X_pca = pca.fit_transform(X)# 创建KMeans模型
kmeans = KMeans(n_clusters=3, random_state=42)# 在降维后的数据上进行聚类
kmeans.fit(X_pca)# 获取聚类结果
labels = kmeans.labels_# 绘制聚类结果
plt.figure(figsize=(10, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap=plt.cm.Set1)
plt.title('K-Means Clustering of Iris Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

 

K-均值聚类算法是一种常用的无监督学习算法,用于将数据集分成 K 个相似的组或者簇。以下是 K-均值聚类算法的优缺点:

优点:

  1. 简单易实现:K-均值算法相对简单,易于理解和实现,是一种常用的聚类算法。
  2. 计算速度快:对于大型数据集来说,K-均值算法通常执行速度较快,适用于大规模数据集的聚类任务。
  3. 适用于均衡分布的簇:当簇的形状大致相似且大小差异不大时,K-均值算法表现较好。
  4. 可扩展性强:K-均值算法适用于大多数数据类型,可以灵活地应用于不同的领域和问题。

缺点:

  1. 需要预先确定聚类数目 K:K-均值算法需要提前指定聚类的数量 K,而且对初始聚类中心的选择非常敏感,不同的初始值可能导致不同的聚类结果。
  2. 对初始值敏感:算法的结果受初始聚类中心的影响,不同的初始值可能导致不同的聚类结果,因此需要进行多次运行以选择最佳的结果。
  3. 对异常值敏感:K-均值算法对异常值(离群点)比较敏感,可能会影响最终的聚类结果。
  4. 只适用于凸形簇:K-均值算法假设簇是凸形的,当簇的形状不规则或者大小差异较大时,可能导致聚类效果较差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【热门话题】WebKit架构简介

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…

软考高级架构师:流水线的概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

基于SSM的“任务发布接收平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“任务发布接收平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 前台界面 收藏界面 留言管理界面 任务管理界面 订…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑灵活性供需平衡的新型电力系统长短期储能联合规划》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

file_get_contents(‘php://input‘); 这个postman要如何传参

在 Postman 中传递参数给 file_get_contents(php://input); 是通过请求的 Body 部分来实现的。使用 Postman 进行 API 接口测试时,可以按照以下步骤来传递参数: 打开 Postman 并创建一个新的请求。在请求的 URL 地址栏输入你的 API 地址。选择请求方法为…

蓝桥杯刷题day13——自助餐【算法赛】

一、问题描述 食堂最近推出了自助取餐功能,可以通过盘子的形状自动计算费用。你参与到自助计算价格的项目工作中。视觉组的同学已经帮你通过图像识别把盘子图片转换为了字符串,你只需要计算具体的价格即可。 餐盘的费用如下表所示: 你将会得到n 个字符…

Spark实战:词频统计

文章目录 一、Spark实战:词频统计(一)Scala版1、分步完成词频统计2、一步搞定词频统计 (二)Python版1、分步完成词频统计2、一步搞定词频统计 二、实战总结 一、Spark实战:词频统计 (一&#x…

顶顶通呼叫中心中间件-话术编辑器机器人转人工坐席配置(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-话术编辑器机器人转人工座席配置(mod_cti基于FreeSWITCH) 配置方法 一、ACD排队转接 二、伴随转接 比如你设置的通知规则是任意满足一个就通知那么通话时间设置为10 秒那样他只要通话时间到10秒他就会转坐席。 如果要转人工的时侯转手机可以这样配置 把…

CSS网页布局权威指南02 样式表内容

02 Stylesheet Contents CSS网页布局权威指南02 样式表内容 Inside a stylesheet, you’ll find a number of rules that look a little something like this: 在样式表中,你会发现许多规则看起来有点像这样: h1 {color: maroon;} body {background: yellow;}St…

【25考研】:四川大学计算机学院24届874考研考情分析

去年的考情分析也是我做的, 今年就在去年的基础上做了。保持形式不变,更改数据。 21考情: 万载月寒肠断客:四川大学计算机学院21届CS考研考情分析 22考情: 懒羊羊:四川大学计算机学院2022考研考情分析 2…

AI 论道|极狐GitLab 客户私享会上海站成功举办

3 月 22 日下午,极狐GitLab 在上海办公室举办了客户私享会,邀请了来自多个行业的多家客户,围绕 AI 提升研发效率的道法术器进行了充分交流。整个交流时长达两个多小时。 极狐GitLab 战略业务与区域发展副总裁何庆出席了此次活动并致开场辞。他…

图论做题笔记:dfs

Leetcode - 797:所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节…

【Python面试题收录】Python的可变对象与不可变对象

一、可变对象与不可变对象的定义 在Python中,对象的可变性是指对象的内部状态(值)是否允许在对象创建后发生改变。根据这一特性,Python的数据类型可以分为两大类:可变对象(mutable objects)和不…

数据结构——红黑树详解

一、红黑树的定义 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍&#xff0c…

基于Docker for Windows部署ChatGPT-Next-Web

基于Docker for Windows部署ChatGPT-Next-Web 项目地址安装Docker for Windows部署项目参数讲解参数示例 运行 项目地址 https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 安装Docker for Windows 官网地址:https://www.docker.com/ 下拉找到Download 选择W…

Java设计模式:代理模式的静态和动态之分(八)

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在软件设计中,代理模式是一种常用的设计模式,它为我们提供了一种方式来控制对原始对象的访问。在Java中&a…

文件操作的详序

1.为什么使用文件? 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到程序的数据的,如果将数据进行持久化的保存…

Linux 使用管理线程、多线程、分离线程

目录 一、使用线程 1、pthread_create创建线程 2、pthread_join等待线程 主线程获取新线程退出结果 获取新线程退出返回的数组 3、线程异常导致进程终止 4、pthread_exit 5、pthread_cancel 6、主线程可以取消新线程,新线程可以取消主线程吗 二、如何管理线…

59 使用 uqrcodejs 生成二维码

前言 这是一个最近的一个来自于朋友的需求, 然后做了一个 基于 uqrcodejs 来生成 二维码的一个 demo package.json 中增加以依赖 "uqrcodejs": "^4.0.7", 测试用例 <template><div class"hello"><canvas id"qrcode&qu…

信息系统项目管理师——第18章项目绩效域管理(一)

本章节内容属于第四版新增知识&#xff0c;为PMBOK第七版专有&#xff0c;选择、案例、论文都会考&#xff0c;属于比较重要的章节。 选择题&#xff0c;稳定考3分左右&#xff0c;新教材基本考课本原话&#xff0c;需要多读课本&#xff0c;多刷题。 案例题&#xff0c;考的概…