欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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))
  1. 将聚类的数据可视化
#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')