文档章节

KNN算法的python实现

大海201506
 大海201506
发布于 2017/06/20 18:03
字数 850
阅读 15
收藏 0
点赞 0
评论 0

1. 处理数据

# filename:文件路径  trainingSet:训练集  testSet:测试集 训练数据集数据量/测试数据集数据量的比值取67/33是一个常用的惯例。
def loadDataset(filename,split,trainingSet=[], testSet=[]):
    with open(filename,'r') as csvfile: #使用open方法打开文件
        lines = csv.reader(csvfile) #使用csv模块读取数据
        dataset = list(lines)
        for x in range(len(dataset)-1):
            for y in range(4):
                dataset[x][y] = float(dataset[x][y])
            if random.random() < split:
            #random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0。
            #随机地切分训练数据集和测试数据集。训练数据集数据量/测试数据集数据量的比值取67/33是一个常用的惯例,所以split取值一般为0.66
                trainingSet.append(dataset[x])
            else:
                testSet.append(dataset[x])

测试代码

trainingSet=[]
testSet=[]
loadDataset('iris.data',0.66,trainingSet,testSet)
print('trainingSet',repr(len(trainingSet)))
print('testSet',repr(len(testSet)))

2. 相似度

我们需要计算两个数据之间的相似度,便于获取最相似的N个实例来做出预测。

因为有关花的四个测量维度的数据都是数字形式的,并且具有相同的单位。我们可以直接使用欧式距离来测量。

二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离: 输入图片说明

# length:告诉函数前几个维度需要处理,忽略后面的维度
def euclideanDistance(instance1,instance2,length):
    distance = 0
    for x in range(length):
        distance += pow((instance1[x]-instance2[x]),2) #所有需要计算的维度距离相加
    return math.sqrt(distance)

测试代码:

data1 = [2,2,2,'a']
data2 = [4,4,4,'b']
# length=3只计算前面三个维度
distance = euclideanDistance(data1,data2,3)
print('distance',repr(distance))

3. 邻近相似度

有了相似度计算的方法,我们可以获取与需要预测的数据最接近的N个数据实例了。

最直接的方法就是计算待预测数据到所有数据实例的距离,取其中距离最小的N个。

# testInstance:待预测数据
def getNeighbors(trainingSet, testInstance, k):
    distances = []
    length = len(testInstance)-1
    for x in range(len(trainingSet)):
        #testinstance
        dist = euclideanDistance(testInstance, trainingSet[x], length)
        distances.append((trainingSet[x], dist))
        #distances.append(dist)
    distances.sort(key=operator.itemgetter(1))
    neighbors = []
    for x in range(k):
        neighbors.append(distances[x][0])
        return neighbors

测试代码:

trainSet = [[2,2,2,'a'],[4,4,4,'b']]
testInstance = [5,5,5]
k = 1
neighbors = getNeighbors(trainSet,testInstance,k)
print(neighbors)

测试结果(邻近元素): [[4, 4, 4, 'b']]

4. 结果

接下来的任务就是基于最近的几个实例来得到预测结果了。

我们可以让这些邻近元素来对预测属性进行投票,得票最多的选项作为预测结果

下面这个函数实现了投票的逻辑,它假设需预测的属性放在数据实例(数组)的最后。

def getResponse(neighbors):
    classVotes = {}
    for x in range(len(neighbors)): #遍历最邻近元素
        response = neighbors[x][-1] #假设需预测的属性放在数据实例(数组)的最后
        if response in classVotes:
            classVotes[response] += 1 # 对预测属性投票
        else:
            classVotes[response] = 1
    sortedVotes = sorted(classVotes.items(), key=None, reverse=True)
    return sortedVotes[0][0] #

测试代码:

neighbors= [[1,1,1,'a'],[2,2,2,'a'],[3,3,3,'b']]
response = getResponse(neighbors)
print(response)

5. 准确度

简单的评估方法:计算在测试数据集中算法正确预测的比例,这个比例叫分类准确度。

