kNN算法

简介: 【6月更文挑战第6天】kNN算法。

kNN算法将找出k个距离最近的邻居作为目标的同一类别。
1.图解kNN算法
使用OpenCV的ml模块中的kNN算法的基本步骤如下。
(1)调用cv2.ml.KNearest_create()函数创建kNN分类器。
(2)将训练数据和标志作为输入,调用kNN分类器的train()方法训练模型。
(3)将待分类数据作为输入,调用kNN分类器的findNearest()方法找出k个最近邻居,返回分类结果的相关信息。
下面的代码在图像中随机选择20个点,为每个点随机分配标志(0或1);图像中用矩形表示标志0,用三角形表示标志1;再随机新增一个点,用kNN算法找出其邻居,并确定其标志(即完成分类)。

图解kNN算法

import cv2
import numpy as np
import matplotlib.pyplot as plt
points = np.random.randint(0,100,(20,2)) #随机选择20个点
labels = np.random.randint(0,2,(20,1)) #为随机点随机分配标志
label0s = points[labels.ravel()==0] #分出标志为0的点
plt.scatter(label0s[:,0],label0s[:,1],80,'b','s') #将标志为0的点绘制为蓝色矩形
label1s = points[labels.ravel()==1] #分出标志为1的点
plt.scatter(label1s[:,0],label1s[:,1],80,'r','^') #将标志为1的点绘制为红色三角形
newpoint = np.random.randint(0,100,(1,2)) #随机选择一个点,下面确定其分类
plt.scatter(newpoint[:,0],newpoint[:,1],80,'g','o') #将待分类新点绘制为绿色圆点
plt.show()

进一步使用kNN算法确认待分类新点的类别、3个最近邻居和距离

knn = cv2.ml.KNearest_create() #创建kNN分类器
knn.train(points.astype(np.float32), cv2.ml.ROW_SAMPLE,
labels.astype(np.float32)) #训练模型
ret,results,neighbours,dist = knn.findNearest(
newpoint.astype(np.float32), 3) #找出3个最近邻居
print( "新点标志: %s" % results)
print( "邻居: %s" % neighbours)
print( "距离:%s" % dist)
用kNN算法实现手写数字识别
OpenCV源代码中的“samples\data”文件夹下的digits.png文件是一个手写数字图像,如图10-2所示。
digits.png的大小为2000×1000,其中每个数字的大小为20×20,每个数字的样本有500个(5行、100列),共有5000个数字样本。可使用这些数字图像来训练kNN模型和执行测试。

用kNN算法实现手写识别

import cv2
import numpy as np
import matplotlib.pyplot as plt
gray = cv2.imread('digits.png',0) #读入手写数字的灰度图像
digits = [np.hsplit(r,100) for r in np.vsplit(gray,50)] #分解数字:50行、100列
np_digits = np.array(digits) #转换为NumPy数组

准备训练数据,转换为二维数组,每个图像400个像素

train_data = np_digits.reshape(-1,400).astype(np.float32)
train_labels = np.repeat(np.arange(10),500)[:,np.newaxis] #定义标志
knn = cv2.ml.KNearest_create() #创建kNN分类器
knn.train(train_data, cv2.ml.ROW_SAMPLE, train_labels) #训练模型

用绘图工具创建的手写数字5图像(大小为20×20)进行测试

test= cv2.imread('d5.jpg',0) #打开图像
test_data=test.reshape(1,400).astype(np.float32) #转换为测试数据
ret,result,neighbours,dist = knn.findNearest(test_data,k=3) #执行测试
print(result.ravel()) #输出测试结果
print(neighbours.ravel())

将对手写数字9拍摄所得图像的大小转换为20×20进行测试

img2=cv2.imread('d9.jpg',0)
ret,img2=cv2.threshold(img2,150,255,cv2.THRESH_BINARY_INV) #反二值化阈值处理
test_data=img2.reshape(1,400).astype(np.float32) #转换为测试数据
ret,result,neighbours,dist = knn.findNearest(test_data,k=3) #执行测试
print(result.ravel()) #输出测试结果
print(neighbours.ravel())

目录
相关文章
|
5天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
6天前
|
机器学习/深度学习 数据采集 算法
KNN算法原理及应用(一)
**KNN算法**是一种监督学习的分类算法,适用于解决分类问题。它基于实例学习,无需训练过程,当新样本到来时,通过计算新样本与已有训练样本之间的距离,找到最近的K个邻居,然后根据邻居的类别进行多数表决(或加权表决)来预测新样本的类别。K值的选择、距离度量方式和分类决策规则是KNN的关键要素。KNN简单易懂,但计算复杂度随样本量增加而增加,适用于小规模数据集。在鸢尾花数据集等经典问题上表现良好,同时能处理多分类任务,并可应用于回归和数据预处理中的缺失值填充。
KNN算法原理及应用(一)
|
16天前
|
算法
使用k-近邻算法构建手写识别系统(kNN)
使用k-近邻算法构建手写识别系统(kNN)
21 9
|
16天前
|
算法 Python
使用k-近邻算法改进约会网站的配对效果(kNN)
使用k-近邻算法改进约会网站的配对效果(kNN)
23 6
|
16天前
|
存储 算法 索引
k-近邻算法(kNN)
k-近邻算法(kNN)
20 5
|
3天前
|
机器学习/深度学习 算法 搜索推荐
KNN算法(k近邻算法)原理及总结
KNN算法(k近邻算法)原理及总结
|
6天前
|
算法
KNN算法原理及应用(二)
不能将所有数据集全部用于训练,为了能够评估模型的泛化能力,可以通过实验测试对学习器的泛化能力进行评估,进而做出选择。因此需要使用一个测试集来测试学习器对新样本的判别能力。
|
7天前
|
算法
基于蝗虫优化的KNN分类特征选择算法的matlab仿真
摘要: - 功能:使用蝗虫优化算法增强KNN分类器的特征选择,提高分类准确性 - 软件版本:MATLAB2022a - 核心算法:通过GOA选择KNN的最优特征以改善性能 - 算法原理: - KNN基于最近邻原则进行分类 - 特征选择能去除冗余,提高效率 - GOA模仿蝗虫行为寻找最佳特征子集,以最大化KNN的验证集准确率 - 运行流程:初始化、评估、更新,直到达到停止标准,输出最佳特征组合
|
8天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】近邻类模型:KNN算法在数据科学中的实践与探索
【机器学习】近邻类模型:KNN算法在数据科学中的实践与探索
28 0
|
2天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
23 8