matlab 求向量的交集_MATLAB 并不完美,有些算法存在错误

847a83a8fba721698e9b39f27b5b4716.png

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阶的数据矩阵

1368fbd526852e27a36f2a339e4fb4c7.png

PCA算法应用:

(1)发现特征向量对区分性的贡献率

通过对有n个记录的样本集进行计算,确定m个特征向量中,每个特征向量对样本集记录区分性影响的贡献率。

(2)消除变量间的相关性

当用多个变量描述事物时,变量之间可能存在相关性。例如,一个人的身高与体重存在一定的关系,通常身材高大的人,体重也较大。由于PCA算法采用正交矩阵变换得到的P个综合指标,因此,正交矩阵保证了P个综合指标的不相关性,变量之间是彼此独立的,消除了原m个指标之间的相互影响。

(3)降低维度

当矩阵X的维数m较大时,计算量较大,需降低维度。在不影响对事物评价的基础上,选择较少的几个主要指标P(p<m)代替原来较多的变量指标m,将原来用m个单一指标描述事物的状态,变为用少数几个综合指标,可降低维度,减少计算量。

计算步骤为:

步骤1:构建相关系数矩阵

12775a6f98a9a896d5880a5d038e6a8d.png

步骤2:雅可比变换

4d913239195e56f7a3f067a1ca98d0bc.png

步骤3:计算贡献率和累计贡献率

7c606a5e10a8fc8e2dae4e8e498f7a10.png

步骤4:计算P个综合指标对原m个指标的相关系数,确定主要成分

23d32489ca1fc5e96d40308b5068087f.png

三、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计算

38bc53af843b756d9fc6d2120537f622.png

2、我的计算结果

下面是我自己编写的数据挖掘平台计算结果。

14d0a3466018d384c603243484daf609.png

3、比较结果

MATLAB与我的程序计算结果完全相同,贡献率、累计贡献率计算没有问题。

(二)特征向量值计算

1、MATLAB计算

3d678725c93c909e9421c58bd67336c7.png

2、我的计算结果

38952597e8f4fb0e0c6e5c65e3d2e77c.png

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计算

64498f1e8bc81f2689ed09c2c6cc2fb2.png

2、我的计算结果

e773cb1b6264fa1b2777de86e91d1827.png

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计算

c07c0046cef430bcd7d339021efa240f.png

7163678e34b57283026b6b908a737985.png

2、我的计算结果

b5048a2a5ce92152f0ef4dec757aaef0.png

3、比较结果

第1主要成分得分z1相同,而第2主要成分得分不同。

四、结论

从前面的计算结果看出,MATLAB程序在计算特征向量值时程序有错误,因此,以后的计算结果也不可能正确。

从MATLAB的PCA算法可知,MATLAB并不完美,不能拿来就用,其中一些算法也错误,最好在实际应用前,自己要完全掌握算法,理解算法原理,先手算验证后在使用。

欢迎对算法研究有兴趣的认识交流沟通,批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值