聚类算法是将相似数据分组在一起的过程,属于无监督学习的一种,即输入数据没有标签响应。聚类算法在金融、医疗和电子商务等多个领域都有应用。例如,在电子商务中,可以根据顾客的购买习惯将相似的客户群体分组,以便提供优惠或折扣。
在聚类中,每个数据点都属于某个聚类,但单个数据点不能同时存在于多个聚类中。聚类算法的性能可以通过诸如Dunn指数(DI)等指标来衡量。DI值较高的聚类具有较大的类间距离(良好分离)和较小的类内距离(紧凑)。
根据数据集的不同,可以采用不同的聚类方法,如基于质心的聚类、层次聚类/基于连接的聚类和基于密度的聚类。本文将重点介绍基于质心的聚类。
K均值算法是众多基于质心的聚类算法之一。这里的K代表聚类的数量,是算法的一个超参数。算法的核心思想是找到K个质心,然后根据点与质心的接近程度将点分组,使得聚类中点到质心的平方距离之和最小化。这是一个非常困难的优化问题,因此通常使用近似方法来解决。Lloyd算法就是这样一种近似方法,其实现如下:
然而,这种实现方式存在初始化敏感性问题。在初始化阶段选择不同的质心会导致生成不同的聚类。解决这个问题的方法是多次重复K均值算法,并选择最佳结果。
除了随机初始化外,还可以使用智能初始化过程,如K均值++算法。在某些情况下,质心难以解释,例如处理文本数据时,质心就无法解释。解决这个问题的方法是使用K中值算法。它会选择数据中最中心的成员作为聚类中心,并且通常比其他方法更能抵抗异常值。
可能会好奇如何选择K的最佳值。肘部法则或膝盖法则用于确定最佳K值。尝试对多个K值实施K均值算法,并将它们与质心的平方距离之和(损失函数)作图。曲线的肘部(明显弯曲处)被选为最优K值。
下面是一个K均值算法的代码示例。将使用sklearn库中的K均值实现这个示例。
from sklearn.datasets import make_blobs
from matplotlib import pyplot
from pandas import DataFrame
# 生成数据集
X, y = make_blobs(n_samples=100, n_features=2)
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue', 2:'green'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
# 绘制数据点
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
# 打印数据框和列名
print(df)
print("Columns \n\n")
print(df.columns)
df_X = df[['x','y']]
df_X
# 导入K均值聚类库
import sklearn.cluster
kmeans = sklearn.cluster.KMeans(n_clusters=3, init='k-means++', random_state=0).fit(df_X)
# 打印聚类中心和标签
print("\n\n 聚类中心: \n\n ")
print(kmeans.cluster_centers_)
print("\n\n 标签")
print(kmeans.labels_)