k-means聚类分析

已知如下数据,对表中数据点运用K-means方法进行聚类分析

XY
P100
P212
P331
P488
P5910
P6107
  1. 选取初值k=2,也就是p1和p2俩点。
  2. 计算距离:

    P1P2
    P33.162282.23607
    P411.31379.21954
    P513.453611.3137
    P612.206610.2956

    我们发现所有点离p2更近一些,于是重新分组。

    A:P1

    B:P2、P3、P4、P5、P6

    在B组中找新的质心P7,A就一个,不用动。

    P7((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)

    重新计算距离:

    P1P7
    P22.246.3246
    P33.165.6036
    P411.33
    P513.55.2154
    P612.24.0497

    根据距离重新分组:

    A:P1、P2、P3

    B:P4、P5、P6

    重新计算质心P8、P9

    P8(1.33,1)P9(9,8.33)

    重新计算距离:

    P8P9
    P11.412
    P20.610
    P31.49.5
    P4471.1
    P5701.7
    P6561.7

    根据距离重新分组:

    A:P1、P2、P3

    B:P4、P5、P6

    聚类不再变化,结束。

    k-means聚类分析西瓜的密度与含糖率

    第一部分:数据集

    X表示二维矩阵数据,表示西瓜密度和含糖率
    总共30行,每行两列数据
    第一列表示西瓜密度:x1
    第二列表示西瓜含糖率:x2

    from sklearn.cluster import Birch  # 从sklearn.cluster机器学习聚类包中导入Birch聚类
    from sklearn.cluster import KMeans  # 从sklearn.cluster机器学习聚类包中导入KMeans聚类
    X=[
        [0.697,0.460],[0.774,0.376],[0.634,0.264],[0.608,0.318],[0.556,0.215],
        [0.403,0.237],[0.481,0.149],[0.437,0.211],[0.666,0.091],[0.243,0.267],
        [0.245,0.057],[0.343,0.099],[0.639,0.161],[0.657,0.198],[0.360,0.370],
        [0.593,0.042],[0.719,0.103],[0.359,0.188],[0.339,0.241],[0.282,0.257],
        [0.748,0.232],[0.714,0.346],[0.483,0.312],[0.478,0.437],[0.525,0.369],
        [0.751,0.489],[0.532,0.472],[0.473,0.376],[0.725,0.445],[0.446,0.459]
    ]

    第二部分:KMeans聚类

    clf = KMeans(n_clusters=3) 表示类簇数为3,聚成3类数据,clf即赋值为KMeans
    y_pred = clf.fit_predict(X) 载入数据集X,并且将聚类的结果赋值给y_pred

    clf = KMeans(n_clusters=2)  # 聚类算法,参数n_clusters=3,聚成2类
    y_pred = clf.fit_predict(X)  # 直接对数据进行聚类,聚类不需要进行预测
    
    print('k均值模型:\n',clf) # 输出完整Kmeans函数,包括很多省略参数
    print('聚类结果:\n',y_pred) # 输出聚类预测结果,30行数据,每个y_pred对应X一行或一个西瓜,聚成2类

    第三部分:可视化绘图

    Python导入Matplotlib包,专门用于绘图
    import matplotlib.pyplot as plt 此处as相当于重命名,plt用于显示图像

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 获取第一列和第二列数据 使用for循环获取 n[0]表示X第一列
    x1 = [n[0] for n in X]
    x2 = [n[1] for n in X]
    
    # 绘制散点图 参数:x横轴 y纵轴
    plt.scatter(x1, x2, c=y_pred, marker='*')
    
    # 绘制标题
    plt.title("k-means Data")
    
    # 绘制x轴和y轴坐标
    plt.xlabel("x1")
    plt.ylabel("x2")
    
    # 显示图形
    plt.show()

    运行结果:

    k均值模型:
     KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
           n_clusters=2, n_init=10, n_jobs=None, precompute_distances='auto',
           random_state=None, tol=0.0001, verbose=0)
    聚类结果:
     [1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0]

    画图结果:

    image-20200507175526932

最后修改:2021 年 11 月 11 日
如果觉得我的文章对你有用,请随意赞赏