K-Means聚类分析

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仍会返回直观的群集。

猜你喜欢

转载自blog.csdn.net/bedrock_stable/article/details/79863273