以下代码,产生两组各30个不同正态分布的共60个样本,混杂一起,使用K-means聚类方法,实现聚类,并对比原始数据和聚类结果,以图像输出显示。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.pyplot as plt
#生成两类正态分布的数据,并添加类标签
c1labels=np.ones((30,1))
#hstack拼接操作
c1=np.hstack((cluster1,c1labels))
c2labels=2*np.ones((30,1))
c2=np.hstack((cluster2,c2labels))
X=np.vstack((c1,c2))
plt.rcParams['font.sans-serif'] = 'SimHei' ## 设置中文显示
p = plt.figure(figsize=(12,12))
#绘制子图1:原始数据
ax1 = p.add_subplot(2,2,1)
plt.grid(True)
plt.plot(np.arange(0,30,1),c1[:,0],'ko')
plt.plot(np.arange(30,60,1),c2[:,0],'bo')
plt.title('原始数据')
plt.show
#计算K值从1到10对应的平均畸变程度:
from sklearn.cluster import KMeans
#用scipy求解距离
K=range(1,10)
meandistortions=[]
for k in K:
kmeans=KMeans(n_clusters=k)
kmeans.fit(X)
meandistortions.append(sum(np.min(
cdist(X,kmeans.cluster_centers_,
'euclidean'),axis=1))/X.shape[0])
#绘制子图2
ax2 = p.add_subplot(2,2,2)
plt.plot(K,meandistortions,'bx-')
plt.xlabel('k')
plt.ylabel(u'平均畸变程度')
plt.title(u'用肘部法则来确定最佳的K值')
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans
data = X[:,0].reshape(-1,1) ##提取数据集中的特征
target = X[:,1] ## 提取数据集中的标签
scale = MinMaxScaler().fit(data)## 训练规则
dataScale = scale.transform(data) ## 应用规则
kmeans = KMeans(n_clusters = 2).fit(dataScale) ##构建并训练模型
print('构建的K-Means模型为:\n',kmeans)
#绘制子图3:K均值聚类结果
import pandas as pd
df=pd.DataFrame(data) ##将原始数据转换为DataFrame
df['labels'] = kmeans.labels_ ##将聚类结果存储进df数据表
##提取不同标签的数据
df0 = df[df['labels']==0]
df1 = df[df['labels']==1]
df0size=df0['labels'].size
df1size=df1['labels'].size
ax3 = p.add_subplot(2,2,3)
##用不同的颜色表示不同数据
for i in range(60):
#print(i)
label=np.int(df.loc[i,['labels']])
#print(label)
#print(df.loc[i,['labels']])
if label==1:#聚类1是原始数据的类c2
plt.plot(i,df.loc[i,0],'ko')
elif label==0:#聚类0是原始数据的类c1
plt.plot(i,df.loc[i,0],'bo')
elif label==2:
plt.plot(i,df.loc[i,0],'y*')
plt.title('K均值聚类结果')
path='D:\\PythonStudy\\'
plt.savefig(path+'kmeans.jpg')
plt.show()
#结果(注:每次运行产生的数据样本不同;可以自行更改K值,或不同的原始样本,观察对比聚类结果):
领取专属 10元无门槛券
私享最新 技术干货