聚类是无监督学习问题,没有标签,难点在于模型评估及调参。
假设我们想要将数据聚类成 K K K个组,K-means方法的工作流程为:
Kmeans可视化
K-means最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为:
J ( c ( 1 ) , . . . , c ( N ) ; μ 1 , . . . , μ k ) = 1 N ∑ i = 1 N ∥ x ( i ) − u c ( i ) ∥ 2 J(c^{(1)},...,c^{(N)};\mu_1,...,\mu_k)=\frac{1}{N}\sum_{i=1}^{N}\Vert x^{(i)}-u^{c(i)}\Vert^2 J(c(1),...,c(N);μ1,...,μk)=N1i=1∑N∥x(i)−uc(i)∥2
其中, N N N为样本个数, μ c ( i ) \mu_{c^{(i)}} μc(i)表示与样本 x ( i ) x^{(i)} x(i)最近的聚类中心点。
K-means算法具有如下特点,
K-means的目标是将样本集划分为K个簇,使得同一个簇内样本的距离尽可能小,不同簇之间的样本距离尽可能大,即最小化每个簇中样本与质心的距离。K-means属于原型聚类(prototype-based clustering),原型聚类指聚类结构能通过一组原型刻画,而原型即为样本空间中具有代表性的点。在K-means中,这个原型就是每个簇的质心 μ \mu μ。
从EM算法的观点来看,K-means的参数就是每个簇的质心 μ \mu μ,隐变量为每个样本的所属簇。如果事先已知每个样本属于哪个簇,则直接求平均即可得到 μ \mu μ。但现实中不知道的情况下,则需要运用EM的思想:
假设有 K K K个簇,先随机选定 K K K个点作为质心 μ 1 , μ 2 , . . . , μ k \mu_1,\mu_2,...,\mu_k μ1,μ2,...,μk:
上面两步分别更新 r n k r_{nk} rnk和 μ k \mu_k μk就对应了EM算法中的E步和M步。和EM算法一样,K-means每一步都最小化目标函数 J J J,因而可以保证收敛到局部最优值,但在非凸目标函数的情况下不能保证收敛到全局最优值。
应用:
图像压缩:将像素点聚类。
输入:数据集 D D D,半径 ϵ \epsilon ϵ,密度阈值 M i n P t s MinPts MinPts。
k-距离:
给定数据集 P = p ( i ) ; i = 0 , 1 , … n P={p(i); i=0,1,…n} P=p(i);i=0,1,…n,对于任意点 P ( i ) P(i) P(i),计算点 P ( i ) P(i) P(i)到集合 P P P的子集 S = p ( 1 ) , p ( 2 ) , … , p ( i − 1 ) , p ( i + 1 ) , … , p ( n ) S={p(1), p(2), …, p(i-1), p(i+1), …, p(n)} S=p(1),p(2),…,p(i−1),p(i+1),…,p(n)中所有点之间的距离,距离按照从小到大的顺序排序,假设排序后的距离集合为 D = d ( 1 ) , d ( 2 ) , … , d ( k − 1 ) , d ( k ) , d ( k + 1 ) , … , d ( n ) D={d(1), d(2), …, d(k-1), d(k), d(k+1), …,d(n)} D=d(1),d(2),…,d(k−1),d(k),d(k+1),…,d(n),则 d ( k ) d(k) d(k)就被称为k-距离。也就是说,k-距离是点 p ( i ) p(i) p(i)到所有点(除了 p ( i ) p(i) p(i)点)之间距离第k近的距离。对待聚类集合中每个点 p ( i ) p(i) p(i)都计算k-距离,最后得到所有点的k-距离集合 E = e ( 1 ) , e ( 2 ) , … , e ( n ) E={e(1), e(2), …, e(n)} E=e(1),e(2),…,e(n)。
根据经验计算半径Eps:
根据得到的所有点的k-距离集合 E E E,对集合 E E E进行升序排序后得到k-距离集合 E ’ E’ E’,需要拟合一条排序后的 E ’ E’ E’集合中k-距离的变化曲线图,然后绘出曲线,通过观察,将急剧发生变化的位置所对应的k-距离的值,确定为半径Eps的值。
根据经验计算最少点的数量MinPts:
确定MinPts的大小,实际上也是确定k-距离中k的值,一般取得小一些,多次尝试。
优势:
劣势:
DBSCAN可视化
s ( i ) = b ( i ) − a ( i ) max { a ( i ) , b ( i ) } s(i)=\frac{b(i)-a(i)}{\max \{a(i),b(i)\}} s(i)=max{a(i),b(i)}b(i)−a(i)
s ( i ) = { 1 − a ( i ) b ( i ) , a ( i ) < b ( i ) 0 , a ( i ) = b ( i ) a ( i ) b ( i ) − 1 , a ( i ) > b ( i ) s(i)=\begin{cases} 1-\frac{a(i)}{b(i)},\quad a(i)b(i) \end{cases} s(i)=⎩⎪⎨⎪⎧1−b(i)a(i),a(i)<b(i)0,a(i)=b(i)b(i)a(i)−1,a(i)>b(i)
>>> from sklearn import metrics
>>> scores = []
>>> for k in range(2,20):
>>> labels = KMeans(n_clusters=k).fit(X).labels_
>>> score = metrics.silhouette_score(X, labels)
>>> scores.append(score)
>>> scores#不同k的轮廓系数
[0.6917656034079486,
0.6731775046455796,
0.5267665961530135,
0.422548733517202,
0.4559182167013377,
0.43776116697963124,
0.38946337473125997,
0.39746405172426014,
0.3915697409245163,
0.32472080133848924,
0.3459775237127248,
0.31221439248428434,
0.30707782144770296,
0.31834561839139497,
0.2849514001174898,
0.23498077333071996,
0.1588091017496281,
0.08423051380151177]
————————————————
参考:
DBSCAN聚类原理