机器学习(五)——k-近邻算法进一步探究
机器学习(五)
——k-近邻算法进一步探究
(原创内容,转载请注明来源,谢谢)
一、概述
现采用k-近邻算法,进行分类应用。数据源采用《机器学习实战》提供的数据集,其中每个样本有3个特征值,约有1000个样本。
k近邻算法的基本思想,是根据现有的训练集,当新增一个需要判断的元素时,会计算该元素分别与现有的每个训练样本的距离。距离的计算公式是将该元素的3个特征值(本次实验是3个特征值),分别与每个样本3个对应特征值计算平方差,得到结果。距离公式如下图所示:
二、优化——归一化数值
1、背景
由于不同特征值对应的数值,本身大小差距很大,但是在考虑每个特征值时,可能每个特征值的权重是类似的,这样就会造成“不公平”。
例如:在评价一个篮球运动员的技术统计时,得分数差距(最多和最少)约40,失误数差距约4,不在一个量级,但是失误数量多5带来的负面因素远大于得分数多5,因此就形成了“不公平”。
此时,就需要用到归一化数值。
2、公式
归一化,即将每个数据都归到-1~+1的区间内,公式如下:
newvalue = (old value - min)/(max - min)
即,归一化后的结果等于原值与样本中该特征的最小值的差,除以样本中该特征最大值与最小值的差。
其中分子的算法,有的用到原值减去平均值,也有用到原值减去标准差,目的都在于把结果控制在-1~+1的区间。
3、归一化代码(python)
(为方便查看,用图片形式上传,步骤都已加注释)
三、实际应用
1)首先,需要将数据集取出,转成数组,当作样本,代码如下:
2)将数据归一化处理
即调用上述的autoNorm方法。
3)knn算法——计算距离、排序、取前k个、返回结果中分类最多的那个
4)测试算法效果
1-将文件取出,转成数组
2-数据归一化
3-将训练样本和测试数据集传入,计算误差率
返回结果如下:
经过计算,测试数据100个,误差5个,误差率5%
四、总结
经过编码过程,第一次正式接触机器学习的编程,几个感悟:
1、学习过程中,看书和视频同步进行,我看的视频偏理论,正好实战这本书是实践的,可以互相结合。
2、之前没怎么接触过python,现在接触,发现python真的是很轻巧灵活的,另外建议大家用python的时候,可以装anaconda管理工具。具体内容可以上网搜,装这个以后不需要再装python,在centos环境下,等于是一键安装。这个工具可以随意切换python版本,另外要下载python的库也非常方便。
3、python的numpy库,对于机器学习比较重要,在矩阵处理方面很灵活。
4、knn算法有个不足在于,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数,因此结果如果处于中立的情况下,更有可能是样本结果多的那个值。另外,knn算法由于不训练,是临时比较的,因此数据多的时候计算量很大。
——written by linhxx 2017.12.29
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux系统集群架构线上项目配置实战(三)
- Linux系统集群架构线上项目配置实战(四)
- Linux系统集群架构线上项目配置实战 五(完结篇)
- 生产Mysql数据库数据恢复实战过程
- voliate工作实际应用场景
- Linux三剑客命令之Awk
- 面试2万月薪必会知识:AQS
- MyBatis XML详解
- Linux三剑客命令之Sed
- Linux运维必会的100道MySql面试题之(四)
- 开源组件ELK日志系统配置与管理
- MySQL集群高可用架构之MHA
- MySQL 主从同步架构中你不知道的“坑”
- Nginx+keepalived高可用配置实战(内附彩蛋)
- MySQL 主从同步架构中你不知道的“坑”(完结篇)