#coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import sklearn.datasets as ds
import matplotlib
matplotlib.rcParams['font.sans-serif'] = [u'SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#生成测试数据
#生成维度为2,个数为200个的样本点。其中有4个聚类中心。每一个簇的方差分别为1,2,2,1
data,y = ds.make_blobs(200,n_features=2,centers=4, cluster_std=[1,2,2,1], random_state=3)
#绘制样本点
colors=['red','yellow','blue','black']
plt.title(u"原始数据")
plt.subplot(211)
for i in range(4):
plt.scatter(data[y==i][:,0],data[y==i][:,1],color=colors[i])
#开始聚类
model = KMeans(n_clusters=4,init="k-means++")
model.fit(data,y)
#pre_y = model.fit(data,y)
#分类结果
pre_y = model.labels_
#对比分类效果
plt.title(u"聚类数据")
plt.subplot(212)
for i in range(4):
plt.scatter(data[pre_y==i][:,0],data[pre_y==i][:,1],color=colors[i])
plt.show()
#假设我们不知道有几个簇,可以通过下面的方法来解决
a = []
for i in range(1,10):
model = KMeans(n_clusters=i,init="k-means++")
model.fit(data)
#model.inertia_ 表示每一个样本点到自己的聚类中心的距离的平方和的和。越小表示聚类效果越好
a.append(model.inertia_)
a = np.array(a)
plt.plot(range(1,10),a/100)
plt.show()
#根据最后的图形可知最好的簇中心数为4