Matlab PCA:计算协方差矩阵的特征值时遇到的自动排序问题

这几天在用matlab计算PCA的过程中的协方差矩阵的特征值,然后对特征值进行排序,每次用sort函数排完序之后,发现索引都是从大到小,换用不同的数据集之后依然是这样,但是eig函数并没有将特征值排序的功能,然后用python实现了一下,发现python并没有排序。详细过程见程序和图。

    maxs = max(B);
    mins = min(B);
    x = (B - mins)./(maxs - mins);
    nu = mean(x);    
    mid = x - nu; 
    covMat = cov(mid);
    [Vect,Val] = eig(covMat);       
    sum_Val = sum(Val);
    weights = Val/sum_Val;

上述代码时matlab里的程序,输出的covMat是协方差矩阵,对其求特征值,得到Val。

这是covMat:



这是Val:


这里的特征值自动排序了,是按从小到大的顺序排列的。


下面是在python里运行的结果,代码如下:

def pca(x, alpha=0.85):
    
    
    # 数据归一化
    maxs = np.max(x, axis=0)
    mins = np.min(x, axis=0)
    x = (x - mins)/(maxs - mins)
    print(x)
    
    # 求每列的均值
    nu = np.mean(x, axis=0)
    
    # 将数据进行集中化
    mid = x - nu
    
    # 计算协方差矩阵
    covMat = np.cov(mid, rowvar=0)
    
    # 计算covMat的特征值和特征向量
    w, U = np.linalg.eig(covMat)
    
    # 保存协方差矩阵的特征值
    savedW = pd.DataFrame(w)
    savedW = savedW.transpose()
    savedW.to_csv('pca协方差矩阵的特征值.csv', index=False, header=False)   
    
    sumLambda = sum(w)
    print(sumLambda)
    weights = w/sumLambda
    print(weights)

两种代码下的协方差矩阵covMat结果一样,这是python中的covMat结果:


python中的特征值如下,是没有经过排序的:


为什么协方差矩阵都相同,但算出来的特征值顺序就不同呢?matlab中的eig函数没有自动排序的功能,为了测试,又执行了下述过程:


可知只对A算特征值,没有排序,但是对A的协方差矩阵算特征值的话,特征值就是经过排序的。如果问题出在matlab的cov函数,但是python和matlab算出的协方差矩阵又都是相同的,算出来的特征值应该是完全一样的,为什么上面求的特征值顺序就不一样了呢?如果问题出在matlab的eig函数,但是eig函数有没有排序功能,对他们求特征值也应该是相同的。问题到底是出在matlab的哪个部分?

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值