复盘一篇浅谈KNN的文章
认识-什么是KNN
KNN 即 K-nearest neighbors, 是一个hello world级别, 但被广泛使用的机器学习算法, 中文叫K近邻算法, 是一种基本的分类和回归方法.
KNN既可用来分类, 也可用于回归, 不过我还是觉得分类好一些哦
KNN的核心思想是, 如果一个样本, 在特征空间中的K个最相邻的样本中的大多数属于某一个类别, 则该样本也属于该类别, 即"近朱者赤, 近墨者黑". 这样子兄嘚, 最通俗一点, 每个数据其实就是一个向量, 画成图就是一个点嘛, 每个样本就是一个点, 然后计算这个点到其他所有点的距离, 降序取前K个结果, 在这K个中, 看哪个占比多, 则该样本就属于哪一个类别.
所以, 一般在选取K的时候, 一般是选择奇数, 我猜这样可能是为了好投票.
如果能get到"计算距离和投票"这两个点, 则自然引出如下几个问题:
- K该如何取值?
- 计算距离, 距离这个词该怎么理解和计算呢?
- 每判断一个样本,要计算其到每个点的距离, 这个量有些大, 时间复杂度如何呢?
- 加入一个点离某个点非常之近, 此时另外2个也很近,且这两个点是一个类的, 那么投票的,它们有2票, 而我只有一票, 这该怎么办?
- 训练数据不均衡( (Imbalance data) 咋能呢?
- 特征维度量纲跨度大 ( 一列是整数, 一列是百分比) 如何消除量纲影响?
超参数 (Hyperparameter) K的选取
共同问题: 特征工程: 即特征选取, 样本均衡, 标准化 归一化, 编码等
其实我更喜欢翻译为操参数, 别误会, 是指需要人工去操作的参数, 好听些就是经验, 还是不够智能嘛.
超参数是在训练模型之前手动设置的参数, 而非模型训练中得到的参数数据. 比如:
- 训练神经网络的学习速率
- 学习速率 ( eg. 编写梯度下降原理时, 设置参数向量沿偏导数方向改变值的幅度 ,如0.2, 0.4等
- SVM的sigma超参数
- Knn的 k 值选取
KNN中, K越大则类与类的分界会越平缓, k越小则会越陡峭. 当k越小的时候, 就很容易过拟合了, 都搞成一团了, 这些点.
k取小了, 容易过拟合, 大了吧, 大量投票反而不准, 我好难.
交叉验证法 (Cross Validation)
为了验证模型靠不靠谱, 一般都会把数据分为训练数据和测试数据., 训练数据用来计算模型的, 测试数据用来验证的.
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了.
KNN中的距离
之前说了, 一个样本写成数字就是一个向量, 画出来, 就是一个有方向的箭头, 或者一个点呗.计算向量距离, 其实就是计量两个向量的相似性.
欧式距离
平面上有两个坐标点 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还是蛮好理解的哈.
复盘一篇浅谈KNN的文章的更多相关文章
- 复盘一篇讲sklearn库学习文章(上)
认识 sklearn 官网地址: https://scikit-learn.gor/stable/ 从2007年发布以来, scikit-learn已成为重要的Python机器学习库, 简称sklea ...
- 复盘一篇讲sklearn库的文章(下)
skleran-处理流程 获取数据 以用sklearn的内置数据集, 先导入datasets模块. 最经典的iris数据集作为例子. from sklearn import datasets iris ...
- javaweb回顾第五篇浅谈会话
1:什么是会话 通俗来说就是客户和服务器的一次私密谈话,客户发送请求以后服务器能够识别请求是来自同一个客户,他们是1对1的关系. 了解会话以后我们就要去考虑如何去实现这些问题下面一一进行解析 2:会话 ...
- 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释
浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈TCP IP协议栈(三)路由器简介
读完这个系列的第一篇浅谈TCP/IP协议栈(一)入门知识和第二篇浅谈TCP/IP协议栈(二)IP地址,在第一篇中,可能我对协议栈中这个栈的解释有问题,栈在数据结构中是一种先进后出的常见结构,而在整个T ...
- 浅谈jvm中的垃圾回收策略
下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...
- 浅谈cookie 和session 的区别
具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
随机推荐
- python开发笔记-python调用webservice接口
环境描述: 操作系统版本: root@9deba54adab7:/# uname -a Linux 9deba54adab7 --generic #-Ubuntu SMP Thu Dec :: UTC ...
- Docker 安装 ActiveMQ
搜索 ActiveMQ 镜像 docker search activemq 获取 ActiveMQ 镜像 docker pull webcenter/activemq 查看本地镜像 docker im ...
- SpringBoot Error creating bean with name 'dataSource' defined in class path resource。。。
启动spring boot项目出错 解决方法在Application类上增加:@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration ...
- ARM 链接脚本分析
分析连接脚本的语法规则 /* ---------------------------------------------------------------------------- * Memory ...
- Redis面试大全
1. 什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ...
- 查看表空间使用情况(SQL)
1: --查询表空间使用情况 2: SELECT Upper(F.TABLESPACE_NAME) "表空间名", 3: D.TOT_GROOTTE_ ...
- C# web项目乱码问题解决
在 web.config 文件中添加代码 <globalization requestEncoding="GB2312" responseEncoding="GB ...
- Kubernetes集群
Kubernetes已经成为当下最火热的一门技术,未来一定也会有更好的发展,围绕着云原生的周边产物也越来越多,使得上云更加便利更加有意义,本文主要讲解一些蔚来汽车从传统应用落地到Kubernetes集 ...
- ASP.NET-------GridView中的字段居中不了
在使用Grid View 控件的时候,回合一些css 放在一块使用之后你会发现 字段没有居中 你会发现该什么都不行 比如: HeaderStyle-HorizontalAlign="Cen ...
- windwos源码安装mysql
进入官网下载相关的mysql安装文件,解压到指定目录如E:\mysql-5.7.23-winx64下,然后进入该目录下新建data文件夹与my.ini文件,在my.ini文件中 [mysqld] po ...