kNN是一种常见的监督学习方法。工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可以使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。[1]   

  kNN的伪代码如下:[2]     

    对未知类别属性的数据集中的每个点依次执行以下操作:     

    (1)计算已知类别数据集中的点与当前点之间的距离;     

    (2)按照距离递增次序排序;     

    (3)选取与当前点距离最小的k个点;     

    (4)确定前k个点所在类别的出现频率;      

    (5)返回前k个点出现频率最高的类别作为当前点的预测分类。   

  以下通过图来进一步解释:

  假定要对紫色的点进行分类,现有红绿蓝三个类别。此处以k为7举例,即找出到紫色距离最近的7个点。

分别找出到紫色距离最近的7个点后,我们将这七个点分别称为1、2、3、4、5、6、7号小球。其中红色的有1、3两个小球,绿色有2、4、5、6四个小球,蓝色有7这一个小球。

显然,绿色小球的个数最多,则紫色小球应当归为绿色小球一类。

  以下给出利用kNN进行分类任务的最基本的代码。

KNN.py文件内定义了kNN算法的主体部分

from numpy import *
import operator def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0.0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels def kNN_Classify(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
#关于tile函数的用法
#>>> b=[1,3,5]
#>>> tile(b,[2,3])
#array([[1, 3, 5, 1, 3, 5, 1, 3, 5],
# [1, 3, 5, 1, 3, 5, 1, 3, 5]])
sqDiffMat = diffMat ** 2
sqDistances = sum(sqDiffMat, axis = 1)
distances = sqDistances ** 0.5# 算距离
sortedDistIndicies = argsort(distances)
#关于argsort函数的用法
#argsort函数返回的是数组值从小到大的索引值
#>>> x = np.array([3, 1, 2])
#>>> np.argsort(x)
#array([1, 2, 0])
classCount = {} # 定义一个字典
# 选择k个最近邻
for i in range(k):
voteLabel = labels[sortedDistIndicies[i]]
# 计算k个最近邻中各类别出现的次数
classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 # 返回出现次数最多的类别标签
maxCount = 0
for key, value in classCount.items():
if value > maxCount:
maxCount = value
maxIndex = key
return maxIndex

KNN_TEST.py文件中有两个样例测试。

#!/usr/bin/python
# coding=utf-8
import KNN
from numpy import *
# 生成数据集和类别标签
dataSet, labels = KNN.createDataSet()
# 定义一个未知类别的数据
testX = array([1.2, 1.0])
k = 3
# 调用分类函数对未知数据分类
outputLabel = KNN.kNN_Classify(testX, dataSet, labels, 3)
print("Your input is:", testX, "and classified to class: ", outputLabel) testX = array([0.1, 0.3])
outputLabel = KNN.kNN_Classify(testX, dataSet, labels, 3)
print("Your input is:", testX, "and classified to class: ", outputLabel)

代码输出:

画图解释一下输出结果:

参考文献:

[1]机器学习,周志华,清华大学出版社2016.

[2]机器学习实战,Peter Harrington,人民邮电出版社.

2019-03-06

01:52:08

kNN算法基本原理与Python代码实践的更多相关文章

  1. KNN算法原理(python代码实现)

    kNN(k-nearest neighbor algorithm)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 ...

  2. tf–idf算法解释及其python代码实现(下)

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  3. tf–idf算法解释及其python代码实现(上)

    tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...

  4. 神经网络BP算法C和python代码

    上面只显示代码. 详BP原理和神经网络的相关知识,请参阅:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输 ...

  5. tf–idf算法解释及其python代码

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  6. 《机器学习实战》kNN算法及约会网站代码详解

    使用kNN算法进行分类的原理是:从训练集中选出离待分类点最近的kkk个点,在这kkk个点中所占比重最大的分类即为该点所在的分类.通常kkk不超过202020 kNN算法步骤: 计算数据集中的点与待分类 ...

  7. 光照问题之常见算法比较(附Python代码)

    一.灰度世界算法 ① 算法原理 灰度世界算法以灰度世界假设为基础,该假设认为:对于一幅有着大量色彩变化的图像,R,G,B三个分量的平均值趋于同一灰度值Gray.从物理意义上讲,灰色世界法假设自然界景物 ...

  8. 朴素贝叶斯算法简介及python代码实现分析

    概念: 贝叶斯定理:贝叶斯理论是以18世纪的一位神学家托马斯.贝叶斯(Thomas Bayes)命名.通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的:然而 ...

  9. 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

随机推荐

  1. having 的使用

    .用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name kecheng fenshu 张三 语文 张三 数学 李四 语文 李四 数学 王五 语文 王五 数学 王五 英语 select n ...

  2. sql进阶

    --1.变量的声明和赋值   declare @Start DateTime, @End DateTime set @Start = '1999-9-9' set @End = '2000-1-1' ...

  3. mysql GROUP_CONCAT 查询某个字段(查询结果默认逗号拼接)

    Mysql 的 GROUP_CONCAT 函数默认将查询的结果用逗号拼接并返回一个字符串,如:李四,long,张三 1. 常用方式 select GROUP_CONCAT(user_name) use ...

  4. 反射的应用,jdbc封装

    实现在Java中查询数据库并保存在Java中 1.创建Dept类(要查找的类) package cn.ljs; public class Dept { private int deptno; priv ...

  5. 博客搬家 https://hanwang945.github.io/

    博客搬家 https://hanwang945.github.io/

  6. SQL使用之关联更新、批量插入

    使用场景 某个字段数据异常,利用另外一张表同步修改该表异常字段的数据; 关联更新 UPDATE tableName1 AS t1 LEFT JOIN tableName12 AS t2 ON t1.x ...

  7. MySQL 允许局域网内其他网段主机访问本地MySql数据库

    Mac下和Windows下均适合

  8. Pubmed/PMC/Meline的异同点【转载】

    转自:http://paper.dxy.cn/article/495034 一.PubMed.PMC 和 MEDLINE 到底有什么区别和联系? 可以看出,PubMed的收录范围是最广的:三个都是生物 ...

  9. web框架实现购物车数量加减

    企业开发中经常是团队协作,每个人分配一个小的模块,比如说购物车模块,数量加减这一块人们首先想到的就是通过jquery实现,其实作为一个后端接口开发的程序猿也可以用自己更擅长的后端的逻辑代码来实现,那我 ...

  10. 详解Nginx服务器配置

    #运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes ; #全局错误日志及PID文件 #error_log logs/error.log; ...