运气太好了!MATLAB计算出来的结果是错的这种事情都遇上了

标题:运气太好了!MATLAB计算出来的结果是错的这种事情都遇上了

最近求解一个优化问题,由于存在x’Hx,需要矩阵H为(半)正定矩阵才能保证x’Hx对向量x是凸函数。矩阵H是由一个方阵与其自身转置相乘得到的,即H=AA’,以前遇到的矩阵H都是半正定的,但现在有个数据集(记为D)的结果显示算法不收敛,检查之后发现其原因是针对该数据集D,矩阵H不是半正定的。呃,这就麻烦了,因为暂时还没能力从数学上证明矩阵H什么时候是半正定的、什么时候不是半正定的,只是以前从未遇到过矩阵H不是半正定的情况,所以就默认它是半正定矩阵了,但现在出现了意外情况,所以这个事情就必须得讨论一下了。

百思不得其解之后,想到可能是数据集D过大导致的,因为当前H是12646*12646的矩阵,而其它数据集都比较小(不过万),于是尝试只使用该数据集的一部分进行测试,发现当矩阵H的规模变小时,它的确就成为半正定矩阵了。呃,这是怎么回事呢?于是从算法本质上去思考,但始终无法解决~

突然想到针对该数据集D,自己曾在其它电脑(记为PC2)上调试过这个程序,当时显示算法收敛,所以才挪到了本电脑(记为PC1)上来跑程序等结果,由于当时的程序版本未考虑到数据集的一些极端分布情况(样本x的K个近邻与x都一模一样)会使程序在处理某些其它数据集时报错,所以程序进行了一小点改动以处理这种特殊呢况,这的确可能会导致针对数据集D时的H矩阵有轻微的变动,但如此轻微改变真的就会导致算法不收敛么?

于是将原来在电脑PC2上针对数据集D收敛的程序版本拿到PC1上来跑,发现程序仍是不收敛,检查之后发现H矩阵不是半正定的。呃,这就奇怪了,一模一样的程序,两个电脑的MATLAB版本都一样(R2016),换个电脑为什么跑出来的结果就不一样了呢?于是把这个程序在两台电脑上同时跑,在关键位置设置断点,检查结果是否一致。检查了矩阵H之后,发现两个矩阵几乎是一模一样的,但基于该矩阵得到的结果就不一样了。又考虑到可能不同电脑的小数点取舍可能不一样,虽然两个电脑上的矩阵H几乎一样,但还是有非常微小的差异的,于是索性把电脑PC2上的矩阵H存下来拿到电脑PC1上来测试,发现其仍不是半正定矩阵,但该矩阵在电脑PC2上测试时就是半正定的。呃,看来问题找到了,两台电脑针对同一个矩阵H的计算结果是不同的。

由于本电脑PC1上仍安装有另一个MATLAB版本R2017,打开另一个MATLAB对矩阵H进行测试,发现结果显示矩阵H是半正定的,与PC2的结果一样。呃,看来是本电脑PC1上的R2016版本的MATLAB计算错了!!!

为什么会算错呢?难道是本电脑PC1安装了多个MATLAB版相互有影响?于是将另一个不常用的R2017卸载重启,发现不管用;将R2016版本卸载重装,发现也不管用,呃。。。

后来又换了两台电脑对矩阵H进行测试,发现计算结果都显示它是半正定的,与PC2的结果一样,看来这确实是本电脑PC1的MATLAB R2016算出来的结果是错的~

难道是电脑的操作系统与MATLAB版本不兼容,毕竟本电脑PC1上的R2017版本的MATLAB计算结果是对的,考虑到电脑PC1的系统是购机时自带的win10家庭中文版(据说相比于专业版会有很多功能限制),网上搜了个序列号将其升级成了win10专业版,继续在R2016版MATLAB中测试,发现结果仍然是错的;将MATLAB卸载重装一遍后再测试,结果还是错了~

呃,看来运气太好真碰到小概率事件了。记得读本科时,曾选过一个公选课《数学建模》,任课老师是学校的数学建模指导老师,曾经在课堂上说过MATLAB有时也会算错。十多年过去了,也算是比较经常使用MATLAB,从未发现过计算结果是错的这种情况,没想到现在真的遇到了,好激动~

在测试矩阵是否为半正定时,使用Heig=eig(H);求解矩阵的特征值,半正定矩阵的特征值不小于零;还可以使用[U,S,V] = svd(H);进行SVD分解,矩阵H的特征值存在矩阵S的对角线上,然后使用Ssort=sort(diag(S));将特征值取出观察即可。

我将矩阵H、本电脑PC1使用R2016版本MATLAB计算所得其特征值Heig、以及使用SVD分解得到的特征值Ssort上传到了网络(备份一下),参见本文开篇的资源Heig_matlabR2016a_win10_i7-7500U.mat或链接https://pan.baidu.com/s/1we_LohtOnTDzNHSMxYVmeg 提取码:pdel

值得注意的是,Heig和Ssort也是不同的,且两者都是错误的,具体原因不详。

仅以此文纪念这段传奇的经历!

附:本电脑PC1系统信息如下和计算出错的MATLAB版本如下:

运气太好了!MATLAB计算出来的结果是错的这种事情都遇上了_第1张图片

运气太好了!MATLAB计算出来的结果是错的这种事情都遇上了_第2张图片

 

你可能感兴趣的:(matlab使用)