k-邻近算法(k-Nearest Neighbors,简称k-NN)是一种常用的机器学习算法,用于分类和回归问题。k-NN的基本思想是:对于新的数据点,在训练集中找到距离它最近的k个邻居,根据这k个邻居的类别进行投票,得到新的数据点的类别。
邻近算法是数据挖掘分类技术中最简单的方法之一,是著名的模式识别统计学方法,在机器学习分类算法中占有相当大的地位。它是一个理论上比较成熟的方法。既是最简单的机器学习算法之一,也是基于实例的学习方法中最基本的,又是最好的文本分类算法之一。
所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的邻近算法。KNN是一种分类(classification)算法,它输入基于实例的学习(instance-based learning),属于懒惰学习(lazy learning)即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。与急切学习(eager learning)相对应。
有关讲解:
k近邻算法是一种基本分类和回归方法。本篇文章只讨论分类问题的k近邻法。
K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想)根据这个说法,咱们来看下引自维基百科上的一幅图:
如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。这也就是我们的目的,来了一个新的数据点,我要得到它的类别是什么?好的,下面我们根据k近邻的思想来给绿色圆点进行分类。
- 如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
- 如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
从上面例子我们可以看出,k近邻的算法思想非常的简单,也非常的容易理解,那么我们是不是就到此结束了,该算法的原理我们也已经懂了,也知道怎么给新来的点如何进行归类,只要找到离它最近的k个实例,哪个类别最多即可。
一个简单的列子
k-NN算法的步骤如下:
1. 计算新数据点与每个训练数据点的距离。
2. 对距离进行排序,找到距离最近的k个邻居。
3. 对于分类问题,统计这k个邻居的类别,出现次数最多的类别即为新数据点的类别。
4. 对于回归问题,计算这k个邻居的目标值的平均值,作为新数据点的预测值。
需要注意的是,k-NN算法的性能会受到k值的影响。较小的k值可能会受到噪声数据的影响,较大的k值可能会导致分类边界过于平滑。因此,选择合适的k值是k-NN算法应用的关键。
以下是一个使用Python和sklearn库实现k-NN分类的简单示例:
```python
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 标准化数据
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
# 创建k-NN分类器
knn = KNeighborsClassifier(n_neighbors=3)
# 训练分类器
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
```
在这个示例中,我们使用了iris数据集,将数据标准化后,使用k-NN分类器进行训练和预测。