Python实现kNN(k邻近算法)

运行环境

  • Pyhton3
  • numpy科学计算模块

计算过程

st=>start: 开始
op1=>operation: 读入数据
op2=>operation: 格式化数据
op3=>operation: 计算测试文本到全部训练文本的距离
op4=>operation: 找出最优的k个距离
op5=>operation: 归一化k个距离
e=>end st->op1->op2->op3->op4->op5->e

输入样例

/* Dataset.txt */
文本编号 词列表(以空格分隔) 公众"感动"的概率
训练文本1 消防员 冲进 火场 救出 男童 1
训练文本2 消防员 多次 冲进 火场 救人 不幸 身亡 0.5
训练文本3 6旬 老人 跳楼 自杀 身亡 0.1
训练文本4 疑犯 枪杀 出租车 司机 0
训练文本5 医师 误 把 肾脏 当 肝脏 致人 身亡 0
测试文本1 癌症 老人 成功 手术 ?
测试文本2 男子 枪杀 老人 后 自杀 ?
测试文本3 消防员 冲进 火场 将 男童 救出 ?
测试文本4 出租车 司机 免费 搭载 老人 ?
测试文本5 医师 误 把 患者 肝脏 捅破 致人 身亡 ?

代码实现

# -*- coding: utf-8 -*-
__author__ = 'Wsine' from numpy import *
import operator
import time SIZE_OF_DATA = 5
SIZE_OF_TEST = 5 def read_input(filename):
with open(filename) as fr:
corpus = []
for text in fr.readlines()[1:]:
for word in text.strip().split('\t')[1].split():
corpus.append(word)
allwords = set(corpus) matN = len(allwords)
returnMat = zeros((SIZE_OF_DATA + SIZE_OF_TEST, matN))
shares = []
index = 0
with open(filename) as fr:
for line in fr.readlines()[1:]:
setFromLine = set(line.strip().split('\t')[1].split())
oneLine = []
for s in allwords:
if s in setFromLine:
oneLine.append(1)
else:
oneLine.append(0)
returnMat[index, :] = oneLine
if index < SIZE_OF_DATA:
shares.append(float(line.strip().split('\t')[-1].strip()))
index += 1
return returnMat[:SIZE_OF_DATA,:], returnMat[SIZE_OF_DATA:,:], shares def norm(inputMat):
outputMat = inputMat.copy()
m, n = shape(inputMat)
for i in range(m):
lineSum = sum(inputMat[i, :])
for j in range(n):
outputMat[i, j] = inputMat[i, j] / lineSum
return outputMat def cosSim(a, b):
inA = mat(a)
inB = mat(b)
num = float(inA * inB.T)
denom = linalg.norm(inA) * linalg.norm(inB)
return num / denom def pearsSim(a, b):
inA = mat(a)
inB = mat(b)
if len(inA) < 25:
return 1.0
return 0.5 + 0.5 * corrcoef(intA, inB, rowvar=0)[0][1] def eulidSim(a, b):
return 1.0 / (1.0 + linalg.norm(a - b)) def classify(k, trainDataSet, testDataSet, dataShares):
predictShares = []
for testVector in testDataSet:
dis = []
for trainVector in trainDataSet:
dis.append(linalg.norm(testVector - trainVector)) # 欧式距离
#dis.append(sum(list(map(abs, testVector - trainVector)))) # 曼哈顿距离
#dis.append(cosSim(testVector, trainVector)) # 夹角余弦
#dis.append(pearsSim(testVector, trainVector)) # 皮尔逊相关系数
#dis.append(eulidSim(testVector, trainVector)) # 归一化欧式距离
nearest_item = list(range(SIZE_OF_DATA))
nearest_item.sort(key=lambda x : dis[x])
indexSum = 0.0
for index in nearest_item[:k]:
indexSum += dataShares[index]
predictShares.append(indexSum / k)
return predictShares def main():
trainMat, testMat, shares = read_input('Dataset.txt')
normTrainMat = norm(trainMat)
normTestMat = norm(testMat)
predictShares = classify(1, normTrainMat, normTestMat, shares)
print(predictShares) if __name__ == '__main__':
main()

输出样例

[0.1, 0.1, 1.0, 0.0, 0.0]

Python实现kNN(k邻近算法)的更多相关文章

  1. <机器学习实战>读书笔记--k邻近算法KNN

    k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...

  2. k邻近算法(KNN)实例

    一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...

  3. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...

  4. 监督学习——K邻近算法及数字识别实践

    1. KNN 算法 K-近邻(k-Nearest Neighbor,KNN)是分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似( ...

  5. kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)

    一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...

  6. 机器学习算法及代码实现–K邻近算法

    机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...

  7. [机器学习实战] k邻近算法

    1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...

  8. [机器学习] ——KNN K-最邻近算法

    KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  9. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

随机推荐

  1. ionic goto other page or alert

    有时候需要 调试,这是就需要alert 的...可惜的是我不会angular  所以记录一下 .controller('mainctr', function($scope, $window) { $w ...

  2. 用代码打开FORM里面用到的数据源

    修改动态报表的时候,尝尝需要根据当前设计里指定的数据源,然后打开AOT去查找,相当的不方便. 于是产生写了一个方法,可以根据传过来的数据源名,去AOT找到TABLE或者VIEW, 直接打开,以便修改. ...

  3. verilog中符号位的扩展问题

    以下内容转自 艾米电子 - 使用有符号数,Verilog(http://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html) Verilog ...

  4. VC++2010下编译STLport,Boost

    VC++2010下编译STLport,Boost 最近在想向Boost转移,努力掌握Boost代码的过程中, STLport版本:5.2.1 Boost版本:1.4.6.1 (1.4.7.0也OK) ...

  5. Heavily reliance on forensic tools is risky

    We could take advantage of forensic tools to examine and analyze the evidence, but heavily reliance ...

  6. DPDK多核多线程机制简析

    DPDK通过在多核设备上,创建多个线程,每个线程绑定到单独的核上,减少线程调度的开销,以提高性能. DPDK的线程分为控制线程和数据线程,控制线程一般绑定到MASTER核上,主要是接受用户配置,并传递 ...

  7. windwos异地备份Mysql数据库

    @echo off@title Mysqlbackup echo MySQL数据库备份 echo ***********************echo Today %date%echo Time % ...

  8. HTML 5 Canvas

    HTML 5 Canvas   HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. <canvas id="myCanvas" width=&q ...

  9. 微信Api

    //定义变量 HttpRequest Request; HttpResponse Response; HttpServerUtility Server; HttpContext Context; pr ...

  10. jQuery类级别插件--返回顶部,底部,去到任何部位

    先引入js:<script type="text/javascript" src="jquery.js" ></script><s ...