K均值聚类

K-均值聚类算法

1. 什么是K均值聚类算法

K均值聚类(k-means)是基于样本集合划分的聚类算法。K均值聚类将样本集合划分为k个子集,构成k个类,将n个样本分到k个类中,每个样本到其所属类的中心距离最小,每个样本仅属于一个类,这就是k均值聚类,同时根据一个样本仅属于一个类,也表示了k均值聚类是一种硬聚类算法。

2:K均值聚类算法的过程

2.1 k均值聚类的算法过程

输入:n个样本的集合

输出:样本集合的聚类

过程:

(1)初始化。随机选择k的样本作为初始聚类的中心。

(2)对样本进行聚类。针对初始化时选择的聚类中心,计算所有样本到每个中心的距离,默认欧式距离,将每个样本聚集到与其最近的中心的类中,构成聚类结果。

(3)计算聚类后的类中心,计算每个类的质心,即每个类中样本的均值,作为新的类中心。

(4)然后重新执行步骤(2)(3),直到聚类结果不再发生改变。

K均值聚类算法的时间复杂度是O(nmk),n表示样本个数,m表示样本维数,k表示类别个数。
K均值聚类算法流程图

3:K均值聚类算法的习题
3.1 例题

五个样本的集合,使用K均值聚类算法,将五个样本聚于两类,五个样本分别是(0,2)(0,0)(1,0)(5,0)(5,2)。

例题图示

3.2 初始化

初始化。随机选择2个样本作为初始聚类的中心。
初始化聚类中心

3.3 聚类

对样本进行聚类。计算每个样本距离每个中心的距离,将每个样本聚集到与其最近的中心的类中,构成两类。
根据距离判定属于红色的中心点
相同的方法对剩余两个点进行聚类,结果如下:
第一次聚类结果

3.4 寻找新的类中心

计算新的类中心。对新的类计算样本的均值,作为新的类中心。
新的中心点

3.5 再次聚类

对样本进行聚类。计算每个样本距离每个中心的距离,将每个样本聚集到与其最近的中心的类中,构成新的类。
根据距离判定属于蓝色的中心点
使用相同的方法对其余四个点进行聚类,结果如下:
第二次聚类结果

3.6 结果

第二次聚类结果与第一次聚类结果相同,则聚类停止。得到最终的结果。

3.7 例题

若选择不同的初识聚类中心,会出现什么结果。初始化聚类中心
选择不同的初始中心,会得到不同的聚类结果。

4:K均值聚类算法的实现

4.1 K均值聚类算法

导入聚类库:

from sklearn.cluster import KMeans

聚类语法:

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')

参数解释:

  • n_clusters:簇的个数,即你想聚成几类
  • init: 初始簇中心的获取方法
  • n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果。
  • max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
  • tol: 容忍度,即kmeans运行准则收敛的条件
  • precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
  • verbose: 冗长模式
  • random_state: 随机生成簇中心的状态条件。
  • copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
  • n_jobs: 并行设置
  • algorithm: kmeans的实现算法,有:‘auto’, ‘full’, ‘elkan’, 其中 'full’表示用EM方式实现

属性:

  • cluster_centers_:聚类中心点
  • labels_:每个样本所属的聚类标签
  • inertia_:样本到其最近的聚类中心的平方距离的总和
  • n_iter_:运行的迭代次数

方法:

  • fit(X[,y]):训练样本
  • fit_predict(X[,y]):计算聚类中心并预测每个样本的聚类索引
  • fit_transform(X[,y]):计算聚类并将X转换为聚类距离空间
  • predict(X):预测X中每个样本所属的最近簇。
4.2 对鸢尾花数据进行聚类
# 导入所需要的库,绘图库,numpy库,sklearn机器学习库内的数据集,聚类,划分数据集方法
import matplotlib.pyplot as plt  
import numpy as np  
from sklearn.cluster import KMeans
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris 

iris=load_iris()   # 导入鸢尾花数据集
X = iris.data[:, 2:4] ##表示我们只取特征空间中的后两个维度
y = iris.target     # 将鸢尾花的标签赋值给y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  # 划分鸢尾花数据集,其中训练集占70%,测试集占30%
#绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='iris')  
plt.xlabel('petal length')  
plt.ylabel('petal width')  
plt.legend(loc=2)  
plt.show()  
estimator = KMeans(n_clusters=3) # 构造聚类器,将样本聚于3类
estimator.fit(X_train)     # 开始聚类
label_pred = estimator.labels_   # 获取聚类标签
print(estimator.cluster_centers_)   # 获取聚类中心点
#绘制k-means结果,将训练集聚类后的结果绘图展示,三种颜色表示三类,红色表示第一类,绿色表示第二类,蓝色表示第三类
x0 = X_train[label_pred == 0]
x1 = X_train[label_pred == 1]
x2 = X_train[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')  
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')  
plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='label2')  
plt.xlabel('petal length')       # 坐标轴属性
plt.ylabel('petal width')  
plt.legend(loc=2)  
plt.show()
print(estimator.predict(X_test))    # 使用训练出的KMeans模型预测测试集中的数据属于哪一类
#绘制k-means预测结果,将测试集集聚类后的结果绘图展示,三种颜色表示三类,橘色表示第一类,天蓝色表示第二类,蓝绿色表示第三类。
predict_0=X_test[estimator.predict(X_test) == 0]
predict_1=X_test[estimator.predict(X_test) == 1]
predict_2=X_test[estimator.predict(X_test) == 2]
plt.scatter(predict_0[:, 0], predict_0[:, 1], c = "tomato", marker='o', label='predict0')  
plt.scatter(predict_1[:, 0], predict_1[:, 1], c = "skyblue", marker='*', label='predict1')  
plt.scatter(predict_2[:, 0], predict_2[:, 1], c = "greenyellow", marker='+', label='predict2')  
plt.xlabel('petal length')  
plt.ylabel('petal width')  
plt.legend(loc=2)  
plt.show()

