python基础3-k-means

浏览: 1677
#数据处理
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from datetime import date,datetime
import numpy as np
from sklearn.cluster import KMeans #导入K均值聚类算法
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6 #rcParams设定好画布的大小
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

dir_path='E://DATA//'
outputfile = dir_path+'fenlei.csv'
data = pd.read_csv(dir_path+'full',sep='\x01',engine='python',header=None,names=[''], parse_dates=[''], infer_datetime_format=True,dtype={'':str,'':int}, encoding='utf-8')


#聚类
'''
算法过程:
1、从N个样本数据中随机选取K个对象作为初始的聚类质心。
2、分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。
3、所有对象分配完成之后,重新计算K个聚类的质心。
4、与前一次的K个聚类中心比较,如果发生变化,重复过程2,否则转过程5.
5、当质心不再发生变化时,停止聚类过程,并输出聚类结果。
'''
k = 5 #需要进行的聚类类别数
iteration = 500 #聚类最大循环数
kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data) #训练模型
r1 = pd.Series(kmodel.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_) #找出聚类中心
r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data.columns) + ['类别数目'] #重命名表头
#详细输出原始数据及其类别
r1 = pd.concat([data, pd.Series(kmodel.labels_, index = data4.index)], axis = 1)
r1.columns = list(data.columns) + [u'聚类类别'] #重命名表头


#这个方法的聚类效果并不好,无法区分各个类别,弃用
from sklearn.manifold import TSNE
tsne = TSNE()
tsne.fit_transform(data4) #进行数据降维
tsne = pd.DataFrame(tsne.embedding_, index = data4.index) #转换数据格式
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#不同类别用不同颜色和样式绘图
d = tsne[r1[u'聚类类别'] == 0]
plt.plot(d[0], d[1], 'y.')
d = tsne[r1[u'聚类类别'] == 1]
plt.plot(d[0], d[1], 'go')
d = tsne[r1[u'聚类类别'] == 2]
plt.plot(d[0], d[1], 'b*')
d = tsne[r1[u'聚类类别'] == 3]
plt.plot(d[0], d[1], 'c.')
d = tsne[r1[u'聚类类别'] == 4]
plt.plot(d[0], d[1], 'ro')
plt.show()

Clipboard Image.png

'''
行转列,做x轴为省份 y轴为均值的聚类分布图
'''
data1=r1.copy()
data1=data1.reset_index().set_index(['聚类类别','sku_no']).stack().reset_index()
p=data1['province'].drop_duplicates().reset_index().drop('index',axis=1).reset_index().set_index('province')
dic_p=p['index'].to_dict()
#聚类后的类折线图
data2=data1.copy()
data2['province']=data2['province'].map(dic_p)
plot_data=data2[['class','province','zb']].groupby(['class','province']).sum()
plot_data=plot_data.reset_index()
class_list=plot_data['class'].drop_duplicates().tolist()
for i,class_no in enumerate(class_list):
mask_class=plot_data['class']==class_no
plt.style.use('ggplot')
plt.plot(plot_data['province'].loc[mask_class],plot_data['zb'].loc[mask_class])
plt.xlabel('省份')
plt.show()

Clipboard Image.png

data3=data2[['class','province','sku_qty']].groupby(['class','province']).mean()
p_map=data9['province'].drop_duplicates().reset_index().set_index('province')
p_dict=p_map['index'].to_dict()
data3['province']=data3['province'].map(p_dict)
data3['class'].drop_duplicates()
class_list=data3['class'].drop_duplicates().tolist()
for i,class_no in enumerate(class_list):
mask_c=data9['class']==class_no
plt.xlabel('省份')
plt.scatter(data3['province'].loc[mask_c],data3['sku_qty'].loc[mask_c])
plt.show()

Clipboard Image.png

推荐 0
本文由 liliwu 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册