算法笔记(4)-K-Means聚类算法及python代码实现

K-Means算法也被称为K-平均或K-均值算法,是一种广泛使用的聚类算法。K-Means算法是基于相似性的无监督的算法,通过比较样本之间的相似性,将较为相似的样本划分到同一类别中。

算法笔记(4)-K-Means聚类算法及python代码实现_第1张图片

K-Means算法步骤:


(1)初始化常数K,随机初始化K个聚类中心;
(2)重复计算以下过程,直到聚类中心不再改变;
        a.计算每个样本与每个聚类中心之间的相似度,将样本划分到最相似的类别
          中;
        b.计算划分到每个类别中的所有样本特征的均值,并将该均值作为每个类新的
           聚类中心。
(3)输出最终的聚类中心以及每个样本所属的类别。


K-Means算法python代码实现

def kmeans(data, k, centroids):
    '''根据KMeans算法求解聚类中心
    input:  data(mat):训练数据
            k(int):类别个数
            centroids(mat):随机初始化的聚类中心
    output: centroids(mat):训练完成的聚类中心
            subCenter(mat):每一个样本所属的类别
    '''
    m, n = np.shape(data) # m:样本的个数,n:特征的维度
    subCenter = np.mat(np.zeros((m, 2)))  # 初始化每一个样本所属的类别
    change = True  # 判断是否需要重新计算聚类中心
    while change == True:
        change = False  # 重置
        for i in range(m):
            minDist = np.inf  # 设置样本与聚类中心之间的最小的距离,初始值为正无穷
            minIndex = 0  # 所属的类别
            for j in range(k):
                # 计算i和每个聚类中心之间的距离
                dist = distance(data[i, ], centroids[j, ])
                if dist < minDist:
                    minDist = dist
                    minIndex = j
            # 判断是否需要改变
            if subCenter[i, 0] != minIndex:  # 需要改变
                change = True
                subCenter[i, ] = np.mat([minIndex, minDist])
        # 重新计算聚类中心
        for j in range(k):
            sum_all = np.mat(np.zeros((1, n)))
            r = 0  # 每个类别中的样本的个数
            for i in range(m):
                if subCenter[i, 0] == j:  # 计算第j个类别
                    sum_all += data[i, ]
                    r += 1
            for z in range(n):
                try:
                    centroids[j, z] = sum_all[0, z] / r
                except:
                    print(" r is zero")
    return subCenter

 在机器学习算法中使用的距离函数主要有:

算法笔记(4)-K-Means聚类算法及python代码实现_第2张图片

闵可夫斯基距离

算法笔记(4)-K-Means聚类算法及python代码实现_第3张图片 

曼哈顿距离

算法笔记(4)-K-Means聚类算法及python代码实现_第4张图片

欧式距离 

每天专注分享大数据和人工智能技术,欢迎大家关注! 

你可能感兴趣的:(python,算法,人工智能,聚类,算法,python)