python模組之scipy的層次聚類簡單測試與使用
阿新 • • 發佈:2019-01-01
scipy模組是很強大,裡面很多有用的函式,這裡先花一點時間使用一下scipy模組中的層次聚類,下面是簡單的使用:
#!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:scipy測試使用 ''' import scipy import json import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt def cluster_test(datafile='data/shop_test/vector.json'): ''' 簡單的層次聚類實驗 ''' with open(datafile) as f: file_list=json.load(f) matrix=[] for one_dict in file_list: matrix.append(one_dict['vector']) #距離度量包括: ''' 'euclidean'、'minkowski'、'cityblock'、'seuclidean'、'sqeuclidean' 'cosine'、'correlation'、'hamming'、'jaccard'、'chebyshev'、 'canberra' 'braycurtis'、'mahalanobis'、'yule'、'matching'、'dice'、'kulsinski' 'rogerstanimoto'、'russellrao'、'sokalmichener'、'sokalsneath' 'wminkowski' ''' disMat = sch.distance.pdist(matrix,'euclidean') #距離計算方法包括: ''' 'single'、'complete'、'average'、'weighted'、'centroid'、 ''' Z=sch.linkage(disMat,method='average') #視覺化處理 P=sch.dendrogram(Z) plt.savefig('pictures/result.png') #聚類準則包括: ''' 'inconsistent'、'distance'、'maxclust'、'monocrit'、'maxclust_monocrit' ''' cluster= sch.fcluster(Z, criterion='inconsistent',t=1) print "層次聚類結果為:\n",cluster #白化處理 data=whiten(matrix) #kmeans聚類 ''' 聚類數確定方法: 1.藉助層次聚類方法初步確定 2.手動設定,嘗試法 ''' centroid=kmeans(data,max(cluster))[0] #使用vq函式 cluster2=vq(data,centroid)[0] print "kmeans聚類結果為:\n", cluster2 def cluster_test2(datafile='data/shop_test/vector.json'): ''' 簡單的層次聚類實驗 ''' with open(datafile) as f: file_list=json.load(f) matrix=[] for one_dict in file_list: matrix.append(one_dict['vector']) #距離度量包括: ''' 'euclidean'、'minkowski'、'cityblock'、'seuclidean'、'sqeuclidean' 'cosine'、'correlation'、'hamming'、'jaccard'、'chebyshev'、 'canberra' 'braycurtis'、'mahalanobis'、'yule'、'matching'、'dice'、'kulsinski' 'rogerstanimoto'、'russellrao'、'sokalmichener'、'sokalsneath' 'wminkowski' ''' disMat = sch.distance.pdist(matrix,'cityblock') #距離計算方法包括: ''' 'single'、'complete'、'average'、'weighted'、'centroid'、 ''' Z=sch.linkage(disMat,method='complete') #視覺化處理 P=sch.dendrogram(Z) plt.savefig('pictures/result2.png') #聚類準則包括: ''' 'inconsistent'、'distance'、'maxclust'、'monocrit'、'maxclust_monocrit' ''' cluster= sch.fcluster(Z, criterion='distance',t=1) print "層次聚類結果為:\n",cluster #白化處理 data=whiten(matrix) #kmeans聚類 ''' 聚類數確定方法: 1.藉助層次聚類方法初步確定 2.手動設定,嘗試法 ''' centroid=kmeans(data,max(cluster))[0] #使用vq函式 cluster2=vq(data,centroid)[0] print "kmeans聚類結果為:\n", cluster2 if __name__=='__main__': cluster_test(datafile='data/shop_test/vector.json') cluster_test2(datafile='data/shop_test/vector.json')
結果如下:
層次聚類結果為: [ 4 12 1 9 9 1 4 16 7 19 2 12 10 2 7 5 18 8 7 11 10 2 5 4 12 6 6 5 7 12 3 13 3 13 17 2 14 1 15 8 13 12 15] kmeans聚類結果為: [ 9 0 16 15 15 2 9 9 3 14 7 17 15 12 3 5 9 9 3 15 15 6 1 8 17 9 9 5 3 17 4 0 4 13 11 12 10 2 9 9 13 0 9] 層次聚類結果為: [ 9 18 3 23 24 1 10 30 13 34 7 17 25 6 13 12 33 15 13 27 26 4 12 11 17 31 31 12 14 17 8 21 8 20 32 5 22 2 28 16 20 19 29] kmeans聚類結果為: [12 15 0 13 13 0 7 7 23 7 17 15 4 3 23 2 22 10 23 20 18 3 2 1 15 21 21 2 23 15 11 15 9 19 6 3 14 0 8 5 15 15 16] [Finished in 2.5s]
其中result.png如下:
result2.png如下:
純屬新手尚在學習,如果有興趣的歡迎交流哈!