# 假设predictions为测试集的预测结果集
def getAccuracy(testSet, predictions):
    correct = 0
    for x in range(len(testSet)):
        if testSet[x][-1] is predictions[x]:
            correct += 1
    return (correct/float(len(testSet))) * 100.0

测试代码:

testSet = [[1,1,1,'a'],[2,2,2,'a'],[3,3,3,'b']]
predictions = ['a','a','a']
accuracy = getAccuracy(testSet,predictions)
print(accuracy)

© 著作权归作者所有

共有 人打赏支持
大海201506
粉丝 4
博文 80
码字总数 180595
作品 0
广州
程序员
Python | K近邻实现(KNN)

01 KNN可以做点什么呢? 在李航的《统计学习方法》中,详细讲解了一中分类算法:K近邻(K Nearest Neighbor),具体的算法过程和关键点可以参考这篇文章: 统计学习方法 | k近邻法 算法的理论基...

邓莎
06/04
0
0
crab-python的推荐系统

项目: 是一个发展中的推荐系统 http://www.oschina.net/p/crab 安装: ( 优先用easy_install ) * numpy Q:遇到缺少vcvarsall.bat的问题 A: 当已经安装了vs20xx时,可设置环境变量 SET VS90...

深蓝苹果
2014/05/05
0
0
Python入门到机器学习再到深入学习及应用整个学习系统

就在昨天我们收到了一位刚拿到Google offer的九章学员发来的截图 作为一名同是转专业到cs的程序猿,对此猿我定要表示万分真心的理解和祝贺! 其中滋味,唯吾猿类方懂… 此外这位细心的猿还找...

m68futkmurmtj
04/24
0
0
这里有一张9000元的优惠券,请查收!

人工智能人才缺口500万 从语音识别到智能音箱, 从无人驾驶到人机对战, 近年来, 人工智能给人类社会带来了一次又一次惊喜。 大家都知道, 中国人工智能行业正处于一个创新发展时期, 对人才...

micf435p6d221ssdld2
04/18
0
0
机器学习实战--KNN代码详解

写在前面 走了很多弯路,看了很多风景,才发现,想要好好学算法,还是要一行一行敲代码,于是有了这个系列。 这个系列按照机器学习实战的章节来写,由于市面上已经有很多同类的文章,一般以介...

cloudinsea
2017/12/17
0
0
从零开始用Python实现k近邻算法(附代码、数据集)

进入数据分析领域的四年来,我构建的模型的80%多都是分类模型,而回归模型仅占15-20%。这个数字会有浮动,但是整个行业的普遍经验值。分类模型占主流的原因是大多数分析问题都涉及到做出决定...

技术小能手
04/18
0
0
【cs231n学习笔记】——— KNN

好久没写博客了,最近有点忙,然后自己也有点懒。。。。。。 最近确定自己要搞计算机视觉方向,然后就开始看斯坦福的cs231n课程,准备写系列博客记录自己的学习过程及心得。 ————————...

nicht_sehen
05/29
0
0
python 超全sklearn教程,数据挖掘从入门到入坑

最近工作中遇到了一些数据建模的问题,趁这几天有时间,把数据挖掘过程中一些流程规范和常见的机器学习问题总结一下。本篇博文涵盖的内容有机器学习的概念,模型分类(有监督、无监督),pyt...

qwop446
2017/09/16
0
0
基于python的机器学习(1)-环境配置

基于python的机器学习(1)-环境配置 01.基本介绍 不能说当前机器学习很强大,但是可以说当前机器学习在现实的生活中所起的作用也越来越大了,将来,社会对这方面的人才需求也会越老越大。对...

meiqi0538
04/20
0
0
机器学习实战(一)KNN算法:简单的数据分类和决策

说明:该案例来源 机器学习实战之KNN,里面有更详尽的KNN原理分析和案例实现流程详解,是一个关于机器学习实战的不错的学习资料,推荐一波。出于编程实践和机器学习算法梳理的目的,按照自己...

stayfoolish_fan
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git GUI Client

Git GUI Client

qwfys
5分钟前
0
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
9分钟前
2
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
15分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
29分钟前
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
30分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
38分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
42分钟前
1
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部