K均值聚类是一种常用的无监督机器学习算法,主要用于将数据样本划分为不同的类别或簇。具体来说,它旨在将n个样本分成k个不相交的类,使得每个样本到其所属类中心的距离最小化。每个样本只能归属于一个类。我们用C来表示这种划分,它实际上是一个将样本映射到类别的函数。
K均值聚类的目标是通过最小化损失函数来选择最优的划分。这个损失函数定义了所有样本到其所属类中心的距离总和。首先,计算样本间的距离,这里通常采用欧氏距离的平方作为衡量标准。然后,定义一个损失函数,该函数衡量的是所有样本与其所属类中心之间的距离总和。其中,μ_l代表第l个类的均值或中心,而I是一个指示函数,它的取值为1或0,用于判断样本是否属于某一类。
K均值聚类算法是一个迭代过程,主要包含两个步骤:
初始化中心值:首先,根据给定的初始中心值,计算出最佳的划分C,使得样本与类中心之间的距离总和最小化。这意味着,在类中心已知的情况下,将样本分配到最近的类中,从而使得距离总和最小化。
重新计算中心:接着,对于给定的划分C,重新计算每个类的中心,使得样本与类中心之间的距离总和再次达到最小化。这一过程不断重复,直到划分不再发生变化。
通过这两个步骤的迭代,算法能够逐步优化分类效果,最终达到最优的聚类结果。
下面是一个简单的K均值聚类算法实现示例:
```python import numpy as np
def kMeans(dataSet, k): m = dataSet.shape[0] # 获取数据集的行数
# 创建一个与数据集行数相同的数据结构,存储每个样本的聚类中心和距离
ClustDist = np.zeros((m, 2))
# 随机生成聚类中心
clustercents = randCenters(dataSet, k)
flag = True # 初始化标志位,用于控制迭代
while flag:
flag = False # 预设标志位为False
# 计算数据集中每个样本到聚类中心的最小距离
for i in range(m):
distlist = [distEclud(clustercents[j, :], dataSet[i, :]) for j in range(k)]
minDist = min(distlist)
minIndex = distlist.index(minDist)
if ClustDist[i, 0] != minIndex: # 如果找到新的聚类中心
flag = True # 重置标志位为True,继续迭代
# 更新ClustDist中的数据
ClustDist[i, :] = minIndex, minDist
# 更新聚类中心
for cent in range(k):
dInx = np.nonzero(ClustDist[:, 0] == cent)[0]
ptsInClust = dataSet[dInx]
clustercents[cent, :] = np.mean(ptsInClust, axis=0)
return clustercents, ClustDist
```
通过上述步骤和代码,我们可以有效地应用K均值聚类算法,实现数据样本的有效分类。