当前位置: 首页 > news >正文

KNN算法介绍 | 沙湖王

KNN算法介绍 | 沙湖王

KNN算法介绍

   KNN算法是机器学习里面比较简单的一个分类算法了,整体思想比较简单:计算一个点A与其他所有点之间的距离,取出与该点最近的k个点,然后统计这k个点里面所属分类比例最大的,则点A属于该分类。这样讲可能还有点迷糊,下面用一个例子来说明一下:

 

 

 
好书推荐
 
 
公众风潮:互联网海啸
(美)查伦・李 (平装 - …
¥ 35.70
大数据技术丛书:新机器的灵魂
基德尔(Tracy Kidd…
¥ 33.80
精益创业:新创企业的成长思维
埃里克•莱斯(Eric Ri…
¥ 35.28
未来是湿的:无组织的组织力量(互联网界人人必读)
克莱·舍基 (平装 - M…
¥ 28.26
1 2 3 4 5 >
Amazon.cn 隐私
 
 
获得Widget
 
Amazon.cn Widgets

 

电影名称打斗次数接吻次数电影类型
California Man 
 
3104Romance
He’s Not Really into Dudes 
 
2100Romance
Beautiful Woman 
 
181Romance
Kevin Longblade 
 
10110Action
Robo Slayer 3000 
 
995Action
Amped II 
 
982Action
未知1890Unknown

简单说一下这个数据的意思:这里用打斗次数和接吻次数来界定电影类型,如上,接吻多的是Romance类型的,而打斗多的是动作电影。还有一部名字未知(这里名字未知是为了防止能从名字中猜出电影类型),打斗次数为18次,接吻次数为90次的电影,它到底属于哪种类型的电影呢?

KNN算法要做的,就是先用打斗次数和接吻次数作为电影的坐标,然后计算其他六部电影与未知电影之间的距离,取得前K个距离最近的电影,然后统计这k个距离最近的电影里,属于哪种类型的电影最多,比如Action最多,则说明未知的这部电影属于动作片类型。

在实际使用中,有几个问题是值得注意的:K值的选取,选多大合适呢?计算两者间距离,用哪种距离会更好呢(欧几里得距离等等几个)?计算量太大怎么办?假设样本中,类型分布非常不均,比如Action的电影有200部,但是Romance的电影只有20部,这样计算起来,即使不是Action的电影,也会因为Action的样本太多,导致k个最近邻居里有不少Action的电影,这样该怎么办呢?

没有万能的算法,只有在一定使用环境中最优的算法,所以,要懂得合适利用算法。

光是介绍算法,没有实现出来也没有意思。我这里用的是scikit-learn这个Python的机器学习包,感觉它的文档写得特别好,对于文档写得好的开源软件就是有爱呀。下面是简单的代码:

 

 

1
2
3
4
5
6
7
import numpy as np
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier() #取得knn分类器
data = np.array([[ 3 , 104 ],[ 2 , 100 ],[ 1 , 81 ],[ 101 , 10 ],[ 99 , 5 ],[ 98 , 2 ]])
labels = np.array([ 1 , 1 , 1 , 2 , 2 , 2 ])
knn.fit(data,labels) #导入数据进行训练,data对应着打斗次数和接吻次数,而labels则是对应Romance和Action,因为这里只能接受整数类型的数组
knn.predict([ 18 , 90 ])

上面的代码这里简单解释一下:

首先,我用labels数组中的1和2代表Romance和Aciton,因为sklearn不接受字符数组作为标志,只能用1,2这样的int型数据来表示,后面处理可以将1和2映射到Romance和Action上来。

fit则是用data和labels进行训练,data对应的是打斗次数和接吻次数构成的向量,称之为特征向量。labels则是这个数据所代表的电影所属的类型。

predict则是进行预测了,将未知电影的特征向量代入,则能分析出该未知电影所属的类型。这里的结果是1,也就是该未知电影属于Romance。

 

相关文章:

  • MySQL主从同步设置和同步错误处理
  • Mysql note 2
  • Android拓展系列(8)--Vim插件便捷管理(使用git submodule和pathogen)
  • DHCP中继与vlan的隔离
  • poj 3041 Asteroids(二分图最小顶点覆盖)
  • linux下rsync+inotify实现文件时实同步
  • Windows批处理生成目录树
  • Linux中安装.rpm、.tar和.tar.gz或.tgz包
  • PHP Memcache(一):windows mencache安装
  • Linux内核Power Management配置注释
  • 惨痛的经历
  • Nagios监控原理
  • C# Execl图片插入
  • New Concept English 1 汇总
  • webservice-demo
  • CentOS7 安装JDK
  • Docker容器管理
  • es的写入过程
  • HashMap ConcurrentHashMap
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript类型识别
  • Spring声明式事务管理之一:五大属性分析
  • Vue.js-Day01
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 构建二叉树进行数值数组的去重及优化
  • 离散点最小(凸)包围边界查找
  • 手机端车牌号码键盘的vue组件
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小程序开发中的那些坑
  • 责任链模式的两种实现
  • Mac 上flink的安装与启动
  • 进程与线程(三)——进程/线程间通信
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #laravel 通过手动安装依赖PHPExcel#
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $.ajax,axios,fetch三种ajax请求的区别
  • (4)logging(日志模块)
  • (7)STL算法之交换赋值
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (篇九)MySQL常用内置函数
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)visual stdio 书签功能介绍
  • (转)项目管理杂谈-我所期望的新人
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 发展历程
  • .net 生成二级域名
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET使用存储过程实现对数据库的增删改查