1.聚类任务
聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个”簇“,通过这样的划分,每个簇可能对应于一些潜在的概念,这些概念对聚类算法来说是事先未知,聚类过程仅能自动形成簇结构,簇所对应的概念语义需要由使用者来把握命名。
2.性能度量
聚类性能度量分为两大类,一类是将聚类结果与某个”参考模型“进行比较,称为”外部指标“;另一类是直接考察聚类结果而不利用任何参考模型,称为”内部指标“。
1)外部指标
2)内部指标
3)距离计算
4)K-均值算法
算法过程:
a) 从N个样本数据中随机选取K个对象作为初始的聚类中心
b) 分别计算各个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中
c) 所有对象分配完成后,重新计算K个聚类的中心
d) 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转过程b),否则转过程f)
f) 当质心不发生变化时停止并输出聚类结果
5)算法实现
#-*- coding: utf-8 -*-
import pandas as pd
filename = 'consumption_data.xls'
output_file = 'result_kmeans'
data = pd.read_excel(filename, index_col='Id')
#数据标准化
data = 1.0*(data- data.mean())/data.std()
#设定最大循环次数和聚类数目
k_iterations = 500
k = 3
from sklearn.cluster import KMeans
model = KMeans(n_clusters = k, n_jobs = 4, max_iter= k_iterations)
model.fit(data)
#获得每个聚类的数目
r1 = pd.Series(model.labels_).value_counts()
#获取每个聚类的中心
r2 = pd.DataFrame(model.cluster_centers_)
#横向连接
r = pd.concat([r1, r2], axis = 1)
#设置属性
r.columns = ['number of each characters'] + list(data.columns)
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)
r.columns = list(data.columns) + ['class']
print r
def density_plot(data, title):
import matplotlib.pyplot as plt
#plt.title('The Density Distribution of the cluster %s' % title)
p = data.plot(kind = 'kde', linewidth = 2, subplots = True, sharex = False)
[p[i].set_ylabel('density') for i in range(3)]
plt.legend()
plt.show()
for i in range(k):
density_plot(data[r['class']==i], i)