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如下:
纯属新手尚在学习,如果有兴趣的欢迎交流哈!