文档章节

KNN算法的python实现

大海201506
 大海201506
发布于 2017/06/20 18:03
字数 850
阅读 34
收藏 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
粉丝 5
博文 96
码字总数 173986
作品 0
广州
程序员
私信 提问
机器学习 Day 7 | K-NN算法的简单实现

机器学习第七天 K-NN算法的简单实现 数据包下载地址: https://www.xiehaoo.com/media/record/pinke/2018/08/2.KNN.zip KNN使用场景 电影可以按照题材分类,那么如何区分 动作片 和 爱情片 ...

raphah
08/14
0
0
Python | K近邻实现(KNN)

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

邓莎
06/04
0
0
python机器学习(一):kNN算法

这段时间用opencv中的机器学习算法做了一下目标检测,效果还是不错的。但都是按照命令和库进行调用,基本对我来说是个黑盒子。固然工程师要会用工具,但如果不深入理解内部实现,是很难进步的...

JacobYoung
09/25
0
0
机器学习(一)——K-近邻(KNN)算法

最近在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习。 一 . K-近邻算法(KNN)概述 最简单最初级的分类器是...

临江仙卜算子
10/09
0
0
机器学习实战入门篇之二:kNN算法 | 她是不是你喜欢的类型?

通过本篇博文,你可以学习到: 环境搭建,主要为python,numpy,以及matplotlib库的搭建等; k-近邻算法; k-近邻算法实战练习,使用k-近邻算法判断某个同学是不是你喜欢的类型。 理论与实战...

shareLin
2016/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
32分钟前
1
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
48分钟前
2
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
5
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部