一、欧氏距离
二维的公式
ρ = sqrt( (x1-x2)^2+(y1-y2)^2 )
三维的公式
ρ = sqrt( (x1-x2)^2+(y1-y2)^2+(z1-z2)^2 )
n维空间的公式
n维欧氏空间是一个点集,它的每个点 X 可以表示为 (x[1],x[2],…,x[n]) ,其中 x[i](i = 1,2,…,n) 是实数,称为 X 的第i个坐标,两个点 A = (a[1],a[2],…,a[n]) 和 B = (b[1],b[2],…,b[n]) 之间的距离 ρ(A,B) 定义为下面的公式。
ρ(A,B) =sqrt [ ∑( a[i] - b[i] )^2 ] (i = 1,2,…,n)
二、K均值算法
k均值(k-means)是聚类算法的一种,聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象分组。其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的。组内的相似性越大,组间差别越大,聚类就越好。
举个例子,在二维平面上有几百个点,在笛卡儿坐标系中有(x,y)坐标,把它们点到纸上,问题是如何把它们分成不同组,每个组里点彼此之前都比较相近,而离其它组的成员又比较远。下面介绍的k均值就能干这种事。
基本k均值
基本k均值思想很简单,首先,选择k个初始质心,其中k是用户指定的参数,即所期望的簇的个数。每个点被指派到最近的质心,而指派到一个质心的点集为一个簇。然后根据指派到簇的点,更新每个簇的质心。重复指派和更新步骤,直到簇不发生变化,或等价的,直到质心不发生变化。
三、特征提取
1、第一步,参照网上曾经有人的做法:
为简单起见,我们使用了最简单的图像特征——黑色像素在图像中的分布来进行训练和测试。首先,我们把图像规范化为 32*32 像素的图片,然后按 2*2 分切成 16*16 共 256 个子区域,然后统计这 4 个像素中黑色像素的个数,组成 256 维的特征矢量,如下是数字 2 的一个特征矢量:
0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 2 2 4 4 2 1 0 0 0 0 0 0 1 2 3 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 2 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 4 4 4 2 2 2 2 4 3 2 2 2 2 2 0 2 4 4 4 0 0 0 0 4 2 0 0 0 0 0 0 2 4 4 4 0 0 0 0 4 2 0 0 0 0 0 0 2 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 2 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 2 4 4 4
相应地,因为我们只需要识别 0~9 共 10 个数字,所以创建一个 10 维的矢量作为结果,数字相应的维置为 1 值,其它值为 0。数字 2 的结果如下:0 0 1 0 0 0 0 0 0 0
核心代码为:
For m_i As Integer = 1 To 16
myinitwidth = myendwidth
myendwidth += jiange
For myi As Integer = myinitwidth To myendwidth
For myj As Integer = myinitheight To myendheight
mycolor = myybcominfo.mybitmap.GetPixel(myi, myj)
If mycolor.B = 0 And mycolor.R = 255 And mycolor.G = 0 Then
While (Not Monitor.TryEnter(mymonitorobj))
Thread.Sleep(1)
End While
myjgtz(mycount) += 1
Monitor.Exit(mymonitorobj)
Thread.Sleep(1)
End If
Next
Next
mycount += 1
myendwidth += 1
Next
2、在第一步的特征基础上进一步加工,加上位置信息,以位置做为权重,调整第一步的特征矢量,核心代码为:
For mi As Integer = 0 To 15
If myjgtz(mi) > 0 Then
pictz(myii, myjj, m_j) += mi * myjgtz(mi)
End If
myjgtz(mi) = 0
Next
3、第三步计算每个数字的K均值,核心代码为:
'计算K均值
Dim mmsum As Double = 0
For myii As Integer = 0 To 9
mystr &= vbCrLf & myii & "的样本均值是:" & vbCrLf
For myk As Integer = 0 To 15
mmsum = 0
For myjj As Integer = 0 To 9
mmsum += pictz(myii, myjj, myk)
ProgressBar1.Value = count
count += 1
Next
mmsum /= 10
ktz(myii, myk) = mmsum
mystr &= ktz(myii, myk) & ","
Next
mystr &= vbCrLf
Next
最后,进行待识别数字的特征值,然后进行欧氏距离对比
Dim jqtz(16) As Integer
'欧氏距离
Dim mys(10) As Integer
Dim temp As Integer = 1000000000
Dim jgnum As Integer = -1
For m_iii As Integer = 0 To 9
mys(m_iii) = 0
For m_jjj As Integer = 0 To 15
mys(m_iii) += Pow(ktz(m_iii, m_jjj) - jqtz(m_jjj), 2)
Next
If mys(m_iii) < temp Then
temp = mys(m_iii)
jgnum = m_iii
End If
Next
jg.Text = ""
For m_iii = 0 To 9
jg.Text &= m_iii & ":" & mys(m_iii) & vbCrLf
Next
jg.Text &= "结果是:" & jgnum
实验表明,算法有较高的识别率,进一步提高需要改进算法,对于仿宋的识别率最高,达90%,黑体、楷体等识别率也可以,手写数字,只要书写较规范,然后写的位置适当,在方框较中间,识别率较高,程序见附件,如果手写识别,建议使用手写的数字做为样本,这样识别率较高,如果是本机数字识别,可以自动生成样本数据。
- 大小: 125.5 KB
- 大小: 126.7 KB
- 大小: 126.5 KB
- 大小: 127 KB
- 大小: 125.7 KB
- 大小: 128.9 KB
- 大小: 129.6 KB
- 大小: 129.6 KB
- 大小: 129.3 KB
- 大小: 129.5 KB
- 大小: 128.9 KB
分享到:
相关推荐
《基于K-近邻算法的手写数字识别研究》是一篇探讨如何运用机器学习中的K-近邻算法(K-Nearest Neighbors, KNN)来解决手写数字识别问题的学术文章。在这个研究中,作者关注的是如何从手写数字的图像中提取有用的信息...
在机器学习领域,K均值(K-Means)算法是一种广泛应用的无监督学习方法,主要用于数据聚类。它的目标是将数据集分成K个不同的类别,使得每个数据点尽可能地属于与其最近的聚类中心。这个“最近”通常通过欧氏距离来...
在这个特定的资源中,它被应用在识别手写数字的任务上,这是数据挖掘和机器学习领域的一个经典示例。资源包含了一个名为"RecongnizeNum.py"的Python脚本,很可能包含了实现KNN算法识别手写数字的代码,以及一个名为...
本文档将深入探讨使用k-近邻(k-Nearest Neighbors, k-NN)算法实现的手写数字识别系统,该系统基于《机器学习实战》一书中的示例。这个项目旨在帮助读者理解k-NN算法的工作原理,并通过实际操作提升其在机器学习领域...
KNN(K-Nearest Neighbors)算法是一种监督学习方法,广泛应用于分类和回归问题,尤其在模式识别和数据挖掘领域。在这个手写数字识别的案例中,我们将探讨如何使用KNN算法来识别图像中的手写数字。这个压缩包包含了...
标题中的"faaron-KNN手写数字识别"指的是一个基于K-Nearest Neighbors (KNN)算法的项目,用于识别手写的数字。KNN是一种监督学习算法,常用于分类问题,尤其在图像识别领域有广泛应用。在这个项目中,Python编程语言...
手写数字识别是一种计算机视觉技术,它利用机器学习算法来解析和理解人类手写的数字。在基于MATLAB的实现中,这个过程通常包括数据预处理、特征提取、模型训练以及分类四个主要步骤。以下是对这些步骤的详细解释: ...
通过使用OpenCV和vc实现欧氏距离模板匹配手写数字识别
在本文中,我们将深入探讨基于MATLAB的手写数字识别技术,这是一个在图像处理、机器学习和计算机视觉领域广泛应用的主题。手写数字识别是自动识别手写数字的一种技术,广泛应用于移动设备、银行支票自动处理系统等...
在本课程"Day02-机器学习-KNN+鸢尾花识别"中,我们将深入探讨机器学习中的一个重要算法——K近邻(K-Nearest Neighbors,简称KNN)。KNN是一种非参数监督学习方法,常用于分类和回归任务。在鸢尾花识别的实例中,...
在本项目中,我们主要探讨的是手写数字识别这一领域,这是模式识别的一个经典应用,广泛应用于自动柜员机(ATM)和智能手机等设备。手写数字识别主要依靠计算机视觉和机器学习技术来实现,这包括神经网络、人工智能...
本项目聚焦于一个特定的应用场景——手写数字识别,通过C#编程语言来实现。下面将详细介绍这个项目涉及的知识点。 1. C#编程基础:C#是Microsoft开发的一种面向对象的编程语言,广泛用于Windows桌面应用、游戏开发...
《欧氏距离计算器》是一款专为行业教育和学习设计的软件工具,主要功能是计算欧氏距离,这对于理解和应用数学、统计学、机器学习等领域至关重要。欧氏距离是衡量两个点在多维空间中直线距离的标准方法,是基础数学...
标题中的“利用KNN算法实现手写体数字的识别”是指使用K-最近邻(K-Nearest Neighbor,简称KNN)算法进行计算机视觉领域的手写数字识别任务。这项技术在机器学习领域有着广泛的应用,特别是在模式识别和图像分类中。...
这种识别系统通常依赖于模式识别和机器学习算法,尤其是对于简单的字符,如数字和基本的拉丁字母,可以通过计算特征之间的欧式距离来进行识别。 描述中提到的“基于欧式距离的简单界面实现鼠标手写识别简单数字字母...
机器学习中的KNN(K-Nearest Neighbors)算法是一种基于实例的学习,也被称为懒惰学习,因为它在预测阶段才进行计算。KNN的核心思想是:一个样本的类别由其最近邻的K个样本的类别决定,其中K通常取奇数以避免平局。...
在模式识别领域,k均值聚类是一种广泛应用的无监督机器学习算法,它主要用于将数据集分割成k个互不重叠的簇。这个算法基于一个简单的目标:最小化簇内的平方误差和,即所有数据点到其所属簇中心的距离平方和。下面...
在本项目中,KNN被应用来识别手写数字,具体是使用了著名的MNIST数据集。MNIST是Machine Learning的一个经典入门案例,它包含60,000个训练样本和10,000个测试样本,每张图片都是28x28像素的灰度图像,代表0到9的手写...
本项目通过这两种方法实现了一个手写数字识别系统,这在图像识别和模式识别领域具有重要的实际应用价值。 首先,朴素贝叶斯模型是一种基于概率的分类方法,其基础是贝叶斯定理。它假设特征之间相互独立,这就是...