K-means算法的入门及心得体会

K-means 算法
K-means算法是经典的聚类算法之一。该算法假设每个簇由具有连续特征的相似点构成,可以用相似的质心(平均值)或中心点(最有代表性的点或使用与所有其他点的距离最小的点)来表示。


1.K-means算法的简要步骤
(1)随机选取K个样本点作为初始的质心。
(2)将其余的样本点分配给距离最近的质心,即将样本点分配到一个簇中(簇内所有点的中心表示为质心)。
(3)重新计算每个簇的质心,将其更新为该簇所有点的平均值。
(4)重复步骤(2)和(3)。
(5)直到聚类中心不再发生变化时或者到达最大迭代次数时。


2. K-means算法的优点
(1)算法逻辑简单,易于理解,较为高效。
(2)在处理大数据集时,该算法具有相对的可伸缩和高效率。该算法有两个收敛条件,当数据集过大,达到最大迭代次数时就会停止迭代以获取局部最优解。
(3)应对密集、球状数据集时有着更为突出的效果。


3. K-means算法的缺点
(1)需要手动设定K值,聚类性能对K值大小敏感。
(2)对离群点和噪声点敏感。当数据集存在离群点或噪声点时,噪声点可能会自成一类,会影响最终的聚类。
(3)只能用于凸数据集。所谓的凸数据集,是指集合内的每一对点,连接两个点的直线段上的每个点也在该集合内。当然,也有研究通过拓展距离等方法来解决此类问题。
import numpy as np
import matplotlib.pyplot as plt

一、初始聚类中心
随机选择集合里的一个元素作为第一个聚类中心放入容器,选择距离第一个聚类中心最远的一个元素作为第二个聚类中心放入容器,第三、四、、、N个同理,为了优化可以选择距离开方做为评判标准

二、迭代聚类n次
依次把集合里的元素与距离最近的聚类中心分为一类,放到这个聚类中心的新容器内,每次聚类分析完成后求出新容器里个类的平均值,对该类对应的聚类中心进行更新,再次进行聚类操作,迭代n次,最后得到理想的结果

三、可视化展示
利用 python 第三方库中的可视化工具 matplotlib.pyplot 对聚类后的元素显示(散点图),并给每一簇赋予不同的颜色

 

 

import numpy as np
import matplotlib.pyplot as plt
def distance(e1, e2):
    return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)
def means(arr):
    return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])
def farthest(k_arr, arr):
    f = [0, 0]
    max_d = 0
    for e in arr:
        d = 0
        for i in range(k_arr.__len__()):
            d = d + np.sqrt(distance(k_arr[i], e))
        if d > max_d:
            max_d = d
            f = e
    return f
def closest(a, arr):
    c = arr[1]
    min_d = distance(a, arr[1])
    arr = arr[1:]
    for e in arr:
        d = distance(a, e)
        if d < min_d:
            min_d = d
            c = e
    return c
if __name__=="__main__":
    arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :]
    m = 5
    r = np.random.randint(arr.__len__() - 1)
    k_arr = np.array([arr[r]])
    cla_arr = [[]]
    for i in range(m-1):
        k = farthest(k_arr, arr)
        k_arr = np.concatenate([k_arr, np.array([k])])
        cla_arr.append([])
    n = 20
    cla_temp = cla_arr
    for i in range(n):   
        for e in arr: 
            ki = 0     
            min_d = distance(e, k_arr[ki])
            for j in range(1, k_arr.__len__()):
                if distance(e, k_arr[j]) < min_d:   
                    min_d = distance(e, k_arr[j])
                    ki = j
            cla_temp[ki].append(e)
        for k in range(k_arr.__len__()):
            if n - 1 == i:
                break
            k_arr[k] = means(cla_temp[k])
            cla_temp[k] = []
    col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
    for i in range(m):
        plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
        plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
    plt.show()

K-means算法的入门及心得体会_第1张图片

 

你可能感兴趣的:(算法,kmeans,聚类)