机器学习算法_knn(福利)
这两天翻了一下机器学习实战这本书,算法是不错,只是代码不够友好,作者是个搞算法的,这点从代码上就能看出来。可是有些地方使用numpy搞数组,搞矩阵,总是感觉怪怪的,一个是需要使用三方包numpy,虽然这个包基本可以说必备了,可是对于一些新手,连pip都用不好,装的numpy也是各种问题,所以说能不用还是尽量不用,第二个就是毕竟是数据,代码样例里面写的只有几个case,可是实际应用起来,一定是要上数据库的,如果是array是不适合从数据库中读写数据的。因此综合以上两点,我就把这段代码改成list形式了,当然,也可能有人会说我对numpy很熟悉啊,而且作为专业的数学包,矩阵的运算方面也很方便,我不否定,那我这段代码恐怕对你不适合,你可以参考书上的代码,直接照打并理解就好了。
knn,不多说了,网上书上讲这个的一大堆,简单说就是利用新样本new_case的各维度的数值与已有old_case各维度数值的欧式距离计算
欧式距离这里也不说了,有兴趣可以去翻我那篇python_距离测量,里面写的很详细,并用符号展示说明,你也可以改成棋盘距离或街区距离试试,速度可能会比欧式距离快,但还是安利欧式距离。
有一点没搞明白的就是,对坐标进行精度化计算这块,实测后确定使用直接计算无论是错误率还是精度,处理前都要比处理后更准确,可能原代码使用小数点的概率更高些吧,也许这个计算对于小数计算精度更有帮助
闲话一些,不多也不少,下面上代码,代码中配有伪代码,方便阅读,如果还看不太明白可以留言,我把详细注释加上
以下是代码中使用颜色,选用html的16进制RGB颜色,在应用时将其转换为10进制数字计算,old_case选取红色圈,new_case选取橙色圈
紫色(茄子颜色)

绿色(黄瓜颜色)

黄色(香蕉颜色)

淡绿(西葫芦颜色)

