KNN算法
1.算法讲解
KNN算法是一个最基本、最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签;
训练过程:只需要加载训练数据;
测试过程:通过之前加载的训练数据,计算测试数据集中各个样本的标签,从而完成测试数据集的标注;
2.代码
具体代码如下:
#!/usr/bin/env/ python
# -*- coding: utf-8 -*-
import csv
import random
from matplotlib import pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
class KNN(object):
def __init__(self):
self._trainData = None
self._trainDataLabel = None
# 计算距离
def _computerDist(self,testData):
m = testData.shape[0]
n = self._trainData.shape[0]
dist = np.zeros((m,n))
for i in range(m):
for j in range(n):
dist[i][j] = np.sum( (testData[i,:] - self._trainData[j,:])**2 )
return dist
# 模型训练,knn只需要加载训练数据集
def train(self,dataset):
self._trainData = dataset[:,0:-1]
self._trainDataLabel = np.array(dataset[:,-1],dtype = np.int)
# 预测测试数据集
def predict(self,testData,topK = 3):
dist = self._computerDist(testData)
num_test = testData.shape[0]
predLable = np.zeros(num_test)
for i in range(num_test):
labelList = []
# 得到前topK样本的索引
idxList = np.argsort(dist[i,:])[:topK].tolist()
# 根据这些索引,得到对应的标签
labelList = self._trainDataLabel[idxList]
# 统计各个标签数目
counts = np.bincount(labelList)
# 将标签数目最大的标签值作为样本的标签
predLable[i] = np.argmax(counts)
return predLable
# 测试准确率
def test(self,testData,testLabel,topK = 3):
predLabel = self.predict(testData,topK)
predLabel = np.array(predLabel,dtype = int)
num_correct = np.sum(predLabel == testLabel)
num_test = testLabel.shape[0]
accuracy = float(num_correct) / num_test
print "testLabel:" + str(testLabel)
print "predLabel:" + str(predLabel)
print "get: %d / % d => accuracy: %f" %(num_correct,num_test,accuracy)
return predLabel
# 画出结果图
def plotResult(self,testData,predLable):
X = self._trainData
y = self._trainDataLabel
pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)
test_r = pca.fit(testData).transform(testData)
plt.figure()
for c, i in zip("rgb", [0, 1, 2]):
plt.scatter(X_r[y == i, 0], X_r[y == i, 1], c=c)
plt.scatter(test_r[predLable == i,0],test_r[predLable == i,1],s= 30,c = c,marker = 'D')
plt.legend()
plt.title('KNN of IRIS dataset')
plt.show()
# 加载数据集
def loadDataSet(self,fileName,splitRatio = 0.9):
lines = csv.reader(open(fileName,"rb") )
dataset = list(lines)
for i in range(len(dataset)):
dataset[i] = [float(x) for x in dataset[i]]
trainSize = int(len(dataset) * splitRatio)
random.shuffle(dataset)
trainData = np.array(dataset[:trainSize])
testData = np.array(dataset[trainSize:])
return trainData,testData
if __name__ == "__main__":
fileName = 'iris.csv'
KNNobj = KNN()
trainData,testData = KNNobj.loadDataSet(fileName,0.8)
# 抽取出测试数据
testdata = testData[:,0:-1]
# 抽取出测试标签数据
testdataLabel = np.array(testData[:,-1],dtype = int)
# 训练模型
KNNobj.train(trainData)
# 测试模型
predLabel = KNNobj.test(testdata,testdataLabel,3)
# 画出结果分布
KNNobj.plotResult(testdata,predLabel)
3.结果分析
本实例中,训练数据样本量为120个,测试数据样本量为30个,topK=3;
运行结果如下:
get: 29 / 30 => accuracy: 0.966667
结果分布图如下所示:
其中圆心点为训练数据,菱形点为测试数据;不同颜色代表不同的类;

4.参考链接
Comparison of LDA and PCA 2D projection of Iris dataset
KNN算法的更多相关文章
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- kNN算法python实现和简单数字识别
kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...
- 什么是 kNN 算法?
学习 machine learning 的最低要求是什么? 我发觉要求可以很低,甚至初中程度已经可以. 首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可. 数学方面 ...
- 数据挖掘之KNN算法(C#实现)
在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...
- 机器学习笔记--KNN算法2-实战部分
本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...
- 机器学习笔记--KNN算法1
前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...
- 学习OpenCV——KNN算法
转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...
- KNN算法与Kd树
最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
- Python 手写数字识别-knn算法应用
在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...
随机推荐
- Easyui之datagrid实现点击单元格修改单元格背景颜色
前段时间有个需求中有点击datagrid的单元格实现某种事件,调用datagrid的onclickCell这个方法很容易实现,但是体验不好啊,完全不知道自己刚才点击的是哪个单元格,然后就尝试单击单元格 ...
- 用soapUI测试webservice
测试webservice时,有时需要写一个客户端来向服务端发起请求才可以测试服务,最近看到一款工具soap ui,也可以调试VS2010中的程序. 首先要把webservice 发布到本地,网上已经有 ...
- xcode8 升级后注释快键键不能使用的解决方法
1.这个是因为苹果解决xcode ghost.把插件屏蔽了.解决方法 命令运行: sudo /usr/libexec/xpccachectl 然后必须重启电脑后生效 2.option+command ...
- SQL Server 里的递归查询
http://www.360doc.com/content/13/0607/11/8463843_291221684.shtml
- 修复jLink V9固件小记
网上买了个山寨jLink V9.3 plus,号称不掉固件的,不过固件最终还是掉了,现象是:插上去红灯亮,发现jLink但是驱动无法安装.估计是固件丢失了,放G搜了一圈发现修复固件都是V8的,但是倒找 ...
- Python之路Day14--html
本节内容: 一.HTML 二.CSS 三.JS HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据 ...
- 实例讲解 SQL 注入攻击
这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...
- Linux tar文件打包
tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c //打包 -x //解压 -f //指定文件 ...
- git配置ssh(github)
[参考官方文档] SSH keys are a way to identify trusted computers, without involving passwords. The steps be ...
- c++怎样让函数返回数组
这个问题属于非常初级的问题,但是对于初学不知道的人可能会比较头疼.C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现.比如一个矩阵相乘的函数,很容易地我们就写成: ...