學習sklearn聚類使用
阿新 • • 發佈:2017-08-15
predict usr ans Coding 二維 product port 個數 log
學習利用sklearn的幾個聚類方法:
一.幾種聚類方法
1.高斯混合聚類(mixture of gaussians)
2.k均值聚類(kmeans)
3.密度聚類,均值漂移(mean shift)
4.層次聚類或連接聚類(ward最小離差平方和)
二.評估方法
1.完整性:值:0-1,同一個類別所有數據樣本是否劃分到同一個簇中
2.同質性:值:0-1,每個簇是否只包含同一個類別的樣本
3.上面兩個的調和均值
4.以上三種在評分時需要用到數據樣本的真正標簽,但實際很難做到。輪廓系數(1,-1):只使用聚類的數據,它計算的是每個數據樣本與同簇數據樣本和其它簇數據樣本之間的相似度,因為從平均來看,與同簇比較起來,比其它簇更相似。
三.說明
1.kmeans與高斯需要指定簇的數量(n_clusters=2,n_components=2);均值漂移指定帶寬(bandwidth=7);層次使用ward鏈接定義合並代價(距離),終止最大距離max_d。
2.圖中可以看出高斯的評估指標最好,其次是均值漂移,k均值與層次較差
四.sklearn聚類
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import numpy as np 5 import matplotlib.pyplot as plt 6 from sklearn.cluster importKMeans 7 from sklearn.cluster import MeanShift 8 from sklearn.metrics import homogeneity_completeness_v_measure 9 from sklearn import mixture 10 from scipy.cluster.hierarchy import linkage 11 from scipy.cluster.hierarchy import fcluster 12 13 class ClusterMethod: 14 15 def __init__(self): 16 l1=np.zeros(100) 17 l2=np.ones(100) 18 self.labels=np.concatenate((l1,l2),) 19 20 #隨機創建兩個二維正太分布,形成數據集 21 def dataProduction(self): 22 # 隨機創建兩個二維正太分布,形成數據集 23 np.random.seed(4711) 24 c1 = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[100, ]) 25 l1 = np.zeros(100) 26 l2 = np.ones(100) 27 # 一個100行的服從正態分布的二維數組 28 c2 = np.random.multivariate_normal([0, 10], [[3, 1], [1, 4]], size=[100, ]) 29 # 加上一些噪音 30 np.random.seed(1) 31 noise1x = np.random.normal(0, 2, 100) 32 noise1y = np.random.normal(0, 8, 100) 33 noise2 = np.random.normal(0, 8, 100) 34 c1[:, 0] += noise1x # 第0列加入噪音數據 35 c1[:, 1] += noise1y 36 c2[:, 1] += noise2 37 38 # 定義繪圖 39 self.fig = plt.figure(figsize=(20, 15)) 40 # 添加子圖,返回Axes實例,參數:子圖總行數,子圖總列數,子圖位置 41 ax = self.fig.add_subplot(111) 42 # x軸 43 ax.set_xlabel(‘x‘, fontsize=30) 44 # y軸 45 ax.set_ylabel(‘y‘, fontsize=30) 46 # 標題 47 self.fig.suptitle(‘classes‘, fontsize=30) 48 # 連接 49 labels = np.concatenate((l1, l2), ) 50 X = np.concatenate((c1, c2), ) 51 # 散點圖 52 pp1 = ax.scatter(c1[:, 0], c1[:, 1], cmap=‘prism‘, s=50, color=‘r‘) 53 pp2 = ax.scatter(c2[:, 0], c2[:, 1], cmap=‘prism‘, s=50, color=‘g‘) 54 ax.legend((pp1, pp2), (‘class 1‘, ‘class 2‘), fontsize=35) 55 self.fig.savefig(‘scatter.png‘) 56 return X 57 58 def clusterMethods(self): 59 X=self.dataProduction() 60 self.fig.clf()#reset plt 61 self.fig,((axis1,axis2),(axis3,axis4))=plt.subplots(2,2,sharex=‘col‘,sharey=‘row‘)#函數返回一個figure圖像和一個子圖ax的array列表 62 63 #k-means 64 self.kMeans(X,axis1) 65 #mean-shift 66 self.meanShift(X,axis2) 67 #gaussianMix 68 self.gaussianMix(X,axis3) 69 #hierarchicalWard 70 self.hierarchicalWard(X,axis4) 71 72 def kMeans(self,X,axis1): 73 kmeans=KMeans(n_clusters=2)#聚類個數 74 kmeans.fit(X)#訓練 75 pred_kmeans=kmeans.labels_#每個樣本所屬的類 76 print(‘kmeans:‘,np.unique(kmeans.labels_)) 77 print(‘kmeans:‘,homogeneity_completeness_v_measure(self.labels,pred_kmeans))#評估方法,同質性,完整性,兩者的調和平均 78 #plt.scatter(X[:,0],X[:,1],c=kmeans.labels_,cmap=‘prism‘) 79 axis1.scatter(X[:,0],X[:,1],c=kmeans.labels_,cmap=‘prism‘) 80 axis1.set_ylabel(‘y‘,fontsize=40) 81 axis1.set_title(‘k-means‘,fontsize=40) 82 #plt.show() 83 84 def meanShift(self,X,axis2): 85 ms=MeanShift(bandwidth=7)#帶寬 86 ms.fit(X) 87 pred_ms=ms.labels_ 88 axis2.scatter(X[:,0],X[:,1],c=pred_ms,cmap=‘prism‘) 89 axis2.set_title(‘mean-shift‘,fontsize=40) 90 print(‘mean-shift:‘,np.unique(ms.labels_)) 91 print(‘mean-shift:‘,homogeneity_completeness_v_measure(self.labels,pred_ms)) 92 93 def gaussianMix(self,X,axis3): 94 gmm=mixture.GMM(n_components=2) 95 gmm.fit(X) 96 pred_gmm=gmm.predict(X) 97 axis3.scatter(X[:, 0], X[:, 1], c=pred_gmm, cmap=‘prism‘) 98 axis3.set_xlabel(‘x‘, fontsize=40) 99 axis3.set_ylabel(‘y‘, fontsize=40) 100 axis3.set_title(‘gaussian mixture‘, fontsize=40) 101 print(‘gmm:‘,np.unique(pred_gmm)) 102 print(‘gmm:‘,homogeneity_completeness_v_measure(self.labels,pred_gmm)) 103 104 def hierarchicalWard(self,X,axis4): 105 ward=linkage(X,‘ward‘)#訓練 106 max_d=110#終止層次算法最大的連接距離 107 pred_h=fcluster(ward,max_d,criterion=‘distance‘)#預測屬於哪個類 108 axis4.scatter(X[:,0], X[:,1], c=pred_h, cmap=‘prism‘) 109 axis4.set_xlabel(‘x‘,fontsize=40) 110 axis4.set_title(‘hierarchical ward‘,fontsize=40) 111 print(‘ward:‘,np.unique(pred_h)) 112 print(‘ward:‘,homogeneity_completeness_v_measure(self.labels,pred_h)) 113 114 self.fig.set_size_inches(18.5,10.5) 115 self.fig.savefig(‘comp_clustering.png‘,dpi=100)#保存圖 116 117 if __name__==‘__main__‘: 118 cluster=ClusterMethod() 119 cluster.clusterMethods()
五.評估圖
參考:1.Machine.Learning.An.Algorithmic.Perspective.2nd.Edition.
2.Machine Learning for the Web
學習sklearn聚類使用