一、K-Means简介
k-means算法是一种常用的聚类算法,用于将数据点分成k个不重叠的簇。该算法的核心思想是通过迭代的方式将数据点逐步分配给最接近的簇中心,并更新簇中心以得到更好的聚类结果。
二、推导过程
这里只是简单推导,帮助理解,详情可见:K-Means聚类算法原理(可视化超详细)
1、假设有随机的一些点:

2、我们想把他们分成三类,就随机取三个点作为簇中心点,根据每个点与我们随机取的三个点之间距离的远近,我们可以初步的把它们分成三类。

3、我们再计算每一类所有点的横坐标与纵坐标分别求出它们的均值,所得的坐标做为第一次迭代后簇中心点的坐标:

4、根据每个点与三个簇中心点之间的远近,重新划分成三类

5、重复上述操作,找出新的簇中心点:

6、继续重复上述操作,直至簇中心点的位置不在变化,我们就得到了准确划分的三类数据:

三、主要参数
-
n_clusters(簇的数量):确定要将数据分成多少个簇或类别。这是k-means算法的必要参数,默认值通常为8。
-
init(初始化方法):用于选择初始簇中心的方法。可选的初始化方法包括:
'k-means++':使用一种特殊的方法选取初始质心,有助于加速算法的收敛。'random':从训练数据中随机选择初始簇中心。- 自定义的质心数组:您可以提供一个形状为
(n_clusters, n_features)的数组,手动指定初始簇中心。
-
n_init(初始化次数):指定运行k-means算法的初始化次数。每次初始化都使用不同的随机初始质心,以避免局部最小值。默认值通常为10次。
这些是k-means算法的一些主要参数。除了上述参数之外,还有其他参数可以调整,例如:
-
max_iter(最大迭代次数):控制算法运行的最大迭代次数。如果在达到最大迭代次数之前收敛了,算法将提前停止。
-
tol(停止阈值):当簇中心的变化小于此阈值时,算法将提前停止。这可以帮助节省计算时间。
-
random_state(随机种子):用于初始化的随机数种子,可以用来确保结果的可重复性。
-
algorithm(计算距离的算法):用于计算数据点之间距离的算法。可以选择
'auto'、'full'或'elkan'等。 -
verbose(详细程度):控制算法输出的详细程度,通常是一个整数,用于调整输出信息的级别。
四、代码实例
这里有一组数据:data.txt(可自行下载)

1、导入所需库:
from sklearn.cluster import KMeans
import pandas as pd
from sklearn import metrics
sklearn.cluster.KMeans:scikit-learn 库中的 K-Means 聚类算法实现。pandas:用于数据处理和读取数据的库。sklearn.metrics:包含用于聚类评估的函数,如 Silhouette 分数。
2、读取数据:
beer = pd.read_table('data.txt', encoding='utf8', engine='python', sep=' ')
pd.read_table:使用 pandas 读取名为 'data.txt' 的数据文件。encoding='utf8':指定文件编码为 UTF-8。engine='python':指定解析引擎为 Python。sep=' ':指定数据文件中的分隔符为空格,用于将数据拆分成不同的列。
3、选择特征:
x = beer[['calories', 'sodium', 'alcohol', 'cost']]
从数据集中选择包含特征的列,这里选择了 'calories'、'sodium'、'alcohol' 和 'cost' 列作为特征。
4、执行 K-Means 聚类:
km = KMeans(n_clusters=2).fit(x)
KMeans(n_clusters=2):创建一个 K-Means 聚类模型,其中n_clusters参数设置为 2,表示要将数据分为两个簇。fit(x):将数据x进行聚类,模型现在包含簇标签。
5、添加簇标签到数据:
beer['cluster'] = km.labels_
将 K-Means 聚类的结果(簇标签)添加到原始数据集中的一个新列 'cluster' 中。
6、计算 Silhouette 分数:
score = metrics.silhouette_score(x, beer.cluster)
metrics.silhouette_score(x, beer.cluster):计算 Silhouette 分数,用于评估聚类的质量。x是特征矩阵,beer.cluster是聚类结果,它告诉每个样本属于哪个簇。
7、打印 Silhouette 分数:
print(score)
打印 Silhouette 分数,以评估 K-Means 聚类的质量。Silhouette 分数的取值范围在 -1 到 1 之间,分数越接近 1 表示聚类质量越好。
8、完整代码展示
from sklearn.cluster import KMeans
import pandas as pd
from sklearn import metrics
beer=pd.read_table('data.txt',encoding='utf8',engine='python',sep=' ')
x=beer[['calories','sodium','alcohol','cost']]
km=KMeans(n_clusters=2).fit(x)
beer['cluster']=km.labels_
score=metrics.silhouette_score(x,beer.cluster)
print(score)
9、运行结果

本文介绍了K-Means聚类算法的基本概念、推导过程,重点讲解了关键参数如n_clusters和初始化方法,并给出了Python代码示例,演示了如何使用sklearn库进行啤酒数据的聚类分析。
5万+

被折叠的 条评论
为什么被折叠?



