#-*-coding:utf-8-*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
x1,y1=datasets.make_circles(n_samples=5000,factor=.6,noise=0.05)
x2,y2=datasets.make_blobs(n_samples=1000,n_features=2,centers=[[1.2,1.2]],cluster_std=[[.1]],random_state=9)
#x3,y3=datasets.make_moons(n_samples=2000,noise=0.05)
#plt.scatter(x3[:,0],x3[:,1],marker='o')
#plt.show()
plt.subplot(3,2,6)#把原始图像放在最后显示
x=np.concatenate((x1,x2))
plt.scatter(x[:,0],x[:,1],marker='o')
plt.subplot(3,2,1)#第一个是kmeans的结果,K为5
from sklearn.cluster import KMeans
result=KMeans(n_clusters=5,random_state=9).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=result)
#plt.show()
plt.subplot(3,2,2)
from sklearn.cluster import MiniBatchKMeans#第二个与第一个类似,不同的地方是计算距离使用的样本是不同类的抽样数据
result=MiniBatchKMeans(n_clusters=5,random_state=9).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=result)
#plt.show()
plt.subplot(3,2,3)
from sklearn.cluster import Birch#利用层次方法的平衡迭代和规约
result=Birch(n_clusters=5).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=result)
'''
plt.subplot(3,2,1)
from sklearn.cluster import AffinityPropagation#吸引子传播,这个计算起来很慢.....
result=AffinityPropagation().fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=result)
plt.show()
'''
plt.subplot(3,2,4)
from sklearn.cluster import DBSCAN#具有噪声的基于密度的聚类方法,不需要指定聚类类别,但需要指定距离和簇最小样本
result=DBSCAN(eps=0.1,min_samples=10).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=result)
plt.subplot(3,2,5)
from sklearn.cluster import SpectralClustering#谱聚类,计算相似度矩阵,相似距离使用rbf距离
result=SpectralClustering(n_clusters=5).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=result)
plt.show()
可以看出,当聚类数量为3时,比较明显的地方是dbscan可以聚类出形状相似的部分,而且其它的方法都需要指定聚类的簇数