一、K 近邻算法 (KNN)
- 是一种非参, 监督学习的分类器 (非参是指KNN不需要假设)
- 可用于解决分类和回归问题
- 根据点与点之间的距离来捕捉相似性
- Euclidean Distance-平方差求和再开方
- Manhattan Distance-坐标差的绝对值求和
- Hamming Distance
二、K 近邻算法实现步骤
KNN算法有三个重要的考虑因素:K值的选择、距离度量方式和分类决策规则
- 初始化 k 的大小, k 为近邻的数量 (k-the number of neighbor)
- 对于在数据集上的每个样本
- 假设我们有一个数据点
- 计算每个样本跟这个数据点的距离 (列表: 索引-距离)
- 按距离从小到大(升序)对该列表进行排序
- 获取前 k个距离最大的索引
- 用该索引获取标签
- 如果回归,则返回 K 个标签的平均值
- 如果是分类,返回 K 个类别标签
import numpy as np
from scipy.stats import mode
# 从零实现 KNN
def predict_datapoint(pt, Xtrain, Ytrain, k):
# For each datapoint in Xtrain, calculate the distance to pt and store
dists = np.linalg.norm(Xtrain-pt, axis=1)
# Sort the list of distances (hint: use np.argsort)
indices = np.argsort(dists)
# obtain the classes (in Ytrain) of the datapoints with the smallest distance to pt
classes = Ytrain[indices[:k]]
# return the mode of the classes
return mode(classes).mode[0]
def predict_data(Xtst, Xtrain, Ytrain, k=3):
#Loop over the datapoints in Xtst and store the prediction for that datapoint
preds = []
for x in Xtst:
preds.append(predict_datapoint(x, Xtrain, Ytrain, k))
# Return the predictions
return preds
# sklearn 实现 KNN
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
model=knn.fit(Xtrain, Ytrain)
Ypred=model.predict(Xtest)
np.all(my_Ypred==Ypred)
三、面试专题
1. 简述一下KNN算法的原理
专业解释
K-NN是一种用于分类和回归的非参数算法。给定一个数据点,它会查找训练集中与其最接近的“K”个邻居,并进行投票或平均以预测标签或值。
小白解释
想象你在一个新城市,你想找到一个好的餐厅。你可能会问附近的几个人 (邻居) 他们的建议,然后选择最多推荐的餐厅。
2. KNN算法的优缺点
优点:
- 简单易用, 既可以做分类也可以做回归, 时间复杂度为O(n)
- KNN是非参的, 无需前提假设, 不像线性回归需要假定数
- 与标签之间是线性关系
- 对异常值不敏感
缺点
- 计算量大,尤其是特征数非常多的时候
- 样本不平衡的时候,对稀有类别的预测准确率低
3. KNN 算法和 K-means 算法有什么区别
- K-means 是聚类算法,KNN 是分类或回归算法
- k-means 不需要标签,因此是无监督学习, 而KNN需要标签,因此是有监督的学习
4. 如何选择合适的 K 值
在应用中,k值一般取比较小的值,并采用交叉验证法进行调优
5. 如何解决类别不均衡问题
- 输入实例的K邻近点中,大数量类别的点会比较多,但其实可能都离实例较远. 方法: 使用权值来改进,距实例较近的点赋予较高的权值,较远的赋予较低的权值
- 我们限定最近邻的一个最大距离,也就是说,我们只在一个距离范围内搜索所有的最近邻
6. 如何解决计算量过大问题
先将样本按距离分解成组,获得质心,然后计算未知样本到各质心的距离,选出距离最近的一组或几组,再在这些组内引用KNN
四、参考资料
- Machine Learning Basics with the K-Nearest Neighbors Algorithm
- K-Nearest Neighbor
- KNN算法思路以及常见面试题
- KNN面试问题的总结
- 机器学习面试题之KNN
- 《机器学习高频面试题详解》1.5:K近邻(KNN)算法