无监督学习(unsupervised learning)
没有已知标签的训练集,只给一堆数据集,通过学习去发现数据内在的性质及规律。
K-Means聚类算法步骤
- 随机取k个样本作为初始均值向量(或者采用别的方式获取初始均值向量);
- 根据每个样本与均值向量的距离来判断各个样本所属的蔟。
- 根据分好的蔟再次计算新的均值向量,根据新的均值向量再对每个样本进行划分。
- 循环步骤2,3,直到分类结果相同或者在我们规定的误差范围内时中止。
如何选择合适的k(即应当把数据聚成几类?)
K-means 算法需要你先确定把数据分成几类,当你面对一个庞大的多维数据集时,你也不知道应该将数据分成几类比较好,这个时候就需要有一些适当的方法来进行判断。
1. Elbow method
一般得到的曲线拐点不是很明显,较难确定最佳的k值。
2. Average silhouette method
计算聚成不同的类时的轮廓系数(silhouette score),系数越大说明聚类的效果越好。
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
K = range(1,15)
KM = [KMeans(n_clusters=k).fit(normalized_features) for k in K] # clustering
# Average silhouette method
s = []
for k_means in KM[1:]:
labels = k_means.labels_
centroids = k_means.cluster_centers_
# calculate silhouette_score
s.append(silhouette_score(normalized_features, labels, metric='euclidean'))
K-means 算法优缺点
K-means 算法优点
- 算法框架清晰,简单,容易理解。
- 本算法确定的k个划分到达平方误差最小。当聚类是密集的,且类与类之间区别明显时,效果较好。
- 对于处理大数据集,这个算法是相对可伸缩和高效的,计算的复杂度为O(NKt),其中N是数据对象的数目,t是迭代的次数。一般来说,K<<N,t<<N 。
K-means 算法缺点
- K-means算法中k是事先给定的,这个k值的选定是非常难以估计的。
- 算法的时间开销是非常大的。
- K-means算法对异常数据很敏感。在计算质心的过程中,如果某个数据很异常,在计算均值的时候,会对结果影响非常大。