python k-means聚类

""
k-means聚类算法过程
1)从N个样本数据中随机选取k个作为初始的聚类中心
2)分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中
3)所有对象分配完成后,重新计算K个聚类的中心
4)与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转过程2),否则转过程5)
5)当质心不发生变化时停止并输出聚类结果

聚类的目标函数
使用误差平方和SSE作为度量聚类质量的目标函数,对于两种不同的聚类结果,选择误差平方
和较小的分类结果
"""
##使用K-Means算法聚类消费行为特征数据

#加载程序包

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
#读取数据

inputfile = '../data/consumption_data.xls' #销量及其他属性数据
outputfile = '../data/data_type.xls' #保存结果的文件名

data = pd.read_excel(inputfile, index_col = 'Id') #读取数据
data_zs = 1.0*(data - data.mean())/data.std() #数据标准化
"""
R:最近一次消费时间间隔
F:消费频率
M:消费总金额
"""

# '利用SSE选择k'
SSE = [] # 存放每次结果的误差平方和
for k in range(1, 9):
estimator = KMeans(n_clusters=k) # 构造聚类器
estimator.fit(data_zs)
SSE.append(estimator.inertia_)
X = range(1, 9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()

k=5 #设定聚类数据为5类

model = KMeans(n_clusters = k)
model.fit(data_zs) #开始聚类

#简单打印结果
r1 = pd.Series(model.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚类中心
r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data.columns) + [u'类别数目'] #重命名表头
print(r)

##输出误差平方和SSE
SSE = model.inertia_
print(SSE)
#详细输出原始数据及其类别
data_new = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) #详细输出每个样本对应的类别
data_new.columns = list(data.columns) + [u'聚类类别'] #重命名表头
data_new.to_excel(outputfile) #保存结果


上一篇:How to Compare Means (均值比较)


下一篇:k-means伪代码