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:

Matlab PCA:计算协方差矩阵的特征值时遇到的自动排序问题_第1张图片

这是Val:

Matlab PCA:计算协方差矩阵的特征值时遇到的自动排序问题_第2张图片

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


下面是在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:计算协方差矩阵的特征值时遇到的自动排序问题_第3张图片

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

Matlab PCA:计算协方差矩阵的特征值时遇到的自动排序问题_第4张图片

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

Matlab PCA:计算协方差矩阵的特征值时遇到的自动排序问题_第5张图片

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

你可能感兴趣的:(科研)