我当前正在编写一个使用主成分分析(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%)。
我似乎真的找不到为什么有时会得到另一个结果的原因。