网站数据分析(11)——聚类分析

聚类算法有几十种之多,聚类算法的选择,主要参考以下因素:

如果数据集是高维的,那幺选择谱聚类,它是子空间划分的一种。·如果数据量为中小规模,例如在100万条以内,那幺K均值将是比较好的选择;如果数据量超过100万条,那幺可以考虑使用Mini Batch KMeans。

如果数据集中有噪点(离群点),那幺使用基于密度的DBSCAN可以有效应对这个问题。

如果追求更高的分类准确度,那幺选择谱聚类将比K均值准确度更好,在Docu-ment clustering using locality preserving indexing中关于K- means和Spectral Clustering应用到TDT2和Reuters-21578两组数据的准确率对比结果证明了这个结论。 点击查看论文

二、KMeans算法原理

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

如果用数据表达式表示,假设簇划分为(C1,C2,…Ck),则我们的目标是最小化平方误差E:

其中μi是簇Ci的均值向量,有时也称为质心,表达式为:

首先我们看看K-Means算法的一些要点。

(1)对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什幺先验知识,则可以通过交叉验证选择一个合适的k值。

(2)在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。

好了,现在我们来总结下传统的K-Means算法流程。

输入是样本集D={x1,x2,…xm},聚类的簇树k,最大迭代次数N

输出是簇划分C={C1,C2,…Ck}

(1)从数据集D中随机选择k个样本作为初始的k个质心向量: {μ1,μ2,…,μk}

(2)对于n=1,2,…,N

a) 将簇划分C初始化为Ct=∅t=1,2…k

b) 对于i=1,2…m,计算样本xi和各个质心向量μj(j=1,2,…k)的距离:dij=||xi−μj||22,将xi标记最小的为dij所对应的类别λi。此时更新Cλi=Cλi∪{xi}

c) 对于j=1,2,…,k,对Cj中所有的样本点重新计算新的质心μj=1|Cj|∑x∈Cjx

e) 如果所有的k个质心向量都没有发生变化,则转到步骤3)

(3)输出簇划分C={C1,C2,…Ck}

三、代码实例

3.1 原始数据

Sklearn中有专门的聚类库cluster,在做聚类时只需导入这个库,便可使用其中多种聚类算法,例如K均值、DBSCAN、谱聚类等。 本示例模拟的是对一份没有任何标签的数据集做聚类分析,以得到不用类别的特征和分布状态等,主要使用Sklearn做聚类、用Matplotlib 做图形展示。数据源文件命名为clustring.txt。

3.2 代码

# 导入库
import numpy as np  # 导入numpy库
import matplotlib.pyplot as plt  # 导入matplotlib库
from sklearn.cluster import KMeans  # 导入sklearn聚类模块
from sklearn import metrics  # 导入sklearn效果评估模块
# 数据准备
raw_data = np.loadtxt('./cluster.txt')  # 导入数据文件
X = raw_data[:, :-1]  # 分割要聚类的数据
y_true = raw_data[:, -1]
# 训练聚类模型
n_clusters = 3  # 设置聚类数量
model_kmeans = KMeans(n_clusters=n_clusters, random_state=0)  # 建立聚类模型对象
model_kmeans.fit(X)  # 训练聚类模型
y_pre = model_kmeans.predict(X)  # 预测聚类模型
# 模型效果指标评估
n_samples, n_features = X.shape  # 总样本量,总特征数
inertias = model_kmeans.inertia_  # 样本距离最近的聚类中心的总和
adjusted_rand_s = metrics.adjusted_rand_score(y_true, y_pre)  # 调整后的兰德指数
mutual_info_s = metrics.mutual_info_score(y_true, y_pre)  # 互信息
adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y_true, y_pre)  # 调整后的互信息
homogeneity_s = metrics.homogeneity_score(y_true, y_pre)  # 同质化得分
completeness_s = metrics.completeness_score(y_true, y_pre)  # 完整性得分
v_measure_s = metrics.v_measure_score(y_true, y_pre)  # V-measure得分
silhouette_s = metrics.silhouette_score(X, y_pre, metric='euclidean')  # 平均轮廓系数
calinski_harabaz_s = metrics.calinski_harabaz_score(X, y_pre)  # Calinski和Harabaz得分
print('总样本量: %d \t 总特征数: %d' % (n_samples, n_features))  # 打印输出样本量和特征数量
print(70 * '-')  # 打印分隔线
print('ine\tARI\tMI\tAMI\thomo\tcomp\tv_m\tsilh\tc&h')  # 打印输出指标标题
print('%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d' % (
    inertias, adjusted_rand_s, mutual_info_s, adjusted_mutual_info_s, homogeneity_s, completeness_s,
    v_measure_s,
    silhouette_s, calinski_harabaz_s))  # 打印输出指标值
print(70 * '-')  # 打印分隔线
print('简写 \t 全称')  # 打印输出缩写和全名标题
print('ine \t 样本距离最近的聚类中心的总和')
print('ARI \t 调整后的兰德指数')
print('MI \t 互信息')
print('AMI \t 调整后的互信息')
print('homo \t 同质化得分')
print('comp \t 完整性得分')
print('v_m \t V-measure得分')
print('silh \t 平均轮廓系数')
print('c&h \t Calinski和Harabaz得分')
# 模型效果可视化
centers = model_kmeans.cluster_centers_  # 各类别中心
colors = ['#4EACC5', '#FF9C34', '#4E9A06']  # 设置不同类别的颜色
plt.figure()  # 建立画布
for i in range(n_clusters):  # 循环读类别
    index_sets = np.where(y_pre == i)  # 找到相同类的索引集合
    cluster = X[index_sets]  # 将相同类的数据划分为一个聚类子集
    plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker='.')  # 展示聚类子集内的样本点
    plt.plot(centers[i][0], centers[i][1], 'o', markerfacecolor=colors[i], markeredgecolor='k',
             markersize=6)  # 展示各聚类子集的中心
plt.show()  # 展示图像

结果:

总样本量: 1000 	 总特征数: 2
----------------------------------------------------------------------
ine	ARI	MI	AMI	homo	comp	v_m	silh	c&h
300	0.96	1.03	0.94	0.94	0.94	0.94	0.63	2860
----------------------------------------------------------------------
简写 	 全称
ine 	 样本距离最近的聚类中心的总和
ARI 	 调整后的兰德指数
MI 	 互信息
AMI 	 调整后的互信息
homo 	 同质化得分
comp 	 完整性得分
v_m 	 V-measure得分
silh 	 平均轮廓系数
c&h 	 Calinski和Harabaz得分

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章