基于K邻近分类法(KNN)的图像分类及应用

本文介绍了K邻近分类法(KNN)的基本原理和实现过程,包括创建二维点集、可视化分类和绘制结果。进一步探讨了利用稠密SIFT进行图像分类,解释了稠密SIFT与标准SIFT的区别,并提供了手势识别的实例,展示其在图像分类中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. K邻近分类法(KNN)

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个在分类方法中最简单且用的最多的一种方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

这种方法通常分类效果较好,但也存在弊端

  • 该算法需要预设k值,而k值的选择会影响分类的性能。k的大小在特定环境下是由数据决定的。(不能太大也不能太小)
  • 对于非常大的训练集,搜索速度就非常慢。
  • 对噪声敏感。
  • 可行性一般。

1.1 KNN的实现

所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

这里利用一个简单的二维示例来说明病可视化分类器的工作原理。

1.1.1 创建二维点集

实现最基本的KNN形式非常简单。给定训练样本集和对应的标记列表,这些训练样本和标记可以在一个数组里成行摆放或者干脆摆放列表里。训练样本可能是数字、字符串等任何你喜欢的形状。

定义一个类并用训练数据初始化非常简单。每次想对某些东西进行分类时,用KNN方法,我们就没必要存储并将训练数据作为参数来传递。用一个字典来存储邻近标记,我们便可以用文本字符串或数字来表示标记。

在下面这个例子中我们用欧氏距离进行度量,创建了两个不同的二维点集。每个点集有两类,并用Pickle模块来保存创建的数据。
相关代码块:

from numpy.random import randn
import pickle
from pylab import *

# create sample data of 2D points
n = 200
# two normal distributions
class_1 = 0.6 * randn(n,2)
class_2 = 1.2 * randn(n,2) + array([1,6])
labels = hstack((ones(n),-ones(n)))

# save with Pickle
with open('points_normal_test.pkl', 'wb') as f:
    pickle.dump(class_1,f)
    pickle.dump(class_2,f)
    pickle.dump(labels,f)
# normal distribution and ring around it
print ("save OK!")

class_1 = 0.6 * randn(n,2)
r = 0.8 * randn(n,1) + 10
angle = 2*pi * randn(n,1)
class_2 = hstack((r*cos(angle)/2,r*sin(angle)/4))
labels = hstack((ones(n),-ones(n)))

# save with Pickle
with open('points_ring_test.pkl', 'wb') as f:
    pickle.dump(class_1,f)
    pickle.dump(class_2,f)
    pickle.dump(labels,f)

1.1.2 可视化分类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值