程序结果

  • 127
    点赞
  • 771
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: k均值聚类是一种常用的无监督学习算法,常用于将数据集划分为K个不同的类别。在Matlab中,可以利用k均值聚类算法对数据进行分析和聚类。 首先,需要在Matlab中加载数据集。可以使用Matlab内置的函数`load`或者`readtable`来读取数据。读取之后,应该对数据进行预处理,包括数据归一化和特征选择。 接下来,需要指定k值(即聚类的数目)。k值的选择可以通过试验和结果评估来确定。一般而言,可以通过使用一些启发式方法(如肘部法则或轮廓系数)来估计最佳的k值。 然后,可以使用Matlab内置的`kmeans`函数进行聚类。`kmeans`函数需要传入数据集和k值作为参数。此外,还可以指定其他选项,例如迭代次数、初始聚类中心等。 聚类完成后,可以通过可视化或其他方法来分析聚类结果。Matlab提供了许多可视化工具和函数,例如`scatter`、`plot`和`gscatter`等,它们可以帮助我们更好地理解聚类结果。 最后,对于聚类结果的评估,可以使用一些指标来度量聚类质量,如轮廓系数、互信息等。这些指标可以帮助我们了解聚类的效果,并与其他聚类算法进行比较。 总之,Matlab提供了丰富的函数和工具来支持k均值聚类。结合数据预处理、聚类算法、可视化和评估方法,我们可以在Matlab中进行有效的K均值聚类分析。但是需要注意的是,选择合适的k值和评估指标是进行聚类分析的关键,需要根据具体问题进行调整和选择。 ### 回答2: k均值聚类是一种常用的无监督机器学习算法,用于将数据集划分为k个不同的类别。在Matlab中,可以使用相关的工具箱或编写自定义代码来实现k均值聚类。 首先,需要确定聚类的数量k。然后,选择一组初始的聚类中心点。接下来的步骤是迭代地执行以下两个过程,直到收敛为止: 1. 分配阶段:计算每个数据点与k个聚类中心之间的距离,并将数据点分配给距离最近的聚类中心。 2. 更新阶段:根据分配结果,重新计算每个聚类的中心。这可以通过计算每个聚类中所有数据点的平均值来完成。 在Matlab中,可以使用kmeans函数来执行k均值聚类。该函数的输入参数包括数据集、聚类数量k和一些可选参数,如迭代次数和重复次数。调用kmeans函数后,它将返回聚类标签和聚类中心的坐标。 以下是一个简单的示例,展示如何使用Matlab进行k均值聚类: ```matlab % 载入数据集 load('data.mat'); % 设置聚类数量 k = 3; % 执行k均值聚类 [idx, centers] = kmeans(data, k); % 绘制聚类结果 figure; gscatter(data(:,1), data(:,2), idx); hold on; plot(centers(:,1), centers(:,2), 'k*', 'MarkerSize', 10); hold off; ``` 上述代码中,我们首先加载了一个名为'data.mat'的数据集。然后,我们设置聚类数量为3,调用kmeans函数执行k均值聚类。最后,我们使用gscatter函数将聚类结果绘制在图像上,并以星号标记表示聚类中心。 通过使用Matlab中的k均值聚类函数,我们可以轻松地进行聚类分析,并对数据集进行分类。 ### 回答3: k均值聚类是一种常用的聚类算法,主要用于将一组数据点按照其相似度划分为k个类别。Matlab是一个功能强大的数值计算和科学数据可视化软件,提供了丰富的工具和函数支持k均值聚类。 在Matlab中,可以使用k均值聚类函数kmeans实现聚类分析。该函数的基本语法如下: [idx, C] = kmeans(X, k) 其中,X是包含数据点的n×m矩阵,n表示样本数,m表示特征数;k表示要划分的类别数;idx是一个n×1的向量,表示每个数据点所属的类别;C是一个k×m的矩阵,表示每个类别的质心。 使用kmeans函数进行k均值聚类的步骤如下: 1. 准备数据:将要聚类的数据整理成n×m的矩阵X,确保每个样本的特征在一行内连续排列。 2. 设置k:决定要分为多少个类别。 3. 聚类分析:调用kmeans函数进行聚类分析,将数据矩阵X和类别数k作为输入参数。函数会返回每个数据点的类别和每个类别的质心。 4. 结果分析:根据idx和C的结果对数据进行分析。idx向量表示每个数据点所属的类别,C矩阵表示每个类别的质心。 5. 结果可视化:可以使用Matlab的图形绘制功能对聚类结果进行可视化展示。 需要注意的是,k均值聚类算法对初始质心的选择较为敏感,初步聚类结果可能存在局部最优解。为了得到较好的聚类结果,可以多次运行算法,选取效果最佳的结果。 总之,Matlab提供了方便的k均值聚类函数,可以帮助用户进行数据的聚类分析,并且通过图形化展示结果,更好地理解数据的特征和分类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值