MATLAB是Matrix & Laboratory两个词的组合,意为矩阵实验室,是美国Mathworks公司出品的数学工具软件包,集成了众多数学算法,用户不必具体掌握复杂的数学算法,也不必编写算法程序,可直接调用MATLAB。MATLAB被广泛用于数据分析、深度学习、人工智能、机器人、控制系统等领域。
由于美国制裁,哈工大被禁用MATLAB,在国内造成较大影响,激起国人高涨爱国热情,但可惜,到目前为止,国内尚没有代替产品,只能望洋兴叹,默默承受。
其实MATLAB并不完美,一个偶然机会,本人发现MALAB程序也有错误。本人开发了一个用于数据挖掘的工具,集成了数据挖掘常用算法,算法计算过程全部可视化,目的是提供一个学习、测试算法的可视化平台。其中集成了PCA(Principal Component Analysis)算法,为了验证程序是否正确,进行手算时发现与MATLAB计算结果不同。一直认为是自己手算有误,从未怀疑过MATLAB有问题。后发现,只要人为将矩阵元素位置稍作调整,就与MATLAB计算结果相同,但如果调整矩阵元素位置,就不是矩阵元素应在的正确位置,由此可以确认,MATLAB矩阵计算程序错误,并非我手算错误。分析原因:
第一、对编写MATLAB的程序员来说,要对算法非常清楚,否则很容易出现逻辑错误(并非程序Bug), 并非一般程序员都可胜任。因此,MATLAB中程序难免出现错误,这很有可能是程序员不知道算法原理所致。
第二、对MATLAB的用户来说,由于矩阵计算量巨大,很难进行手工计算,而利用MATLAB计算非常方便。尤其在大学,几乎所有大学在教学时都不进行手工计算,直接用MATLAB计算,因此,没人怀疑MATLAB有问题,错误很难被发现。
其实MATLAB并不完美,如果你真正研究算法,通过手算就可发现一些问题。以下仅以主要成分分析PCA算法为例,说明MATLAB存在的错误。不仅是PCA算法,如,Rough set 粗糙集算法等,还有其他算法问题,以后我将陆续发布,欢迎志同道合的人一起探讨。
一、什么是PCA算法
PCA(Principal Component Analysis)算法,从字面可知,是主要成分分析。目前,很多人认为,PCA算法的功能是降维,减少变量个数。本人认为,其实PCA算法的本意,是通过数据样本,发现各个变量对事物区分性影响的贡献率,当然,去除影响不大的变量,可降低维度,减少计算量。但PCA算法本意是为了发现描述事物(如用户画像)特征向量对事物影响的贡献率,以便后续选择合适的变量进行数学建模。
PCA算法,是大数据、人工智能技术解决问题中的一个重要环节。因为,采用任何算法的第一步就是建立数学模型,而选择哪些变量是建模的关键。
二、算法简述
设有n个样本,每个样本共有m个属性,构成一个n×m阶的数据矩阵
PCA算法应用:
(1)发现特征向量对区分性的贡献率
通过对有n个记录的样本集进行计算,确定m个特征向量中,每个特征向量对样本集记录区分性影响的贡献率。
(2)消除变量间的相关性
当用多个变量描述事物时,变量之间可能存在相关性。例如,一个人的身高与体重存在一定的关系,通常身材高大的人,体重也较大。由于PCA算法采用正交矩阵变换得到的P个综合指标,因此,正交矩阵保证了P个综合指标的不相关性,变量之间是彼此独立的,消除了原m个指标之间的相互影响。
(3)降低维度
当矩阵X的维数m较大时,计算量较大,需降低维度。在不影响对事物评价的基础上,选择较少的几个主要指标P(p<m)代替原来较多的变量指标m,将原来用m个单一指标描述事物的状态,变为用少数几个综合指标,可降低维度,减少计算量。
计算步骤为:
步骤1:构建相关系数矩阵
步骤2:雅可比变换
步骤3:计算贡献率和累计贡献率
步骤4:计算P个综合指标对原m个指标的相关系数,确定主要成分
三、BATLAB计算例子与我手算结果比较
MATLAB例子来源于网络,如冒犯原作者知识产权,请及时通知我,以便及时处理。
记录号 特征X1 特征X2 特征X3
1 149.3 4.2 108.1
2 161.2 3.1 123.2
3 180.8 1.1 132.1
4 190.7 2.2 137.7
5 202.1 2.1 146.0
6 212.4 5.6 154.1
7 226.1 5.0 162.3
8 231.9 5.1 164.3
9 239.0 0.7 167.6
10 258.0 0.7 167.6
11 269.8 3.9 186.6
12 288.4 3.1 199.7
13 304.5 4.6 213.9
14 323.4 7.0 223.8
15 336.8 1.2 232.8
16 353.3 4.5 242.9
样本集共有16条记录,X1,X1,X3为特征变量。为简单起见,仅列出计算结果。
(一)贡献率、累计贡献率计算
1、MATLAB计算
2、我的计算结果
下面是我自己编写的数据挖掘平台计算结果。
3、比较结果
MATLAB与我的程序计算结果完全相同,贡献率、累计贡献率计算没有问题。
(二)特征向量值计算
1、MATLAB计算
2、我的计算结果
3、比较结果
特征向量e1、e2、e3不同。
特征向量e1:
MATLAB计算结果是: 0.6712,0.26619,0.68406
我的计算结果是: 0.6792, 0.2083, 0.7038。
特征向量e2:
MATLAB计算结果是: 0.20846,-0.9635,0.16797
我的计算结果是: 0.266, 0.9635,-0.0286。
特征向量e3:
MATLAB计算结果是: 0.7038,-0.028523,-0.70983
我的计算结果是: 0.6841,- 0.1679,-0.7088。
看出,两者计算值很多都不同。经我反复手算,特征向量值e1、e2、e3总是与MATLAB不同。最后,由于笔误,偶然将矩阵中元素位置放错了,奇迹出现了,竟然与MATLAB计算的e1、e2、e3值完全相同?简直不敢想先,原来是MATLAB的矩阵计算程序有错误。
(三)主成分荷载计算
1、MATLAB计算
2、我的计算结果
3、比较结果
主要成分荷载z1:
MATLAB计算结果是: 0.97882,0.38365,0.98593
我的计算结果是: 0.979, 0.383, 0.986。
主要成分荷载z2:
MATLAB计算结果是: 0.1988,-0.92347,0.16009
我的计算结果是: -0.200, 0.924, -0.161。
看到z1列的结果相同,而z2列的计算结果不同。显然,这是由于特征向量e1、e2、e3不同,导致z2列的计算结果不同。
(四)主成分荷载得分计算
1、用MATLAB计算
2、我的计算结果
3、比较结果
第1主要成分得分z1相同,而第2主要成分得分不同。
四、结论
从前面的计算结果看出,MATLAB程序在计算特征向量值时程序有错误,因此,以后的计算结果也不可能正确。
从MATLAB的PCA算法可知,MATLAB并不完美,不能拿来就用,其中一些算法也错误,最好在实际应用前,自己要完全掌握算法,理解算法原理,先手算验证后在使用。
欢迎对算法研究有兴趣的认识交流沟通,批评指正。