代码见下
#!/usr/bin//python
# coding: utf-8 '''
1、获取key和coord_values,样例使用的是list,但是如果真正用在训练上的话list就不适合了,建议改为使用数据库进行读取
2、对坐标进行精度化计算,这个其实我没理解是为什么,可能为了防止错误匹配吧,书上是这样写的
3、指定两个参数,参数一是新加入case的坐标,参数二是需要匹配距离最近的周边点的个数n,这里赢指定单数
4、距离计算,使用欧式距离
新加入case的坐标与每一个已有坐标计算,这里还有优化空间,以后更新
计算好的距离与key做成新的key-value
依据距离排序
取前n个case
5、取得key
对前n个case的key进行统计
取统计量结果最多的key即是新加入case所对应的分组
6、将新加入的values与分组写成key-value加入已有的key-value列队
输入新的case坐标,返回第一步......递归
''' import operator def create_case_list():
# 1代表黄瓜,2代表香蕉,3代表茄子,4代表西葫芦
case_list = [[25,3,73732],[27.5,8,127492],[13,6,127492],[16,13,50331049],[17,4,18874516],[22,8,13762774],[14,1,30473482],[18,3,38338108]]
case_type = [1,1,2,2,3,3,4,4]
return case_list,case_type def knn_fun(user_coord,case_coord_list,case_type,take_num):
case_len = len(case_coord_list)
coord_len = len(user_coord)
eu_distance = []
for coord in case_coord_list:
coord_range = [(user_coord[i] - coord[i]) ** 2 for i in range(coord_len)]
coord_range = sum(coord_range) ** 0.5
eu_distance.append(coord_range)
merage_distance_and_type = zip(eu_distance,case_type)
merage_distance_and_type.sort()
type_list = [merage_distance_and_type[i][1] for i in range(take_num)]
class_count = {}
for type_case in type_list:
type_temp = {type_case:1}
if class_count.get(type_case) == None:
class_count.update(type_temp)
else: class_count[type_case] += 1
sorted_class_count = sorted(class_count.iteritems(), key = operator.itemgetter(1), reverse = True)
return sorted_class_count[0][0] def auto_norm(case_list):
case_len = len(case_list[0])
min_vals = [0] * case_len
max_vals = [0] * case_len
ranges = [0] * case_len
for i in range(case_len):
min_list = [case[i] for case in case_list]
min_vals[i] = min(min_list)
max_vals[i] = max([case[i] for case in case_list])
ranges[i] = max_vals[i] - min_vals[i]
norm_data_list = []
for case in case_list:
norm_data_list.append([(case[i] - min_vals[i])/ranges[i] for i in range(case_len)])
return norm_data_list,ranges,min_vals def main():
result_list = ['黄瓜','香蕉','茄子','西葫芦']
dimension1 = float(input('长度是: '))
dimension2 = float(input('弯曲度是: '))
dimension3 = float(input('颜色是: '))
case_list,type_list = create_case_list()
#norm_data_list,ranges,min_vals = auto_norm(case_list)
in_coord = [dimension1,dimension2,dimension3]
#in_coord_len = len(in_coord)
#in_coord = [in_coord[i]/ranges[i] for i in range(in_coord_len)]
#class_sel_result = knn_fun(in_coord,norm_data_list,type_list,3)
class_sel_result = knn_fun(in_coord,case_list,type_list,3)
class_sel_result = class_sel_result - 1
return result_list[class_sel_result] if __name__ == '__main__':
a = main()
print '这货是: %s' %a
测试结果,效果还不赖

机器学习算法_knn(福利)的更多相关文章
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...
- 建模分析之机器学习算法(附python&R代码)
0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...
- 【R】如何确定最适合数据集的机器学习算法 - 雪晴数据网
[R]如何确定最适合数据集的机器学习算法 [R]如何确定最适合数据集的机器学习算法 抽查(Spot checking)机器学习算法是指如何找出最适合于给定数据集的算法模型.本文中我将介绍八 ...
- 在opencv3中的机器学习算法
在opencv3.0中,提供了一个ml.cpp的文件,这里面全是机器学习的算法,共提供了这么几种: 1.正态贝叶斯:normal Bayessian classifier 我已在另外一篇博文中介 ...
- paper 19 :机器学习算法(简介)
本来看了一天的分类器方面的代码,乱乱的,索性再把最基础的概念拿过来,现总结一下机器学习的算法吧! 1.机器学习算法简述 按照不同的分类标准,可以把机器学习的算法做不同的分类. 1.1 从机器学习问题角 ...
- paper 17 : 机器学习算法思想简单梳理
前言: 本文总结的常见机器学习算法(主要是一些常规分类器)大概流程和主要思想. 朴素贝叶斯: 有以下几个地方需要注意: 1. 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分 ...
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- 【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 决策书算法是一种逼近离散数值的分类算法,思路比較简单,并且准确率较高.国际权威的学术组织,数据挖掘国际 ...
- Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
一些机器学习算法的简介 本节开始,介绍<Computer Science Theory for the Information Age>一书中第六章(这里先暂时跳过第三章),主要涉及学习以 ...
随机推荐
- eclipse连接远程服务器
eclipse里有一个强大的插件,可以直接在本地编辑远程服务器代码,Eclipse Remote System Explorer (RSE) 下载安装方法: 一.下载,高版本的eclipse可以直接下 ...
- FF笔试题
一.单选题 1.下列关于继承的描述错误的是( ) A. 在Java中允许定义一个父类的引用,指向子类对象 B. 在Java中继承是通过extends关键字来描述的,而且只允许继承自一个直接父类 ...
- CSRF理解和实战
目录 啥是CSRF攻击 写一个CSRF攻击 如何避免CSRF攻击 啥是CSRF攻击 CSRF(Cross-site request forgery)跨站请求伪造,CSRF通过伪装来自受信任用户的请求来 ...
- 远程工作社区|远程工作|APCOW社区|AP社区
远程工作社区|远程工作|APCOW社区|AP社区 远程工作,那是高中时代就进入我眼帘的一种生活.由于各种电影的摧残,倒是我对国外程序员的生活一直很向往.今天在纽约,下周在旧金山,过段时间又回到了自己的 ...
- Java工程师学习指南 完结篇
Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...
- jfinal定时任务插件jfinal-quartz
这个定时任务插件精确的时间可以到秒,使用方面跟jfinal-scheduler插件的使用方式差不多 Dreampie/jfinal-quartz https://github.com/Dreampie ...
- 《剑指offer》内容总结
(1)剑指Offer——Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
- Java技术开发中的坑
1.(2014/05/28)struts2中使用eclipse自动获取getter和setter方法的坑 今天着实被eclipse坑了一把,平时遇到get和set方法时,我都是通过eclipse自动生 ...
- 翻译:CREATE PROCEDURE语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:CREATE PROCEDURE的译文. 原文:https://mariadb.com/kb/en/create-procedure/我提交到MariaDB官方手册的译文 ...