k近邻和k-means,听名称很相似,很容易张冠李戴。其实它们的全名为K近邻分类算法(k-Neighbour,KNN)和K均值聚类算法(K-means clustering algorithm)。
k近邻(k-neareast neighbor)的直观理解就是:给定一个训练数据集 T = { ( x i , y i ) , ⋯ , ( x n , y n ) } T = \left \{ \left ( x_{i}, y_{i} \right ), \cdots, \left ( x_{n}, y_{n} \right ) \right \} T={(xi,yi),⋯,(xn,yn)},对于新的实例 x x x,在训练集中找到与之相邻的k个实例 N k ( x ) N_{k}\left( x\right) Nk(x),这 k k k个实例的多数属于哪一类,就把这个实例分到哪一类中。可知, k k k值的选择 ,距离度量 和 分类决策规则 作为k近邻的三要素。
k近邻的分类决策通常会使用多数表决法。新实例 x x x的k个最近训练实例点多数属于哪一类别,新实例 x x x就属于哪一类别。
k k k值是k近邻算法中的超参数。如果 k k k值过小,容易发生过拟合,输入实例对与其邻近的实例点很敏感;如果 k k k值过大,容易发生欠拟合,与输入实例距离较远的实例点也会参与到预测中,干扰预测。一般情况下,会使用交叉验证的方法取合适的 k k k值。
我们定义特征空间中的两个实例点的距离反映两个实例点的相似程度。对于k紧邻算法,它的的特征空间一般是 n n n维实向量空间 R n \mathbb{R}^{n} Rn。假设特征空间为 χ \chi χ,为 n n n维实向量空间 R n \mathbb{R}^{n} Rn,其中有两点为 x i , x j x_{i}, x_{j} xi,xj,分别表示为 x i = ( x i 1 , ⋯ , x i n ) T , x j = ( x j 1 , ⋯ , x j n ) T x_{i} = \left ( x_{i}^{1}, \cdots, x_{i}^{n} \right )^{T}, x_{j} = \left ( x_{j}^{1}, \cdots, x_{j}^{n} \right )^{T} xi=(xi1,⋯,xin)T,xj=(xj1,⋯,xjn)T。
L p L_{p} Lp定义为:
L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i l − x j l ∣ p ) 1 p ≥ 1 L_{p}\left ( x_{i} , x_{j} \right ) = \left ( \sum_{l=1}^{n} \left | x_{i}^{l} - x_{j}^{l} \right |^{p} \right )^{\frac{1}{p}} \qquad \geq 1 Lp(xi,xj)=(l=1∑n∣∣xil−xjl∣∣p)p1≥1
当 p = 2 p=2 p=2时,就是我们常见的欧式距离(Euclidean distance):
L 2 ( x i , x j ) = ∑ l = 1 n ∣ x i l − x j l ∣ 2 L_{2}\left ( x_{i} , x_{j} \right ) = \sqrt{ \sum_{l=1}^{n} \left | x_{i}^{l} - x_{j}^{l} \right |^{2} } L2(xi,xj)=l=1∑n∣∣xil−xjl∣∣2
当 p = 1 p=1 p=1时,被称为马哈顿距离(Manhattan distance):
L 1 ( x i , x j ) = ∑ l = 1 n ∣ x i l − x j l ∣ L_{1}\left ( x_{i} , x_{j} \right ) = \sum_{l=1}^{n} \left | x_{i}^{l} - x_{j}^{l} \right | L1(xi,xj)=l=1∑n∣∣xil−xjl∣∣
当 p = ∞ p=\infty p=∞时,为各个坐标距离的最大值 :
L ∞ ( x i , x j ) = m a x ∣ x i l − x j l ∣ L_{\infty}\left ( x_{i} , x_{j} \right ) = max \left | x_{i}^{l} - x_{j}^{l} \right | L∞(xi,xj)=max∣∣xil−xjl∣∣
k-means是一种聚类算法,是无监督学习算法。假设有训练数据 T = { x i , ⋯ , x n } T = \left \{ x_{i}, \cdots,x_{n} \right \} T={xi,⋯,xn},它将训练数据分为k组,每一组是一个簇,随机选择k个实例作为初始的聚类中心点,对于每一个实例,计算它和这k个聚类中心的距离,然后把它分配到与它距离最近的聚类中心所在的簇中去;计算每个簇中所有实例的平均值,作为新的聚类中心点,以此往复,直至聚类中心点不再发生明显变化。
k-means算法最后得到k个簇,记为 C = { C 1 , ⋯ , C k } C = \left\{ C_{1}, \cdots, C_{k}\right\} C={C1,⋯,Ck},每个簇内的实例相似度高,不同簇中的实例相似度低。计算实例点和聚类中心点的距离一般可以使用欧氏距离。