1、K-means算法原理
K-means算法是一种常用的聚类算法,其目的是将数据集划分为K个簇(clusters),使得每个簇内部的数据点尽可能相似,而簇与簇之间的数据点尽可能不同。以下是K-means算法的基本原理和步骤:
-
初始化:随机选择K个数据点作为初始的簇中心(centroids)。
-
分配:将每个数据点分配到最近的簇中心,形成K个簇。这里的“最近”通常是指欧氏距离最小。
-
更新:重新计算每个簇的中心,通常是簇内所有点的均值。
-
迭代:重复步骤2和3,直到簇中心不再发生显著变化,或者达到预设的迭代次数。
-
终止:当簇中心的变化小于某个阈值,或者达到最大迭代次数时,算法终止。
2、K-means算法的关键点包括:
-
K值的选择:K值的选择对算法的结果有很大影响,通常需要根据具体问题和数据集来确定。可以使用肘部法则(Elbow Method)来帮助选择K值。
-
初始化的敏感性:K-means算法对初始簇中心的选择比较敏感,不同的初始化可能导致不同的聚类结果。为了减少这种影响,可以采用K-means++算法来选择更好的初始簇中心。
-
局部最优解:K-means算法容易陷入局部最优解,即找到一个局部的簇中心配置,但可能不是全局最优的。可以通过多次运行算法,每次使用不同的初始簇中心,然后选择最佳结果来缓解这个问题。
-
数据的尺度:K-means算法对数据的尺度敏感,因此在应用K-means之前,通常需要对数据进行标准化处理。
3、代码
数据预处理
# 读取数据文件,这里假设数据文件是制表符分隔的文本文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')
# 选择数据集中的四列作为特征
x = beer[['calories', 'sodium', 'alcohol', 'cost']]
运用循环尝试不同的聚类数目
# 初始化一个空列表来存储轮廓系数
scores = []
# 遍历2到9的整数,尝试不同的聚类数目
for k in range(2, 10):
# 用KMeans算法进行聚类,n_clusters指定聚类数目,n_init指定初始化质心的次数
labels = KMeans(n_clusters=k, n_init='auto').fit(x).labels_
# 计算轮廓系数,用于评估聚类效果
score = metrics.silhouette_score(x, labels)
# 将计算得到的轮廓系数添加到scores列表中
scores.append(score)
使用KMeans算法进行2类聚类
# 使用KMeans算法进行2类聚类
label = KMeans(n_clusters=2, n_init='auto').fit(x).labels_
# 计算并打印2类聚类的轮廓系数
score = metrics.silhouette_score(x, label)
4、结果
5、完整代码
# 导入必要的库
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics
# 读取数据文件,这里假设数据文件是制表符分隔的文本文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')
# 选择数据集中的四列作为特征
x = beer[['calories', 'sodium', 'alcohol', 'cost']]
# 初始化一个空列表来存储轮廓系数
scores = []
# 遍历2到9的整数,尝试不同的聚类数目
for k in range(2, 10):
# 用KMeans算法进行聚类,n_clusters指定聚类数目,n_init指定初始化质心的次数
labels = KMeans(n_clusters=k, n_init='auto').fit(x).labels_
# 计算轮廓系数,用于评估聚类效果
score = metrics.silhouette_score(x, labels)
# 将计算得到的轮廓系数添加到scores列表中
scores.append(score)
# 打印不同聚类数目对应的轮廓系数
print(scores)
# 使用KMeans算法进行2类聚类
label = KMeans(n_clusters=2, n_init='auto').fit(x).labels_
# 计算并打印2类聚类的轮廓系数
score = metrics.silhouette_score(x, label)
print(score)