聚类是用于找出不带标签数据的相似性的算法。
译文链接:https://muxuezi.github.io/posts/6-clustering-with-k-means.html
1.K-Means算法
由于具有出色的速度和良好的可扩展性,K-Means聚类算法算得上是最著名的聚类方法。K-Means算
法是一个重复移动类中心点的过程,把类的中心点,也称重心(centroids),移动到其包含成员的平
均位置,然后重新划分其内部成员。 是算法计算出的超参数,表示类的数量;K-Means可以自动分
配样本到不同的类,但是不能决定究竟要分几个类。 必须是一个比训练集样本数小的正整数。
有时,类的数量是由问题内容指定的。也有一些问题没有指定聚类的数量,最优的聚类
数量是不确定的。后面我们会介绍一种启发式方法来估计最优聚类数量,称为肘部法则(Elbow
Method)。
K-Means的参数是类的重心位置和其内部观测值的位置。与广义线性模型和决策树类似,K-Means参
数的最优解也是以成本函数最小化为目标。K-Means成本函数公式如下:
是第 uk个类的重心位置。成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于
该类重心与其内部成员位置距离的平方和。若类内部的成员彼此间越紧凑则类的畸变程度越小,反
之,若类内部的成员彼此间越分散则类的畸变程度越大。求解成本函数最小化的参数就是一个重复配
置每个类包含的观测值,并不断移动类重心的过程。首先,类的重心是随机确定的位置。实际上,重
心位置等于随机选择的观测值的位置。每次迭代的时候,K-Means会把观测值分配到离它们最近的
类,然后把重心移动到该类全部成员位置的平均值那里。
应用例子:
import numpy as np from sklearn.cluster import KMeans from sklearn import metrics plt.figure(figsize=(8, 10)) plt.subplot(3, 2, 1) x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9]) x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3]) X = np.array(list(zip(x1, x2))).reshape(len(x1), 2) plt.xlim([0, 10]) plt.ylim([0, 10]) plt.title('样本',fontproperties=font) plt.scatter(x1, x2)
#接上面 plt.scatter(x1, x2) colors = ['b', 'g', 'r'] markers = ['o', 's', 'D'] t=3 kmeans_model = KMeans(n_clusters=3).fit(X) for i, l in enumerate(kmeans_model.labels_): plt.plot(x1[i], x2[i], color=colors[l],marker=markers[l],ls='None') plt.xlim([0, 10]) plt.ylim([0, 10]) plt.title('K = %s' %(t),fontproperties=font)
局部最优解:
K-Means的初始重心位置是随机选择的。有时,如果运气不好,随机选择的重心会导致K-Means陷入局部最优解。这些类可能没有实际意义,为了避免局部最优解,K-Means通常初始时要重复运行十几次甚至上百次。每次重复时,它会随机的从不同的位置开始初始化。最后把最小的成本函数对应的重心位置作为初始位位置。
2.K值确定:
肘部法则:
如果问题中没有指定 的值,可以通过肘部法则这一技术来估计聚类数量。肘部法则会把不同 值的
成本函数值画出来。随着 值的增大,平均畸变程度会减小;每个类包含的样本数会减少,于是样本
离其重心会更近。但是,随着 值继续增大,平均畸变程度的改善效果会不断减低。 值增大过程
中,畸变程度的改善效果下降幅度最大的位置对应的 值就是肘部。
import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"C:\Windows\Fonts\msyh.ttc", size=10) import numpy as np cluster1 = np.random.uniform(0.5, 1.5, (2, 10)) cluster2 = np.random.uniform(3.5, 4.5, (2, 10)) X = np.hstack((cluster1, cluster2)).T plt.figure() plt.axis([0, 5, 0, 5]) plt.grid(True) plt.plot(X[:,0],X[:,1],'k.');
计算 K值从1到10对应的平均畸变程度:
from sklearn.cluster import KMeans from scipy.spatial.distance import cdist K = range(1, 10) meandistortions = [] for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(X) meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0]) plt.plot(K, meandistortions, 'bx-') plt.xlabel('k') plt.ylabel('平均畸变程度',fontproperties=font) plt.title('用肘部法则来确定最佳的K值',fontproperties=font);
从图中可以看出K 值从1到2时,平均畸变程度变化最大。超过2以后,平均畸变程度变化显著降
低。因此肘部就是K=2 。
例子2:
import numpy as np x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9]) x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3]) X = np.array(list(zip(x1, x2))).reshape(len(x1), 2) plt.figure() plt.axis([0, 10, 0, 10]) plt.grid(True) plt.plot(X[:,0],X[:,1],'k.');
from sklearn.cluster import KMeans from scipy.spatial.distance import cdist K = range(1, 10) meandistortions = [] for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(X) meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0]) plt.plot(K, meandistortions, 'bx-') plt.xlabel('k') plt.ylabel('平均畸变程度',fontproperties=font) plt.title('用肘部法则来确定最佳的K值',fontproperties=font);
从图中可以看出,K值从1到3时,平均畸变程度变化最大。超过3以后,平均畸变程度变化显著降
低。因此肘部就是K=3。
3.聚类效果评估
K-Means是一种非监督学习,没有标签和其他信息来比较聚类结果。但是,还是有
一些指标可以评估算法的性能。已经介绍过类的畸变程度的度量方法。下面将介绍另一种聚类
算法效果评估方法称为轮廓系数(Silhouette Coefficient)。轮廓系数是类的密集与分散程度的评价
指标。它会随着类的规模增大而增大。彼此相距很远,本身很密集的类,其轮廓系数较大,彼此集
中,本身很大的类,其轮廓系数较小。轮廓系数是通过所有样本计算出来的,计算每个样本分数的均
值,计算公式如下:
a是每一个类中样本彼此距离的均值, b是一个类中样本与其最近的那个类的所有样本的距离的均
值。下面的例子运行四次K-Means,从一个数据集中分别创建2,3,4,8个类,然后分别计算它们
的轮廓系数。
import numpy as np from sklearn.cluster import KMeans from sklearn import metrics plt.figure(figsize=(8, 10)) plt.subplot(3, 2, 1) x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9]) x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3]) X = np.array(list(zip(x1, x2))).reshape(len(x1), 2) plt.xlim([0, 10]) plt.ylim([0, 10]) plt.title('样本',fontproperties=font) plt.scatter(x1, x2) colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b'] markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+'] tests = [2, 3, 4, 5, 8] subplot_counter = 1 for t in tests: subplot_counter += 1 plt.subplot(3, 2, subplot_counter) kmeans_model = KMeans(n_clusters=t).fit(X) for i, l in enumerate(kmeans_model.labels_): plt.plot(x1[i], x2[i], color=colors[l],marker=markers[l],ls='None') plt.xlim([0, 10]) plt.ylim([0, 10]) plt.title('K = %s, 轮廓系数 = %.03f' % (t,metrics.silhouette_score(X,kmeans_model.labels_,metric='euclidean')),fontproperties=font)
很显然,这个数据集包括三个类。在K=3的时候轮廓系数是最大的。在K=8的时候,每个类的
样本不仅彼此很接近,而且与其他类的样本也非常接近,因此这时轮廓系数是最小的。
相关推荐
上述代码是利用python内置的k-means聚类算法对鸢尾花数据的聚类效果展示,注意在运行该代码时需要采用pip或者其他方式为自己的python安装sklearn以及iris扩展包,其中X = iris.data[:]表示我们采用了鸢尾花数据的四...
python实现k-means聚类,利用的库有numpy sklearn,利用matplot绘图
基于python的k-means聚类算法的实现代码,不是调用sklearn库的实现方式,步骤清晰且比较详细!如有错误,欢迎批评指出,谢谢!
本程序是在python中完成,基于sklearn.cluster中的k-means聚类包来实现数据的聚类,对于里面使用的数据格式如下:(注意更改程序中的相关参数) 138 0 124 1 127 2 129 3 119 4 127 5 124 6 120 7 123 8 147 9 188 ...
模糊C均值算法类型:聚类算法使用的数据集:虹膜数据集要求: Google colab或jupyter笔记本套餐: 熊猫-https: numpy- //numpy.org/install/ Matplotlib- //matplotlib.org/stable/users/installing.html sklearn- /...
K-means算法是一种无监督学习算法,用于将数据集划分为K个簇。K-means2是K-means的一个改进版本,DBSCAN是一种基于密度的聚类算法。这里是这些算法的python代码实现
K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下: 1、 随机选取k个聚类质心点(cluster centroids)为 2、 重复下面过程直到收敛,对于每一个样例i,计算其应该属于的类 对于每一个类j,重新计算该...
Python实现K-Means聚类后的三维可视化,使用的是生成数据,编译器为jupyter notebook 简单便捷,易于理解 使用库:pandas ,numpy ,sklearn,matplotlib,mpl_toolkits
各位读者好,在这片文章中我们尝试使用sklearn库比较k-means聚类算法和主成分分析(PCA)在图像压缩上的实现和结果。 压缩图像的效果通过占用的减少比例以及和原始图像的差异大小来评估。 图像压缩的目的是在保持与...
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。 使用场景:通用聚类方法,用于均匀的簇大小,簇的数量不多的...
"使用k-means算法的图像像素聚类和可视化" 是一项基于Python语言的图像处理工作,旨在通过应用k-means算法对图像的像素进行聚类,并通过可视化技术将聚类结果呈现出来。通过使用sklearn库中的KMeans算法,工作者可以...
数据挖掘 | [无监督学习——聚类] K-means聚类及python代码实现——利用sklearn 数据挖掘 | [无监督学习——聚类] 凝聚层次聚类及python代码实现——利用sklearn 决策树的定义 决策树,又称判定树,是一种类似于流程...
python sklearn机器学习库中对SVM的API SVM 线性SVM分类器,运用简单的SMO算法进行加速。 决策树 用于离散数据分类的决策树 聚类 K-means聚类 通过自定义的K-means算法,对鸢尾花数据集进行聚类,并将真实标签与聚类...
2.项目运行环境:Python 环境、Pycharm 环境与相关库(matplotlib/sklearn)下载。 3.项目包括3个模块:数据爬取、新闻处理与聚类、新闻推荐。其中可爬取指定新闻网站、指定日期新闻并保存在指定的系统目录文件夹下...
在Python中,有许多聚类算法可供选择,如K-Means、层次聚类等等。本文将展示Python中聚类算法的效果图,让您更好地了解不同聚类算法之间的差异和应用场景。 下面是使用K-Means算法实现的聚类效果图。 ``` # 导入...
“ k-Means聚类背后的想法是获取一堆数据并确定数据中是否存在任何自然聚类(相关对象的组)。 k-Means算法是所谓的无监督学习算法。 我们事先不知道数据中存在什么模式-它没有形式分类-但我们想知道是否可以将数据...
介绍无监督学习与聚类算法,分别介绍了基于原型的技术的K-Means和基于密度的聚类算法的DBSCAN,分别讲明了他们的原理并在sklearn库使用python进行演示,介绍了一些重要参数并加以说明。
Python实现K-Means聚类后的二维可视化,使用的是生成数据,编译器为jupyter notebook 简单便捷,易于理解 使用库:pandas ,numpy ,sklearn,matplotlib,seaborn
Python实现K-Means聚类后的三维可视化,使用的是生成数据,使用T-SNE降维,编译器为jupyter notebook 简单便捷,易于理解 使用库:pandas ,numpy ,sklearn,matplotlib,mpl_toolkits