效果查看
前4行为驯训练样本,后面为识别及处理的效果
实现过程
这里主要使用奇异值分解:
程序编程主要围绕这个公式进行:
读取样本
样本中心化
这里记得注意:矩阵中心化是按列处理,所以程序里对只有Mean[j],最后记得求均值。最后用样本减去均值,获得新的矩阵,就是中心化了
Matrix就是最后的中心化后的矩阵。里面的std[]用于求方差的,暂时不用理会
奇异值处理
这里直接调用函数,这里分别输出的就是三个目标值,特征值,左右奇异矩阵
数据处理
尤其图片原本是112*92的,按照原始图片大小处理,高达10304维,数据量太大,且处理起来有相当多的数据是没有意义的,这里按照特征值特征向量自身体现的属性处理,上一步得到的特征值Eig是按照特征值大小排列得到的,对一幅图像而言,取前n个特征值就可以将图片的大部分信息表现出来了,我们这里为了简化运算,取n=50,实际验证效果也是非常好的
这里要说明一点:
一定要注意:这里使用的特征向量是包含在左奇异矩阵的,并非右奇异矩阵里。
计算样本中心
这里要注意一下,在计算样本中心的时候,顺带着就把这50个样本人为的按照原始信息分类了,原始信息是5个人,每人10张图片,所以我们这里分为5类。
计算比较新样本对特征样本
注意这里比较的思想,是将目标对象中心化处理,将其与样本特征点积,求出目标与样本之间的距离,这个距离与训练样本与特征样本之间的距离比较,目标样本距离与训练样本哪个距离近,那目标样本就是那个样本。
注意,这个思想是将目标样本整体作为一个单位与训练样本比较,而不是用某个具体的 目标特征去比对,举个栗子:人们在回忆某个人的时候,你想起来的应该是这个人的脸的轮廓,大概模糊的样子而不会是你只想起这个人的眼睛是什么样的,鼻子是什么样的,而忘记大体轮廓的样子。这个要细品一下。
显示结果
我们将比较的结果显示出来:
验证
验证结果如下:
左侧文本框显示识别效果,下面就是识别后的图像。有兴趣的可以将代码下载回去沟通交流。