K-Means 算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预订的类树 K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度越大。
度量样本之间的相似性最常用的是 欧几里得距离、曼哈顿距离和闵可夫斯基距离;(Scikit-Learn 中的 KMeans 算法仅仅支持欧氏距离,因为采用其他的距离并不一定能够保证算法的收敛性。)
度量聚类质量的目标函数:误差平方和 SSE。对于两种不同的聚类结果,选择误差平方和较小的分类结果。
算法评价:组内相似性越大,组间差别越大,聚类效果越好
#使用 K-Means 算法聚类消费行为特征数据
import pandas as pd
#参数初始化
inputfile='../data/consumption_data.xls'
outputfile='../out/data_type.xls'
k=3 #聚类的类别
iteration=500 #聚类最大循环次数
data=pd.read_excel(inputfile,index_col='Id')
data_zs=1.0*(data-data.mean())/data.std() #数据标准化,直接对每一列进行标准化计算,不需要单独提取每一列
from sklearn.cluster import KMeans
model=KMeans(n_clusters=k, n_jobs=4, max_iter=iteration) #分为k类,并发数为4
model.fit(data_zs) #开始聚类
#简单打印结果
r1=pd.Series(model.labels_).value_counts() #统计各个类别的数目
r2=pd.DataFrame(model.cluster_centers_) #找出聚类中心
r=pd.concat([r2,r1],axis=1) #横向连接(axis=0纵向连接),得到聚类中心对应的类别下的数目 连接 r1 和 r2
r.columns=list(data.columns)+[u'类别数目'] #重命名表头,data.columns是data的列标签
print(r)
#详细输出原始数据及其类别
r=pd.concat([data,pd.Series(model.labels_,index=data.index)],axis=1) #详细输出每个样本对应的类别 连接中括号内的两项内容
r.columns=list(data.columns)+[u'聚类类别'] #重命名表头
r.to_excel(outputfile) #保存结果
sklearn.cluster.KMeans #KMeans 聚类
Parameters:
n_clusters: int, 可选项,default=8。要生成的聚类质量,以及要生成的聚类中心的数量。
n_jobs: int,用于计算的并行数量(并发数量)
n_jobs=-1,If -1 all CPUs are used ,所有cpu 用于计算;
n_jobs=1,no parallel computing code is used at all, which is useful for debugging,没有并行计算几点,用于调试
max_iter: int, default=300。聚类最大循环次数(单次运行 K-Means 算法的最大迭代次数)
Attributes:
labels_: array, [n_clusters, n_features]。 Labels of each point 类别标签
cluster_centers_: Coordinates of cluster centers 聚类中心