K-Means聚类分析
概述
聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。
聚类旨在发现有用的对象簇,在现实中我们用到很多的簇的类型,使用不同的簇类型划分数据的结果是不同的,关于更多的簇介绍参考《数据挖掘导论》。
K-Means是基于原型的、划分的距离技术,它试图发现用户指定个数的簇。
K-Means算法
算法思想较为简单:
选择K个点作为初始质心 repeat 将每个点指派到距离其最近的质心 重新计算簇的质心 until 簇不发生变化或达到最大迭代次数k均值算法非常简单且使用广泛,但是其有主要的两个缺陷:
1. K值需要预先给定,属于预先知识,很多情况下K值的估计是非常困难的。
2. K-Means算法对初始选取的聚类中心点是敏感的,不同的随机种子点得到的聚类结果完全不同
3. K均值算法并不是很所有的数据类型。它不能处理非球形簇、不同尺寸和不同密度的簇。
K-Means算法实验示例
import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs plt.figure(figsize=(12, 12)) n_samples = 1500 random_state = 170 X,Y = make_blobs(n_samples = n_samples, random_state = random_state) # incorrect number of clusters Y_pred = KMeans(n_clusters = 2, random_state = random_state).fit_predict(X) plt.subplot(221) plt.scatter(X[:,0], X[:,1], c = Y_pred) plt.title('incorrect number of blobs') # anisotrapicly distributed data transformation = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]] X_aniso = np.dot(X, transformation) Y_pred = KMeans(n_clusters = 3, random_state = random_state).fit_predict(X_aniso) plt.subplot(222) plt.scatter(X_aniso[:,0], X_aniso[:,1], c = Y_pred) plt.title('anisotropicly distributed blobs') # different variance X_varied, Y_varied = make_blobs(n_samples = n_samples, cluster_std = [1,0, 2.5, 0.5], random_state = random_state) Y_pred = KMeans(n_clusters = 3, random_state = random_state).fit_predict(X_varied) plt.subplot(223) plt.scatter(X_varied[:,0], X_varied[:,1], c = Y_pred) plt.title('unequal variance') # unevenly sized blobs X_filtered = np.vstack((X[Y == 0][:500], X[Y == 1][:100], X[Y == 2][:10])) Y_pred = KMeans(n_clusters = 3, random_state = random_state).fit_predict(X_filtered) plt.subplot(224) plt.scatter(X_filtered[:,0], X_filtered[:,1], c = Y_pred) plt.title('unevenly sized blobs') plt.show()
在前三幅图中,输入数据不符合一些隐含假设,即k-均值使得产生不需要的聚类。在最后一幅图中,尽管尺寸不均匀,但k-means仍会返回直观的群集。