Python3: Kmeans聚类模型的实现方法及可视化
程序员文章站
2024-02-13 19:46:28
...
原始数据格式:每一行为一个样本,每一列为特征,总共有六列原始数据。画图的时候画的是每一行的数据绘制了一个散点图,列名作为X轴的坐标轴
1 Kmeans聚类模型:
#Kmeans聚类算法
import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('seaborn')
#1.读取数据进行聚类分析
#1.1 读取数据
dataccdjl = pd.read_excel('/project_data/data_asset/dataccd.xlsx')
dataccdjl = dataccdjl.drop(['cell'],axis=1)
#1.2 调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters = 10, n_jobs = 4,random_state=0) #n_jobs是并行数,一般等于CPU数较好
kmodel.fit(dataccdjl) #训练模型
r1 = pd.Series(kmodel.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_) #找出聚类中心
r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(dataccdjl.columns) + [u'类别数目'] #重命名表头
JLnumber = r.to_excel('/project_data/data_asset/JLnumber.xlsx')#将聚类中心的数据保存到对应的路径
print (r)
r = pd.concat([dataccdjl, pd.Series(kmodel.labels_, index = dataccdjl.index)], axis = 1) #详细输出每个样本对应的类别
r.columns = list(dataccdjl.columns) + [u'聚类类别'] #重命名表头
dataccdJLresult = r.to_excel('/project_data/data_asset/dataccdJLresult.xlsx') #保存分类结果
def density_plot(data): #自定义作图函数
p = dataccdjl.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
[p[i].set_ylabel('density') for i in range(10)]
plt.legend()
return plt
pic_output = '/project_data/data_asset/' #概率密度图文件名前缀
for i in range(10):
density_plot(dataccdjl[r[u'聚类类别']==i]).savefig(u'%s%s.png' %(pic_output, i))
将聚类的数据可视化
#2. 绘制聚类好的数据散点图,看看模式如何
#2.1 读取要聚类的数据
dataccdjl1 = pd.read_excel('/project_data/data_asset/dataccdJLresult.xlsx')
print(dataccdjl1.shape)
dataccdjl1.head(10)
print(dataccdjl1.columns)
marking_list2 = dataccdjl1.drop_duplicates('聚类类别')['聚类类别'].to_list()
lista = marking_list2
print(lista)
#2.2 散点图X的坐标
x=dataccdjl1.drop(['Unnamed: 0','聚类类别'],axis=1).columns.values
print(x)
#2.3 先画一组图看看模式怎么样,数据量太大,写循环绘图太卡,聚类类别为0
grouped = dataccdjl1.drop(['Unnamed: 0'],axis=1)
grouped1 = grouped[grouped['聚类类别']==0].reset_index(drop=True)#更改聚类类别就可以绘制不同聚类类别下的散点图了
#reset_index(drop=True)就是将新的数据的索引重置,从0开始
print(grouped1.shape)
grouped11 = grouped1.drop(['聚类类别'],axis=1)
#2.4 循环绘制聚类好的数据的散点图:只绘制聚类类别为0的散点图
for i in range(0,11090):
y = grouped11.iloc[i,:]
plt.xlabel('location')
plt.ylabel('AC_value')
plt.scatter(x, y)
plt.plot(x, y, color='g')
plt.title('jr_AC_OH')
上一篇: symfony配置文件之三:routing和路由配置
下一篇: vue 路由权限配置