K近邻(K-Nearest Neighbors)算法是一种基于实例的学习(instance-based learning)算法,主要用于分类和回归。这个算法的核心思想是:在数据集中,如果一个样本的最相似的K个样本中,大多数样本属于某一类别,则该样本也属于这个类别。
算法流程
- 确定样本的距离度量方式
- 给定测试样本,计算它与每一个样本之间的距离
- 对距离进行排序,选出距离最近的K个样本
- 统计K个样本中出现次数最多的类别,作为测试样本的类别
- 返回测试样本的类别
算法优点和缺点
K近邻算法的优点:
- 简单,易于理解和实现
- 对于数据的分布不作要求,不需要先验知识
- 可以适用于多分类、回归等问题
- 对缺失数据不敏感
K近邻算法的缺点:
- 对于特征空间维度很大的数据集,K近邻的效果容易受到影响
- 对于样本不平衡的数据集来说,K近邻算法有很大的缺陷。因为在 K 个近邻样本中,多数类别的样本数可能占到绝大多数,从而影响了算法结果的准确性。
- 当样本分布不均匀时,对新样本的分类结果较为敏感
- 需要大量的空间存储所有的样本数据
示例代码
下面我们用sklearn库中的KNeighborsClassifier类来实现K近邻算法的分类。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据
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.3)
# 使用K近邻算法进行分类
knn = KNeighborsClassifier(n_neighbors=3) # 选择K=3来作为例子
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
# 准确率评估
print("Accuracy:", accuracy_score(y_test, y_pred))
输出的准确率为:
Accuracy: 0.9777777777777777
以上是K近邻分类算法的一个简单例子。可以看到,使用sklearn库非常方便地实现了这个算法,同时准确率也非常高。
总结:
K近邻算法是一种简单易懂的基于实例的学习算法,不需要先验知识,可以适用于多分类、回归等问题。然而,在实际应用中,由于对维度较高的数据集、样本不平衡、空间存储等方面的限制,这个算法的效果可能会受到一定的影响。在实现上,使用sklearn库中的KNeighborsClassifier类可以非常方便地实现这个算法的分类。