机器学习中有很多算法,其中有一个很神奇的字母“K”,有许多基础算法与之有关,比如K近值分类算法、K近值回归算法、K-means聚类算法等等。在这里,我将对此做一个总结,希望对自己、对大家都能够有所帮助!
一、K-近邻算法
老实说,KNN算法应该算是分类算法中最简单的一种,很适合机器学习入门算法介绍。
KNN算法的原理很简单,对于某需要预测的分类点X,计算其与训练集中所有数据点之间的距离,从中选取距离最小的K个点,其中类别标签数量最多的即作为该分类点X的类别!
怎么样,听起来是不是很简单。是的,这种简单的分类算法不仅精度不差,而且对异常值不敏感;但是遗憾的是它的计算量太大,对于处理大规模数据十分吃力。
我们一步步来拆解这种算法:
(一) 数据集处理
KNN算法是通过比较各个测试集数据点与待预测点之间的距离来做判别,但是对于单个点的不同特征而言,所进行比较的标尺是不同的,比如说对于特征(身高cm,体重kg),很明显身高的值普遍大于体重的值,因此在距离计算过程中很容易导致体重对结果产生的影响力更加大。因此在导入数据集时,需要对数据集中的各个数据进行预处理,以下是两种归一化处理的方法:
1.最值归一化
r e s u l t = X − X m i n X m a x − X m i n result = \frac{X - X_{min}}{X_{max} - X_{min}} result=Xmax−XminX−Xmin
2.均值方差归一化
r e s u l t = X − X m e a n X v a r result = \frac{X - X_{mean}}{X_{var}} result=XvarX−Xmean
import numpy as np
#均值方差归一化
class StandardScaler(object):
def __init__(self):
self._mean = None;
self._scale = None;
def fit(self,X):
self._mean = np.array([np.mean(X[:,i]) for i in range(X.shape[1])]) #求出数据集每列的均值
self._scale = np.array([np.std(X[:,i]) for i in range(X.shape[1])]) #求出数据集每列的方差
return self;
def transform(self,X):
x = np.empty(X.shape,dtype=float);
for i in range(X.shape[1]):
x[:,i] = 1.0*(X[:,i]-self._mean[i])/self._scale[i] #归一化处理
return x;
#最值归一化
class Normalization(object):
def __init__(self):
self._min = None;
self._max = None;
def fit(self,X):
self._min = np.array([np.min(X[:,i] for i in range(X.shape[1]))]); #求出数据集每列的最小值
self._max = np.array([np.max(X[:,i] for i in range(X.shape[1]))]); #求出数据集每列的最大值
def transform(self,X):
x = np.empty(X.shape,detype = float);
for i in range(X.shape[1]):
x[:,i] = 1.0 * (X[:,i] - self._min[i])/(self._max[i] - self._min[i]); #归一化处理
return x;
(二)距离的把握
KNN算法的核心在于如何计算数据集中的各个数据点与待预测点之间的距离。
在KNN算法中最常用的有三种距离模型,当然还有其他很多有用的距离模型,笔者才学有限,就不多介绍了。
1. 曼哈顿距离
设有两个n维向量点X&Y,两者之间的曼哈顿距离为:
d i s t a n c e = ∑ i = 1 n ∣ ∣ X i − Y i ∣ ∣ distance = \sum_{i=1}^n ||X_i - Y_i|| distance=i=1∑n∣∣Xi−Yi∣∣
2.欧式距离
依然是两个n维向量点X&Y,二者之间的欧式距离为:
d i s t a n c e = ( ∑ i = 1 n ( X i − Y i ) 2 ) 1 2 distance =( \sum_{i=1}^n (X_i - Y_i)^2 )^{\frac{1}{2}} distance=(