VB.NET + EmguCV实现PCA降维
来源:互联网 发布:install ubuntu reboot 编辑:程序博客网 时间:2024/06/05 14:18
PCA。Principal Component Analysis。主成分分析。
顾名思义,就是要从多元事物中解析出主要的影响因素。揭示事物的本质,简化复杂的问题。
PCA的目的是将高维的数据通过线性变换投影到较低维空间。
投影后的值应该尽可能的分散,才能尽量多的保留原始的信息。在数学上可以用最大方差来表示。
投影的低维空间应该相互之间不存在相关性。在数学上可以用协方差来表示相关性。
维度内的方差与维度间的协方差都可以表示为内积的形式,通过数学推导,可以得出我们想要的方差最大和协方差矩阵为零可以等价为将协方差矩阵对角化。具体推导及原理可参考http://blog.codinglabs.org/articles/pca-tutorial.html
算法步骤如下:
设有m条n维数据。想要将数据降维到k维
①将原始数据按列组成n行m列矩阵X
②将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
③求出协方差矩阵C = 1/m * X (X转置)
④求出协方差矩阵的特征值及对应的特征向量
⑤将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
⑥Y = P X 即为降维到k维后的数据
VB.NET + EmguCV3.0的代码实现如下:
样本X是500幅29*29的图片
Dim n = 29 * 29Dim m = 500Dim X As Emgu.CV.Matrix(Of Double) = New Matrix(Of Double)(m, n)Dim fileCollection As Collections.ObjectModel.ReadOnlyCollection(Of String) = FileIO.FileSystem.GetFiles(Application.StartupPath & "\img")For i = 0 To fileCollection.Count - 1Dim img As Image(Of Gray, Byte) = New Image(Of Gray, Byte)(fileCollection(i))Dim j As Integer = 0For x1 = 0 To img.Width - 1For y1 = 0 To img.Height - 1X.Data(i, j) = img.Data(y1, x1, 0)j = j + 1NextNextNext计算每一维度上的均值,进行零均值化
'计算每一维度上的均值Dim Xxmean(n - 1) As DoubleFor j = 0 To n - 1For i = 0 To m - 1Xxmean(j) = Xxmean(j) + X.Data(i, j)NextXxmean(j) = Xxmean(j) / (m - 1)Next'每一维度上零均值化For j = 0 To n - 1For i = 0 To 499X.Data(i, j) = X.Data(i, j) - Xxmean(j)NextNext计算协方差矩阵
'协方差矩阵C = 1/mXXtDim C As Emgu.CV.Matrix(Of Double) = New Matrix(Of Double)(n, n)For i = 0 To n - 1For j = 0 To n - 1Dim sum As Double = 0For z = 0 To m - 1sum = sum + X.Data(z, i) * X.Data(z, j)NextC.Data(i, j) = sum / mNextNext
计算对称矩阵的特征值和特征向量
因为协方差矩阵是对称阵,可以通过雅可比过关法来求特征值与特征向量。本文中并未实现该方法,而是通过EmguCv中的Eigen方法来求特征值与特征向量。
'特征向量,按行排列~Dim eigenVector As Emgu.CV.Matrix(Of Double) = New Matrix(Of Double)(n, n)'特征值输出矩阵,按降序排列。特征值与特征向量的排序是一致的Dim eigenValues As Emgu.CV.Matrix(Of Double) = New Matrix(Of Double)(n, 1)CvInvoke.Eigen(C, eigenValues, eigenVector)特征值降序排列,取前k行,并与样本X相乘,求得降维后的结果
'k为降维后的维度Dim k As Integer = 99'取前k行组成PDim P As Emgu.CV.Matrix(Of Double) = New Matrix(Of Double)(n, k)For i = 0 To k - 1For j = 0 To n - 1P.Data(j, i) = eigenVector.Data(j, i)NextNext'Y = PX即为降维到k维后的输出Dim Y As Emgu.CV.Matrix(Of Double) = New Matrix(Of Double)(k, m)For i = 0 To k - 1For j = 0 To m - 1Dim sum As Double = 0.0For x1 = 0 To n - 1sum = sum + P.Data(x1, i) * X.Data(j, x1)NextY.Data(i, j) = sumNextNext
http://blog.csdn.net/u013162930/article/details/77688165
阅读全文
1 0
- VB.NET + EmguCV实现PCA降维
- 【Emgucv】emgucv实现自动对比度
- PCA降维 python实现
- PCA降维 C++实现
- [VB.NET]vb.net实现搜索??
- VB.net实现五子棋
- VB.NET 实现自动关机
- vb.net实现分页
- VB.NET多态性实现
- VB.NET超链接实现
- vb.net实现繁简转换
- VB.NET实现计算器
- VB.NET实现老板键
- VB.net实现Singleton模式
- VB.NET 排列组合算法实现
- [VB.NET]断点续传怎么实现
- VB.NET实现邮件发送
- vb.net实现“快乐十分”
- 集合相减A-B
- FCC Spinal Tap Case
- 动态链接的整个过程
- Web Storage
- Python中的sorted函数以及operator.itemgetter函数
- VB.NET + EmguCV实现PCA降维
- HTML5的认知与理解
- 输入输出格式练习
- go context专题(三)- context 工作机制和代码分析
- python之函数
- JSP之WEB服务器:Apache与Tomcat的区别 ,几种常见的web/应用服务器
- R语言统计分析
- HDU3836(强联通分量+思维)
- 里程计、推算定位与视觉里程计