KNN 即 K-nearest neighbors, 是一个hello world级别, 但被广泛使用的机器学习算法, 中文叫K近邻算法, 是一种基本的分类和回归方法.
KNN既可用来分类, 也可用于回归, 不过我还是觉得分类好一些哦
KNN的核心思想是, 如果一个样本, 在特征空间中的K个最相邻的样本中的大多数属于某一个类别, 则该样本也属于该类别, 即"近朱者赤, 近墨者黑". 这样子兄嘚, 最通俗一点, 每个数据其实就是一个向量, 画成图就是一个点嘛, 每个样本就是一个点, 然后计算这个点到其他所有点的距离, 降序取前K个结果, 在这K个中, 看哪个占比多, 则该样本就属于哪一个类别.
所以, 一般在选取K的时候, 一般是选择奇数, 我猜这样可能是为了好投票.
如果能get到"计算距离和投票"这两个点, 则自然引出如下几个问题:
共同问题: 特征工程: 即特征选取, 样本均衡, 标准化 归一化, 编码等
其实我更喜欢翻译为操参数, 别误会, 是指需要人工去操作的参数, 好听些就是经验, 还是不够智能嘛.
超参数是在训练模型之前手动设置的参数, 而非模型训练中得到的参数数据. 比如:
- 训练神经网络的学习速率
- 学习速率 ( eg. 编写梯度下降原理时, 设置参数向量沿偏导数方向改变值的幅度 ,如0.2, 0.4等
- SVM的sigma超参数
- Knn的 k 值选取
KNN中, K越大则类与类的分界会越平缓, k越小则会越陡峭. 当k越小的时候, 就很容易过拟合了, 都搞成一团了, 这些点.
k取小了, 容易过拟合, 大了吧, 大量投票反而不准, 我好难.
为了验证模型靠不靠谱, 一般都会把数据分为训练数据和测试数据., 训练数据用来计算模型的, 测试数据用来验证的.
The Validation Set Approach
Cross-Validatioin
The Validation Set Approach (训练集+测试集), 训练数据越多,当然就越好啦, 但这里又要分出一部分做测试, 即不能充分利用样本.这是不足之处.
基于此, 有个大兄弟就是提出了交叉验证法(Cross-Validation)
k-fold cross-validation, 指把所有训练数据折成K份. 假设将训练数据分为5折. 如当k=1的时候的, 可得到5个准确率, 取平均值作为超参数K=1时候的准确率. 探后继续算k=3, k=5, k=7.. 这样就可以就可选取到一个准确最高的超参数K了.
之前说了, 一个样本写成数字就是一个向量, 画出来, 就是一个有方向的箭头, 或者一个点呗.计算向量距离, 其实就是计量两个向量的相似性.
平面上有两个坐标点 A(x1, y1), B(x2, y2) 则欧式距离为:
$$
d(A,B) = \sqrt{(x2-x1)^2+(y2-y1)^2}
$$
推广到高维空间的两个点(向量) a向量, (x1, x2, x3, ...), b点(向量), (y1, 12, y3, y4...)的距离为:
$$
d(a,b)=\sqrt{(y1-x1)^2+(y2-x2)^2+...(yn-xn)^2} = \sqrt{\sum_{i=1}^{n}(xi-yi)^2}
$$
指向量在各坐标轴上投影的距离总和. 曼哈顿距离也称为城市街区距离. 好比你现在要从一个十字路口开车到另一个路口, 中间有楼挡着, 显然不能穿墙吧, 直线距离就不太适用了. 而实际上你开车绕过弯路才到的距离, 才是"曼哈顿距离".
$$
d12 = \sum_{k=1}^{n}|x_{1k}-x_{2k}|
$$
由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出,表示数据的协方差距离。是一种有效的计算两个未知样本集的相似度的方法。
与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离。
$$
d = ((\vec x - \vec y)‘C^{-1}(\vec x - \vec y))^{\frac {1}{2}}
$$
KNN算法的时间复杂度是O(N), 这里举两个思路方向, 就不阐释了
K-D tree
LSH
其实就是设置权重呗, 总体感觉knn还是蛮好理解的哈.
原文地址:https://www.cnblogs.com/chenjieyouge/p/11701611.html