zoukankan      html  css  js  c++  java
  • 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    1.

    (一)选取初始数据中的k个对象作为初始的中心,每个对象代表一个聚类中心

    #随机生成一组整数sample
    import numpy as np
    sample=np.random.randint(1,100,[50,1])
    k=3#要分成的类别数
    y=np.zeros(50)
    #定义一个函数来存放开始的聚类中心kc
    def start_center(sample,k):
        return sample[:3]
    kc=start_center(sample,k)

    (二) 对于样本中的数据对象,根据它们与这些聚类中心的欧氏距离,按距离最近的准则将它们分到距离它们最近的聚类中心所对应的类

    def nearest(kc,i):
        d=abs(kc-i)
        t=np.where(d ==np.min(d))
        return t[0][0]
    nearest(kc,34)
    #对其进行对应的分类def xclassify(sample,y,kc):
        for i in range(30):
            y[i]=nearest(kc,sample[i])
        return y
    y=xclassify(sample,y,kc)
    print(kc,y)

    (三)更新聚类中心:将每个类别中所有对象所对应的均值作为该类别的聚类中心,计算目标函数的值

    def kcmean(sample,y,kc,k):
        l=list(kc)
        flag=False
        for j in range(k):# 对k的类别进行遍历
            m=np.where(y==j)
            print(j,sample[j])
            junzhi=np.mean(sample[m])# 求出每个类别的均值
            print(kc[j],junzhi)
            if l[j]!=junzhi: # 判断求出的均值是否与开始的看类别值相等
                l[j]=junzhi
                flag=True
        return(np.array(l),flag)

    (四)判断聚类中心和目标函数的值是否发生改变,若不变,则输出结果,若改变,则返回2

    flag=True
    while flag:
        y=xclassify(sample,y,kc)
        kc,flag=kcmean(sample,y,kc,k)
        print(y,kc)
    print(sample,y)

    2.鸢尾花花瓣长度做聚类分析并用散点图展示

    import matplotlib.pyplot as plt
    import numpy as np
    # 鸢尾花花瓣长度数据做聚类并用散点图显示
    data=load_iris()
    data_length=data['data'][:,2] # 取出鸢尾花花瓣的长度
    x=data_length
    y=np.zeros(x.shape[0])
    kc = start_center(x,3)
    flag=True
    while flag:
        y=xclassify(x,y,kc)
        kc,flag=kcmean(x,y,kc,k)
    print(y,kc)
    # 用散点图来展示
    plt.scatter(x,x,s=x,c=y,cmap='rainbow',alpha=0.5,linewidths=4)
    plt.show()

    3.用sklearm包的kmeans对鸢尾花的花瓣进行分析用散点图展示

    from sklearn.datasets import load_iris
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    import numpy as np
    # 用sklearn.cluster.KMeans,鸢尾花花瓣长度数据做聚类并用散点图显示.
    data=load_iris()
    data_length=data['data'][:,2:3]#取出鸢尾花花瓣的长度
    x=data_length
    #y=np.zeros(x.shape[0])
    k1=KMeans(n_clusters=3)#将其类别分为3类
    k1.fit(x)
    kc1=k1.cluster_centers_
    y_kmeans=k1.predict(x)#预测每个样本的聚类索引
    print(y_kmeans,kc1)
    plt.scatter(x,np.linspace(1,150,150),c=y_kmeans,marker='x',cmap='rainbow',linewidths=4)
    plt.show()

    4.完整的鸢尾花数据分析用散点图展示

    # 用sklearn.cluster.KMeans,完整的鸢尾花数据做聚类并用散点图展示
    data=load_iris()
    x2=data.data
    k2=KMeans(n_clusters=3)#将其类别分为3类
    k2.fit(x2)
    kc2=k2.cluster_centers_
    y_kmeans2=k2.predict(x2)#预测每个样本的聚类索引
    print(y_kmeans2,kc2,len(y_kmeans2))
    plt.scatter(x2[:,0],x2[:,1],c=y_kmeans2,marker='p',cmap='rainbow',linewidths=4)
    plt.show()

  • 相关阅读:
    [NOIp2017] 列队
    [CQOI2009] 中位数
    [洛谷P1419] 寻找段落
    [HNOI2001] 产品加工
    [洛谷P1842] 奶牛玩杂技
    [SCOI2006] 数字立方体
    [LOJ10121] 与众不同
    [USACO10MAR] 伟大的奶牛聚集
    [HAOI2010] 软件安装
    [洛谷P1357] 花园
  • 原文地址:https://www.cnblogs.com/moon2/p/9872706.html
Copyright © 2011-2022 走看看