1. 程式人生 > >python模組之scipy的層次聚類簡單測試與使用

python模組之scipy的層次聚類簡單測試與使用

    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如下:


    純屬新手尚在學習,如果有興趣的歡迎交流哈!