k-近邻算法(机器学习理论+python实战)

前言

  • 对于其他分类算法:决策树归纳、贝叶斯分类、基于规则的分类、BP-神经网络分类、支持向量机、基于关联规则挖掘的分类,这些都是给定训练集,然后训练得到模型,再去预测新元组(测试集)。
  • 而k-近邻分类不同,它先将训练元组存储,直到给定一个预测元组,它才基于类比学习,即通过给定预测元组与存储的训练元组的相似性,对该元组进行分类。(因此该算法也称为惰性学习法

1. k-近邻算法
k-近邻算法(k-Nearest Neighbour algorithm),又称KNN算法,是数据挖掘技术中原理最简单的算法,可用于分类。
算法思想:
给定一个已知类标签的训练数据集,输入没有标签的新数据后,在训练集中找到与新数据最邻近的k个实例(比较两两元组的特征),如果k个实例的多数属于某个类别,则该新数据也属于该类别。
可简单理解为:由那些离元组x最近的k个点来投票决定x的类别。

我们知道k-近邻算法工作原理,根据元组特征比较,然后取样本集中特征最相似的数据(最近邻)的分类标签。那如何进行比较呢??

"近邻性"用距离进行度量,如欧几里得距离:
两个点或元组的欧式距离为:

  • 在度量距离之前,先对每个属性的值进行规范化。防止具有较大初始值域的属性在最终结果上权重过大造成影响。数据归一化使得每个属性的权重相同。
  • 数据归一化处理方法有多种:0-1标准化,Z-score标准化,Sigmoid压缩法等等。0-1标准化把属性A的值v变换到[0,1]区间的v1,公式如下:

k-近邻算法的优缺点:
优点:精度高、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和离散型

关于k-近邻的几个问题:
2. 以上距离度量中讨论的是属性是数值型的。对于离散型属性应该如何度量距离?
答:一种简单的方法是比较元组X1和X2中对应属性的值。如果属性值相同则为0,不同则为1。该方法类似于皮尔逊相关系数的计算。
3. 如何确定k的值?
答:通过迭代实验来确定。从k=1开始,用测试数据集估计分类器的错误率。重复该过程k++,最后选取产生最小错误率的k值。
4. 对于噪声数据和不相关属性的影响?
答:k-近邻分类法是基于距离比较的,本质上赋予每个属性相等的权重。因此,当数据存在噪声和不相关属性时,分类器的准确率受到很大影响。可通过属性加权法噪声数据元组的减枝来处理。
5. 对于计算量大,效率低的问题?
答:k-近邻分类法对预测元组分类时可能非常慢。如果训练集有D个元组,而k=1,对于一个给定的测试元组分类,需要|D|次比较,时间复杂度为O(|D|)。
解决方案:
(1.)通过预先排序并将排序后的元组安排在搜索树中,比较次数可以降低到O(log|D|)。
(2.)并行实现,可以把运行时间降低为常数,O(1)。
(3.)部分距离计算法: 基于n个属性的子集计算距离,如果该距离超过阈值,则停止给定存储元组的进一步计算。
(4.)编辑存储法: 可以删除被证明“无用的”元组。该方法也称为减枝精简,因为它减少了存储元组的数量。

案例,用k-近邻算法分类一个电影是爱情片还是动作片

python实现

#导入包
import pandas as pd#构建数据集
rowdata={'电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2'],
'打斗镜头':[1,5,12,108,112,115],
'接吻镜头':[101,89,97,5,9,8],
'电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片']}movie_data= pd.DataFrame(rowdata)#添加待分类数据
new_data = [24,67]#计算已知类别数据集中的点与当前点之间的距离
dist = list((((movie_data.iloc[:6,1:3]-new_data)**2).sum(1))**0.5)#将距离升序排列,然后选取距离最小的k个点
k=4
dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})
dr = dist_l.sort_values(by = 'dist')[: k]#确定前k个点所在类别的出现频率
re = dr.loc[:,'labels'].value_counts()
re.index[0]#返回结果
result = []
result.append(re.index[0])
result

封装该函数

import pandas as pd
"""
函数功能:KNN分类器
参数说明:inX:需要预测分类的数据集dataSet:已知分类标签的数据集(训练集)k:k-近邻算法参数,选择距离最小的k个点
返回:result:分类结果
"""
def classify0(inX,dataSet,k):dist = list((((movie_data.iloc[:6,1:3]-new_data)**2).sum(1))**0.5)dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})dr = dist_l.sort_values(by = 'dist')[: k]re = dr.loc[:,'labels'].value_counts()result.append(re.index[0])return result

测试

inX = new_data
dataSet = movie_data
k= 4
classify0(inX,dataSet,k)

结果

['爱情片']

约会网站的判定

#1.导入数据集
datingTest = pd.read_table('datingTestSet.txt',header=None)
datingTest.head()# 2. 分析数据
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt#把不同标签用颜色区分
Colors = []
for i in range(datingTest.shape[0]):m = datingTest.iloc[i,-1]if m=='didntLike':Colors.append('black')if m=='smallDoses':Colors.append('orange')if m=='largeDoses':Colors.append('red')#绘制两两特征之间的散点图
plt.rcParams['font.sans-serif']=['Simhei'] #图中字体设置为黑体
pl=plt.figure(figsize=(12,8))fig1=pl.add_subplot(221)
plt.scatter(datingTest.iloc[:,1],datingTest.iloc[:,2],marker='.',c=Colors)
plt.xlabel('玩游戏视频所占时间比')
plt.ylabel('每周消费冰淇淋公升数')fig2=pl.add_subplot(222)
plt.scatter(datingTest.iloc[:,0],datingTest.iloc[:,1],marker='.',c=Colors)
plt.xlabel('每年飞行常客里程')
plt.ylabel('玩游戏视频所占时间比')fig3=pl.add_subplot(223)
plt.scatter(datingTest.iloc[:,0],datingTest.iloc[:,2],marker='.',c=Colors)
plt.xlabel('每年飞行常客里程')
plt.ylabel('每周消费冰淇淋公升数')
plt.show()

