小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

K最近邻算法

K-邻近算法概述

K-近邻算法是几种基本的分类和回归算法之一。它的输入是实例的特征向量,对应于特征空间中的点,输出是实例的类别。

算法的三个要素是:K值的选择、距离测量和分类决策。

k-近邻算法(KNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的k个分类标签
在这k个标签中出现次数最多的标签为新数据的标签。简单来说,未标记样本的类别由其 k 个最近邻居的投票决定。

KNN的工作原理:

  1. 计算分类样本与其他训练样本的距离; [距离测量]
  2. 统计k个近邻【k值选择】
  3. k个邻居中出现次数最多的标签就是样本的标签【分类决策】

距离度量

计算距离有不同的公式,一般使用欧氏距离,还有曼哈顿距离,闵可夫斯基距离,切比雪夫距离,余弦距离等,有兴趣可以自己了解。
欧式距离:d = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d = \sqrt{(x1-x2)^2+(y1-y2)^2}d=X1-X22+y1-y22

k值选择

k值对结果有重要影响。如果k值太小,则整体训练的模型会变得复杂并且容易出现过拟合。 k值将涵盖大多数样本的特征,并且可能欠拟合。

分类决策

一般来说,分类决策是通过多数投票做出的,即通过出现更频繁的标签来做出。

KNN算法步骤:

  1. 加载和组织数据;
  2. 计算待测试样本与各训练集数据的距离,并从小到大排序;
  3. 确定并取出前k个值(即距离最小的k个值);
  4. 返回k个值中出现次数最多的标签;
  5. 待测试的样本就是这一类。

举个简单例子,电影分类问题。已知电影的两个个特征【打斗镜头和接吻镜头】,用knn算法求电影的标签【爱情片或动作片】
在这里插入图片描述
计算距离:
在这里插入图片描述
按算法步骤完成排序,将k定义为3,则取出[《He’s Not Really into Dudes》,《Beautiful Woman》,《California Man 》],可知出现次数最多的电影的标签为爱情片(三个都是爱情片)则未知电影为爱情电影

算法代码实例

knn处理的数据类型有:数值型和标称型。

//将上面的表格数据处理
/*
电影名称为[1,2,3,4,5,6]对应[《California Man》,《He’s Not Really into Dudes》,《Beautiful Woman 》,《Kevin Longblade 》,《Robo Slayer 3000》,《Amped II》];
同理两个特征[打斗和接吻]对应具体数值
类别[爱情,动作]对应[0,1].
*/
#导入必备包
import numpy as np
import math
#加载数据并整理数据
data=[[1,3,104,0],[2,2,100,0],[3,1,81,0],[4,101,10,1],[5,99,5,1],[6,98,2,1]]
data=np.array(data)
#求[?,18,90,?]

#求距离并排序
x=data[:,1:2]
y=data[:,2:3]
z=[18,90]
for i,j in zip(x,y):
    distance=math.sqrt((z[0]-i)**2+(z[1]-j)**2)
    test_distance.append(distance)
test_distance=[round(x,2) for x in test_distance]
print(test_distance)
结果:
[20.52, 18.87, 19.24, 115.28, 117.41, 118.93]
example=[]
for i,j in zip(data,target_distance):
    x=np.append(i,j)
    example.append(x)
example
结果:
[array([  1.  ,   3.  , 104.  ,   0.  ,  20.52]),
 array([  2.  ,   2.  , 100.  ,   0.  ,  18.87]),
 array([ 3.  ,  1.  , 81.  ,  0.  , 19.24]),
 array([  4.  , 101.  ,  10.  ,   1.  , 115.28]),
 array([  5.  ,  99.  ,   5.  ,   1.  , 117.41]),
 array([  6.  ,  98.  ,   2.  ,   1.  , 118.93])]

#k取3时,标签全为0,第四位为标签,0为爱情片,故未知电影为爱情片。

python的sklearn库实现了knn算法(iris数据集):

from sklearn.datasets import load_iris   #从数据集导入鸢尾花数据集
from sklearn.model_selection import train_test_split   #导入训练集和测试集分割函数
from sklearn.neighbors import KNeighborsClassifier   #导入knn分类器

#加载数据并整理
iris=load_iris()
#分割数据集为训练集和测试集(.data为特征,.target为标签,test_size为测试集比重)
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.3)  

#构造分类器
knn=KNeighborsClassifier(n_neighbors=3)  #n_neoghbors即为k

#训练模型
knn.fit(x_train,y_train)

#对测试集预测并对模型评分
score=knn.score(x_test,y_test)
print(score)

结果:
1.0

另外KNeighborsClassifier中提供了很多参数对模型处理:
在这里插入图片描述
KNeighborsClassifier对象也提供属性来操作模型:
在这里插入图片描述
使用构建的模型来预测样本
要预测样本首先知道训练集的数据结构,才能进行预测。

