Python之K均值聚类

以下代码,产生两组各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值,或不同的原始样本,观察对比聚类结果):

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180718G10HP200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券