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:
这是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的哪个部分?