在这里插入图片描述
在这里插入图片描述
图中的iris的数据集包含了data和target分别表示特征和标签和其他,我们只用的上data和target,具体用法代码已经写出。

// 数据集特征
print(len(iris.data))
结果:
150
print(len(iris.target))
结果:
150
print(iris.data[:5])
结果:
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
print(iris.target[5])
结果:
0

#可见特征和标签的长度一致,且对应,前5个的数据标签都为0.

#测试集的数据结构也要为同类型
a_data=[5,3.6,1.4,0.2]   a_target=?
#a_data是list而iris.data是numpy下的array,进行数据转换
a_data=np.array(a_data).reshape(1,-1) 
knn.predict(a_data)  
结果:
array([0])

预测结果为0标签,于是发现a_data其实就是iris训练集的第5个数据,而第5个数据的标签是已知的即0,可见预测还是挺准的。

分数随k值的变化趋势

import matplotlib.pyplot as plt
import numpy as np
def function(k):
    iris=load_iris()
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.3)  
    knn=KNeighborsClassifier(n_neighbors=k)  #n_neoghbors即为k
    knn.fit(x_train,y_train)
    score=knn.score(x_test,y_test)
    return round(score.tolist(),2)
   

k=[1,2,3,4,5,10,20,60,100]
score_=[]
score_.append(function(1))
score_.append(function(2))
score_.append(function(3))
score_.append(function(4))
score_.append(function(5))
score_.append(function(10))
score_.append(function(20))
score_.append(function(60))
score_.append(function(100))
#print(score_)

plt.scatter(k,score_)
plt.show()

在这里插入图片描述

. . .

相关推荐

额外说明

创建新模块后,swagger无法扫描新模块中的控制器接口。

 框架默认情况下,只能扫描ruoyi-admin模块下的controller接口。如果需要扫描其它子模块中的swagger注解,那么需要调整一下swagger相关内容。 目录 1、前置条件 2、解决办法 1、前置条件 首先,我们要知道,默认情况下swag

额外说明

MySQL之PXC集群搭建

一、PXC 介绍 1.1 PXC 简介 PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。P

额外说明

zk 搭建maven工程,建立curator与zkserver的连接

              创建客户端      

额外说明

1726: 打印菱形

1726: 打印菱形 时间限制: 1 Sec 内存限制: 128 MB #include <iostream> using namespace std; //规律: 上三角形的行数=用户输入的值 // 下三角形的行数=用户输入的值-1 //打印上三角形

额外说明

深入探索Java反射机制:解析原理与应用

深入探索Java反射机制:解析原理与应用 -一、什么是Java反射机制? -二、反射的基本原理 -三、使用Java反射机制的方法 -1. 获取Class对象 -2. 创建对象 -3. 调用方法 -4. 访问属性 -四、Java反射机制的应用场景 -五、J

额外说明

Zabbix6监控K8S(Zabbix-Proxy监控K8S)

背景 一个月前写的草稿文档,现在才发布,整体完成度90%吧。足够满足从无到有的监控了。 一句话说明需求: zabbix中有很多K8S模板,我把他们都用起来,看能得到哪些监控项。 一句话说明解决: 使用Linux搭建一台外部zabbix6.4,将一套zab

额外说明

Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)

Unity通过Android Studio 获取手机权限(存储、录音、相机等) 文章目录 Unity通过Android Studio 获取手机权限(存储、录音、相机等) 常用权限 一、动态获取权限流程 二、使用步骤 1.检测当前是否已获取权限 2.检测当

额外说明

shell编程(十) : [shell基础] 控制脚本

接上一篇文章shell编程(九) : [shell基础] 呈现数据 目录 3.5 控制脚本 3.5.1 利用信号控制脚本 1. 监测系统信号 2. 监测脚本退出 3. 控制trap 3.5.2 以后台模式运行脚本 3.5.3 脱离终端运行脚本 3.5.4

额外说明

Ctfhub - web -- SQL注入

SQL注入 1.整型注入 2.字符型注入 3.报错注入 4.布尔盲注 方法一:sqlmap 方法二:python脚本 1.整型注入 随便输入一个1,很明显这里已经给出了字段,不需要再order by了 1.数据库名和版本。这里发现是高版本,有inform

额外说明

软件设计师笔记系列(四)

-前言 随着技术的快速发展,软件已经成为我们日常生活中不可或缺的一部分。从智能手机应用到大型企业系统,软件都在为我们提供便利、增强效率和创造价值。然而,随之而来的是对软件质量的日益增长的关注。软件的质量不仅关乎其功能性和性能,还涉及其可靠性、使用性、可维

ads via 小工具