100天搞定机器学习|day44 k均值聚类数学推导与python完成
作者头像
  • 马莫回聊科技
  • 2019-11-22 20:27:06 5

如何正确应用“K均值聚类”?

K均值聚类是一种常用的无监督机器学习算法,主要用于将数据样本划分为不同的类别或簇。具体来说,它旨在将n个样本分成k个不相交的类,使得每个样本到其所属类中心的距离最小化。每个样本只能归属于一个类。我们用C来表示这种划分,它实际上是一个将样本映射到类别的函数。

K均值聚类的策略

K均值聚类的目标是通过最小化损失函数来选择最优的划分。这个损失函数定义了所有样本到其所属类中心的距离总和。首先,计算样本间的距离,这里通常采用欧氏距离的平方作为衡量标准。然后,定义一个损失函数,该函数衡量的是所有样本与其所属类中心之间的距离总和。其中,μ_l代表第l个类的均值或中心,而I是一个指示函数,它的取值为1或0,用于判断样本是否属于某一类。

K均值聚类的算法

K均值聚类算法是一个迭代过程,主要包含两个步骤:

  1. 初始化中心值:首先,根据给定的初始中心值,计算出最佳的划分C,使得样本与类中心之间的距离总和最小化。这意味着,在类中心已知的情况下,将样本分配到最近的类中,从而使得距离总和最小化。

  2. 重新计算中心:接着,对于给定的划分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均值聚类算法,实现数据样本的有效分类。

    本文来源:图灵汇
责任编辑: : 马莫回聊科技
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
均值推导搞定机器完成数学python学习day44100
    下一篇