为什么eig函数返回随机特征向量输出?

时间:2019-06-17 08:26:38

标签: python

我当前正在编写一个使用主成分分析(PCA)方法的程序。在这种方法中,我需要在某个点对角矩阵。问题是我从public class Mymenu extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mymenu); SharedPreferences spref = getApplication().getSharedPreferences("inputrate", Context.MODE_PRIVATE); String strValue = spref.getString("inputrate", null); mytoast(strValue+""); } private void mytoast(String str) { Toast toast=Toast.makeText(this, str, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } } 函数获得的特征向量似乎是随机变化的。实际上,到目前为止,我只有2种不同的输出,但是我似乎无法找到为什么知道代码中没有随机数的原因。

我回溯了问题,找到了似乎发生问题的确切代码行,即在eig的函数调用处。在这两种情况下,矩阵都是相同的,但特征向量是不同的。我试图清除“缓存”,因为我想到了内存问题。

这是我需要对角化的矩阵:

scipy.linalg.eig

然后我使用此行代码:

Correl = [[ 1.         -0.31480977 -0.30633648 -0.50678917 -0.2893621   0.32947458 -0.13322344] 
[-0.31480977  1.          0.62236985 -0.20370937  0.43460133 -0.58462531 0.40706924] 
[-0.30633648  0.62236985  1.         -0.07714359  0.38977168 -0.50934797 0.31623602] 
[-0.50678917 -0.20370937 -0.07714359  1.         -0.29568009  0.2460785 -0.09532513] 
[-0.2893621   0.43460133  0.38977168 -0.29568009  1.00001712 -0.57611582 0.13188172] 
[ 0.32947458 -0.58462531 -0.50934797  0.2460785  -0.57611582  1.00000918 -0.17321888] 
[-0.13322344  0.40706924  0.31623602 -0.09532513  0.13188172 -0.17321888 1.        ]]

并获得(第一种情况):

eigen_vect = scipy.linalg.eig(Correl)[1]

第二种情况:

eigen_vect = [[ 0.27313467 -0.64185435 -0.15258761  0.23664101  0.63970045 -0.09582508 -0.12545671] 
[-0.48868004 -0.02845756 -0.17816479  0.25470271  0.23146581  0.32655111 0.70961523] 
[-0.45093568  0.061271   -0.13613905  0.61824463 -0.14146876 -0.54934967 -0.2652247 ] 
[0.13254909  0.74957323 -0.04001237  0.06623071  0.63447648 -0.05975133 -0.09193795]
[-0.41456602 -0.12907317  0.42874072 -0.51711073  0.29276371 -0.50505542 0.13950429]
[0.47081336  0.06888745 -0.29862056 -0.02505472 -0.16593134 -0.56875602 0.57686281]
[-0.26860159 -0.01391499 -0.80737021 -0.47379677  0.03727327 -0.0161946 -0.22288553]]

您可能会注意到,两个本征向量矩阵之间的唯一区别是,在其他情况下,四个第一本征向量是四个第一本征向量的加法逆,最后三个保持不变。正确的输出应该是第一个输出,因为在这种情况下,我从整个代码运行中获得的实际结果就是正确的输出。而且,该程序似乎获得了最多的输出(大约是我尝试的时间的90%)。

我似乎真的找不到为什么有时会得到另一个结果的原因。

0 个答案:

没有答案