美文网首页
k-means聚类

k-means聚类

作者: Colleen_oh | 来源:发表于2019-04-26 15:36 被阅读0次

    https://www.jianshu.com/p/dbf3dc4919f7
    之前有讲过聚类的理论,这里就不进行讲解了。下面直接上代码

    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    from sklearn.manifold import TSNE
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    #注意:data要是DataFrame格式的
    data=pd.DataFrame(data)
    
    #根据手肘图选择最优聚类数k
    def n_clusters(data,k_max):#在1到k_max中选择最优k,假如你想看看20类中,哪一个最好,这里的k_max就输入20
        SSE = []  # 存放每次结果的误差平方和
        for k in range(1,k_max):
            estimator = KMeans(n_clusters=k)  # 构造聚类器
            estimator.fit(data)
            SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
        X = range(1,k_max)
        plt.xlabel('k')
        plt.ylabel('SSE')
        plt.plot(X,SSE,'o-')
        plt.show()
    
    #聚类
    def cluster(data,k):
        mod = KMeans(n_clusters=k, n_jobs = 4, max_iter = 500)#聚成3类数据,并发数为4,最大循环次数为500
        mod.fit_predict(data)#y_pred表示聚类的结果
        r1 = pd.Series(mod.labels_).value_counts()#聚成3类数据,统计每个聚类下的数据量,并且求出他们的中心
        r2 = pd.DataFrame(mod.cluster_centers_)
        r = pd.concat([r2, r1], axis = 1)
        r.columns = list(data.columns) + [u'类别数目']
        print(r)
        #给每一条数据标注上被分为哪一类
        r = pd.concat([data, pd.Series(mod.labels_, index = data.index)], axis = 1)
        r.columns = list(data.columns) + [u'聚类类别']
        print(r.head())
        return(r)
        #r.to_excel(outfile)#写出文件夹
    
    #可视化
    r=cluster(data,k)#提取聚类结果
    ts = TSNE()
    ts.fit_transform(r)#r是聚类结果
    ts = pd.DataFrame(ts.embedding_, index = r.index)
    a = ts[r[u'聚类类别'] == 0]
    plt.plot(a[0], a[1], 'r.')#'r'、'g'、‘b’是代表颜色,后面的.、o、*是选择我们要的点的形状
    a = ts[r[u'聚类类别'] == 1]
    plt.plot(a[0], a[1], 'go')
    a = ts[r[u'聚类类别'] == 2]#这里只画了3类的图,要画5类的就要自己再增加一些代码啦!
    plt.plot(a[0], a[1], 'b*')
    plt.show()
    

    上面是定义好的,用SSE选择最优聚类数和聚类的代码,记得data的格式是DataFrame,以免出错,我们的数据中不要含有字符串,要保证是数值类型。另外数据要没有空值,在做聚类之前,要处理空值,并且数据要齐全,就是假如你的数据有7列24行,你要确保每一行都有7个数字,不要存在某一行或者某一列缺失(若缺失可以补齐或者删除,根据自己需求)。不然是没有没办计算距离的。

    参考:
    https://blog.csdn.net/xyisv/article/details/82430107
    https://blog.csdn.net/weixin_40683253/article/details/81288900
    https://blog.csdn.net/qiurisiyu2016/article/details/80187177

    相关文章

      网友评论

          本文标题:k-means聚类

          本文链接:https://www.haomeiwen.com/subject/poxqnqtx.html