欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-07 18:17:51
...

这几天在用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:

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

这是Val:

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

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


下面是在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结果:

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

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

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

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

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

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