#数据归一化
def minmax(dataSet):minDf = dataSet.min()maxDf = dataSet.max()normSet = (dataSet - minDf )/(maxDf - minDf)return normSetdatingT = pd.concat([minmax(datingTest.iloc[:, :3]), datingTest.iloc[:,3]], axis=1)
datingT.head()#划分数据集
def randSplit(dataSet,rate=0.9):n = dataSet.shape[0]m = int(n*rate)train = dataSet.iloc[:m,:]test = dataSet.iloc[m:,:]test.index = range(test.shape[0])return train,test
train,test = randSplit(datingT)#定义分类器
def datingClass(train,test,k):n = train.shape[1] - 1m = test.shape[0]result = []for i in range(m):dist = list((((train.iloc[:, :n] - test.iloc[i, :n]) ** 2).sum(1))**5)dist_l = pd.DataFrame({'dist': dist, 'labels': (train.iloc[:, n])})dr = dist_l.sort_values(by = 'dist')[: k]re = dr.loc[:, 'labels'].value_counts()result.append(re.index[0])result = pd.Series(result)test['predict'] = resultacc = (test.iloc[:,-1]==test.iloc[:,-2]).mean()print(f'模型预测准确率为{acc}')return testdatingClass(train,test,5)

输出结果

模型预测准确率为0.95

源码下载地址:
参考书目:《机器学习实战》王斌译——图灵程序设计丛书
学习网址:菊安酱的《机器学习实战》:有12期的免费课程。

k-近邻算法(KNN)(机器学习理论+python实战)相关推荐

  1. 基于KD树的K近邻算法(KNN)算法

    文章目录 KNN 简介 KNN 三要素 距离度量 k值的选择 分类决策规则 KNN 实现 1,构造kd树 2,搜索最近邻 3,预测 用kd树完成最近邻搜索 K近邻算法(KNN)算法,是一种基本的分类与 ...

  2. k近邻算法(KNN)-分类算法

    k近邻算法(KNN)-分类算法 1 概念 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. k-近邻算法采用测量不同特征值之间的 ...

  3. 01 K近邻算法 KNN

    01 K近邻算法 KNN k近邻算法基础 等价于 scikit-learn中的机器学习算法封装 训练数据集,测试数据集 分类准确度 超参数 考虑距离权重 更多关于距离的定义 搜索明可夫斯基距离相应的p ...

  4. k近邻算法 (KNN)

    k近邻算法 k近邻算法(KNN,K-NearestNeighbor)是一种基本分类和回归方法,监督学习算法,本质上是基于一种数据统计的方法: 核心思想:给定一个训练数据集,对新的输入实例,在训练数据集 ...

  5. 机器学习-分类之K近邻算法(KNN)原理及实战

    k近邻算法(KNN) 简介 KNN算法是数据挖掘分类技术中最简单的方法之一.它通过测量不同特征值之间的距离进行分类的.其基本思路为:如果一个样本在特征空间中的k个最近邻样本中的大多数属于某一个类别,则 ...

  6. K近邻算法(KNN)原理小结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录 1. KNN算法原理 2. KNN算法三要素 3. KNN算 ...

  7. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

  8. 【模式识别】实验二:K近邻算法(KNN)

    KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...

  9. K近邻算法KNN的简述

    什么是KNN K近邻算法又称KNN,全称是K-Nearest Neighbors算法,它是数据挖掘和机器学习中常用的学习算法,也是机器学习中最简单的分类算法之一.KNN的使用范围很广泛,在样本量足够大 ...

最新文章

  1. 阻塞与非阻塞的IO网络读写
  2. 【android】插件化技术原理详解
  3. 【深度学习入门到精通系列】拿捏Dice系数
  4. Java高新技术第一篇:类加载器详解
  5. repne scasb 内联实现 strlen
  6. python获取数组中大于某一阈值的那些索引值_使用Python+OpenCV进行实时车道检测...
  7. python数值运算答案_笨方法学Python 习题3:数字和数学计算
  8. C#逻辑运算符及解析
  9. python教学视频r_R Tutorial
  10. java实现多个数字求和_图形化界面
  11. 计算机可以辅助解决哪些医学问题,计算机辅助医学影像诊查之关键学习技术研究...
  12. 如何避免循环中“突兀”的break和continue
  13. [数]数学系列预习-补水题ver.
  14. zuul 自定义路由映射规则
  15. idea下载github代码及切换分支
  16. HexEdit Linux下命令集
  17. 人工智能和金融是天作之合的5个理由
  18. Vue 富文本编辑器的使用
  19. oracle数据库单张表备份,oracle数据库如何备份一张表
  20. tomcat运行超时问题解决

热门文章

  1. 推荐排序模型3——DeepFM及python(DeepCTR)实现
  2. 项目中验证过的CRC16.C 和CRC32.C文件
  3. HQL 多表联合查询
  4. 【论文翻译】从进化和异质网络中表征和预测社区成员
  5. elasticsearch踩坑记录 no handler found for uri [http://localhost:9200/hyy/user/_search] and method [POST
  6. WIN10下sen2cor大气校正
  7. Dollar Dayz
  8. 大型网站核心架构要素
  9. git commit 时提示please tell me who you are解决方法
  10. 【附带配置疑问解决】Keil5配置ST-Link仿真器下载程序的方法