聚类算法及python实现——K-means
给定K个类,聚类原则:类内高相似度,类间低相似度
步骤
step1:随机选择K个点,作为初始聚类中心
step2:其余点根据到聚类中心的距离,划分到距离最近的类
step3:计算每个类内所有点的均值,作为新的聚类中心
step4:重复step2、step3,直至聚类中心不再发生变化
python代码
import numpy as np
from sklearn.cluster import KMeans
km = KMeans(n_clusters = 3) # n_cluster表示聚类个数
label = km.fit_predict(data) # data为无标签的数据
一般情况下,只需要给定n_clusters即可。
优势
(1)原理简单,易实现
(2)可解释性强
缺陷及改进
(1)实际K值难确定(在开始给定K,后续合并类)
(2)聚类效果依赖初始聚类中心的选择(K-means++)
(3)对异常点敏感(离群点检测再聚类,K中值聚类)
(4)迭代求解,局部最优
(5)对不是凸集难收敛(基于密度的聚类)
对凸集的解释,如下,左凸右不凸
数据集中任意两点的连线上的点在数据集内,就是凸数据集。
另外,Sklearn中的K-means默认使用欧式距离。若要使用其他距离,在此处更改KMeans源码
def euclidean_distances()
例如可改为余弦距离
scipy.spatial.distance.cdist(A,B,metric = 'cosine')