聚类算法
聚类的概念:
- 主要用来处理无监督问题,因为我们手上没有标签了,靠电脑自己进行分类
- 聚类是指把相似的东西分到一组
- 难点
- 如何评估呢(因为没有了标签,难以对比正确与否,很多评估方法失效了)
- 如何调参呢
K-MEANS的概念
- K是指要得到的簇的数量,如下图所示应该要得到三个簇,K值需要我们自己指定
- 质心
- 其实是均值,如上图中的小红点,取向量各位的平均值
- 距离的度量
- 常常使用欧氏距离和预先相似度,不过要先进行标准化,令不同坐标的取值都在0~1之间
- 优化目标
- 说白了就是想让每个簇中所有的点到中心点的距离越小越好
- 公式如下:
m i n ∑ i = 1 K ∑ x ∈ C i d i s t ( c i , x ) 2 min\sum_{i=1}^{K}\sum_{x\in C_i}^{}dist(c_i,x)^2 mini=1∑Kx∈Ci∑dist(ci,x)2
K-MEANS算法的工作流程
优势
- 简单快速,比较适合于常规的数据集
劣势
- K值很难确定,有时候需要大量的尝试
- 复杂度于样本呈线性关系(其实我感觉复杂度也不是很高,不知道是不是我理解上出了问题)
- 很难发现任意形状的簇,比如两个簇呈环形的关系
推荐一个可视化展示K-MEANS的网站,大家通过尝试可以更加直观地理解聚类K-MEANS算法的工作流程
- 一打开网站如下
- 随机选一个类型进入,这里我试试Gaussian Mixture
- 他给随机分好了三堆,那我们尝试一下添加中心点,比如此处我们添加三个中心点吧
- 我们再点击Go就好,就能模拟出上述讲过的流程了
通过K-MEANS聚类算法实现图像的压缩
- 这个压缩很暴力
- 压缩出来是一个面目全非的灰度图,而且建议大家拿个小图去试,大图要跑好久好久
from skimage import io
from sklearn.cluster import KMeans
import numpy as np
image = io.imread('1.jpg')
io.imshow(image)
io.show()
row = image.shape[0]
col = image.shape[1]
print(row)
print(col)
image = image.reshape(row*col, 3)#压缩图像,压缩到一列,和三个颜色维度
1080
1920
kmeans = KMeans(n_clusters=128, n_init=10, max_iter=200)#分成128个簇了,因为一开始图像的rgb颜色通道数值取值范围是0~255,此处想压缩一到原来的一半,因此分成128个簇,原本像素靠近哪个就归类于哪个簇中,归类到的簇当成是最后的rgb值,其余两个参数都没那么重要,max_iter是最大的迭代次数
kmeans.fit(image)
clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)
labels = np.asarray(kmeans.labels_, dtype=np.uint8)
labels = labels.reshape(row, col)
io.imshow(labels)
io.show()
对唐宇迪老师的机器学习教程进行笔记整理
编辑日期:2018-10-12
小白一枚,请大家多多指教