kNN就是k近邻算法,用于监督式分类,kNN中的k代表距离最近的k个样本。K-means是聚类算法,非监督式,k-means中的k代表聚类的个数.两者唯一的相似点时均利用近邻信息来标注类别。
K近邻算法
原理
输入: 训练数据集:
其中$x_i \in R^n$为特征向量,$y \in {c_1,c_2,…c_K}$为类别
输出: 实例$x$对应的类$y$
- 根据给定的距离度量,在训练集中找出与$x$最近的K个点
- 在这K个点中多数投票原则决定$x$的类别.
当K=1的时候称为最近邻原则,即距离谁最近就分到谁的那一类中.
步骤很简单,但是有两个关键问题:距离度量和计算最近点
距离度量
一般距离度量使用$L_p$距离:
当$p=2$时称为欧式距离:
当$p=1$时程为曼哈顿距离:
当$p=\infty$时时各个坐标距离的最大值:
这个需要证明:
而
故由夹逼定理即可得出.
计算最近点
可以线性扫描,但是非常耗时,一般采用$kd$树的方式。
K-means
传统K-means
原理
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如果用数据表达式表示,假设簇划分为$(C1,C2,…Ck)$则我们的目标是最小化平方误差$E$:
其中$\mu_i$是$(C1,C2,…Ck)$每个簇的质心:
算法流程
- 在训练样本中随机初始化K(提前确定)个质心。
- 计算训练样本与各个质心的距离
- 根据上诉距离划分K个簇(对于一个点$x_i$到各个质心的距离,该点距离哪个近就归到哪一类中)
- 根据公式(2)重新计算每个簇的质心,更新为
- 重复步骤2~4,直到
K-means++
传统K-means最大的缺陷在于初始化$\mu_1,\mu_2,…,\mu_K$的选择很重要,K_means++就是在输出化质心的选择上面做文章
- 随机选取一个质心$\mu_1$
- 计算训练样本${x_1,x_2,…,x_N}$中所有样本到当前已经确定的初始质心的距离的最小值,记作$d_1,d_2,…d_k$(k表示当前已知的质点数.比如说现在已经确定的质心有两个$\mu_1,\mu_2$,先计算所有样本到$\mu_1$的距离,取距离最小的那个样本记作$d_1$,在计算所有样本到$\mu_2$的距离,取距离最小的那个样本记作$d_2$)。
- 计算上诉得到的样本被选择的概率:也就是说最小距离大的点有更大的概率被选择
- 重复1~3,直到选够K个质心作为初始质心.