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算法的特点 ...
随机推荐
- Android 照相 滤镜
android-image-filter 19种相片滤镜,使用也简单,all filters in file BitmapFilter.java : Bitmap newBitmap = Bitmap ...
- 51Nod 1010 只包含因子2 3 5的数 Label:None
K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = ...
- cookie的基本用法案例
注:cookie必须在服务器环境下有效. 步骤讲解: 1,引入cookie文件: 2,设置过期时间: var date = new Date(); date.setTime(date.getTime( ...
- Selenium_等待页面加载完毕
隐式等待 WebDriver driver = new FirefoxDriver(); driver.get("www.baidu.com"); driver.manage(). ...
- Ubuntu install codeblocks by ppa
sudo add-apt-repository ppa:damien-moore/codeblocks-stable sudo apt-get update sudo apt-get install ...
- 关于textarea中换行、回车、空格的识别与处理
需求:在textarea中输入文字,提交给后台后,后台输出在另一个页面,文字按原格式显示. 问题:如何还原输入框中的换行和空格? 兼容性:IE9以上.FF.chrome在换行处匹配/\n/ ...
- LINUX下编译安装PHP各种报错大集合
本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...
- ubuntu14.04 安装 hadoop2.4.0
转载:ubuntu搭建hadoop-Ver2.6.0完全分布式环境笔记 自己在搭建hadoop平台时,碰到一些困难,按照该博文解决了问题,转载一下,作为记录. 2 先决条件 确保在你集群中的每个节点上 ...
- centos6字符
[root@back_zabbix_100 ~]# echo $LANGen_US.UTF-8[root@back_zabbix_100 ~]# cat /etc/sysconfig/i18n LAN ...
- tab+tab
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...