文章目录
1.1 KNN算法作分类(常见)
该算法只有模型,没有策略和算法部分
1.1 简述KNN算法
- 核心思想:
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最领近的k个实例,这k个实例的多数属于某个类,则就把该输入实例分成这个类。 - 算法:
输入:训练数据集(带标签)
输出:新的输入实例 x 所属的类y - KNN模型有何特点:
当训练集、距离度量、k值、决策规则确定下来后,对于任何一个新的实例,它所属的类唯一确定。所以说该算法的主要因素是:距离度量、k值、决策规则。 - 三要素
距离度量:一般采用欧氏距离(2范数)
k值如何确定:k值选择很小时,就意味着模型比较复杂,容易产生过拟合(例如邻近的点恰好是噪点,预测就会出错);k值选择较大时,意味着模型较为简单,就容易产生欠拟合。
一般先选择较小的k值,然后使用交叉验证法来选择最优的k值
决策规则:一般为多数表决,多数表决从某种程度上来说为经验风险最小化
1.2简述KNN算法的优缺点:
优点:
1.思想简单,理论成熟,既可以用来做分类也可以用来做回归。
2.训练时间复杂度为O(logN),如果采用kd-tree的话。
3.准确度高,对数据没有假设,对离群值不敏感。
缺点:
1.计算量大
2.样本不平衡问题(即有些类别的样本数量很多,而其他样本的数量很少)
3.需要大量内存。
1.3 不平衡样本可以给KNN预测结果造成哪些问题,有没有什么好的解决方式?
可能造成大数量的样本占多数,但是这类样本不接近目标样本。而数量小的这类样本很靠近目标样本。KNN不关心这个问题,他只关心哪类样本的数量最多,而不去把距离远近考虑在内。
改进方法:和该样本距离小的邻居权值大,远的权值小,有次讲距离远近因素也考虑在内,避免一个样本过大导致误判的情况。
1.4 为了解决KNN算法计算量过大问题,可以使用分组方式进行计算,简述一下该方法原理。
将样本集按近邻关系分解成组,给出每组的质心得位置,以质心作为代表点,和位置样本计算距离,选出距离最近的一个或若干个组,再在组的范围内应用一般KNN算法,由于并不是将位置样本与所有样本计算距离,故该计算可减少计算量,但不能减少存储量。
1.5 什么是曼哈顿距离和欧式距离?
不说了,没意思(L1范数和L2的别称)
1.6 为什么用欧式不用曼哈顿?
我们不用曼哈顿距离,因为它只计算水平或垂直距离,有维度的限制。另一方面,欧氏距离可用于任何空间的距离计算问题。因为,数据点可以存在于任何空间,欧氏距离是更可行的选择。例如:想象一下国际象棋棋盘,象或车所做的移动是由曼哈顿距离计算的,因为它们是在各自的水平和垂直方向做的运动。
1.7 简述kd-tree的构造和搜索过程
参考《李航统计学方法》,同时注意一下:
-
选择的特征与树的深度有关
-
时间复杂度为O(logN)
-
树的深度和数据的分布密切相关。
-
具体的构造及搜索过程在这里不说了,好好看看书 ,想看博客的话我就贴个连接吧(其实李航书上讲的很清楚了,面试前多看两遍就好了)
kd-tree -
最后,我想说:kd树适用于训练实例数远大于空间维度的数据搜索,当训练实例小于或接近特征向量的维度时,算法时间复杂度会变成近似线性。
2. KNN来做回归
- 其实就是将k个邻居加起来求平均然后输出,这样输出就是连续值了。