文档章节

KNN算法的python实现

大海201506
 大海201506
发布于 2017/06/20 18:03
字数 850
阅读 18
收藏 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
博文 92
码字总数 196287
作品 0
广州
程序员
Python | K近邻实现(KNN)

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

邓莎
06/04
0
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
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
机器学习实战--KNN代码详解

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

cloudinsea
2017/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Lock接口分析之ReentantReadWriteLock

ReentantReadWriteLock读写锁,在读线程多余写线程的并发环境中能体现出优异的性能,相比于synchronized与ReentrantLock这种独占式锁的模型,ReentantReadWriteLock采用独占式写锁与共享式读...

我爱春天的毛毛雨
14分钟前
0
0
EFK (Fluentd ElasticSearch Kibana) 采集nginx日志

本文描述如何通过FEK组合集中化nginx的访问日志。本人更喜欢按顺序来命名,所以使用FEK而不是EFK. 首先在nginx服务器上执行以下操作. 安装ruby http://blog.csdn.net/chenhaifeng2016/artic...

xiaomin0322
15分钟前
0
0
一键下载:将知乎专栏导出成电子书

老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python 和爬虫,可以完成怎样的小工具。 在知乎上,你一定关注了一些不错的专栏(比如 ...

crossin
24分钟前
1
0
synchronized 之 对象锁 和 类锁

一、synchronized(object) 如果object没有被加锁,则获取object的锁;如果object已经被加锁则等待object的锁被释放。 二、需要加锁的情景 多线程共享同一资源会引起线程安全的情况下,才需要...

MyOldTime
26分钟前
6
0
tomcat 单机/多机 部署多应用

一.单机部署多应用: 1.在 linux 下解压安装两个 tomcat:tomcat1, tomcat2; 2.修改 /etc/profile, 增加 tomcat 环境变量: path 中加上 重新加载配置文件 source /etc/profile 3.修改 tomc...

imbiao
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部