Отрицательные собственные значения в PCA

#python #machine-learning #pca #eigenvalue #dimensionality-reduction

#python #машинное обучение #pca #собственное значение #уменьшение размерности

Вопрос:

У меня есть матрица x (1000*25) , которая содержит случайные числа с плавающей запятой в интервале (-5,5) . nFeatures=25 и nPoints=1000 . Я использую этот код, чтобы найти собственные значения ковариационной матрицы, но я получаю отрицательные собственные значения.

 #centering the data
for i in range(0,nFeatures):
    sum=0
    for j in range(0,nPoints):
        sum =x[j][i]
    for j in range(0,nPoints):
        x[j][i]-=sum/nPoints

#covariance matrix and its eigenvalues amp; eigenvectors
c=np.dot(x.T,x)
eValue,eVector=np.linalg.eig(c)
print(eValue)
  

Я получаю результат, который будет:

 [ 1.47374029e 02  8.84275505e-13 -8.01150077e-13 -6.77987718e-13
  5.19228948e-13 -4.01775609e-13 -3.55055652e-13  3.55433578e-13
 -2.54817200e-13  2.51137659e-13  2.23836773e-13  1.77611044e-13
  1.57643867e-13 -1.34409360e-13  1.04358065e-13 -9.31186264e-14
 -8.05736392e-14 -5.69664362e-14  4.39721071e-14  3.59268864e-14
 -2.84466680e-14  2.42670536e-14  2.30979465e-15 -7.18313504e-15
 -9.35335475e-15]
  

Теперь, поскольку моя ковариационная матрица является полуположительной определенной матрицей, I собственные значения не должны быть отрицательными. Пожалуйста, помогите мне определить, что я делаю неправильно.

Кроме того, я прочитал этот пост, и нет, в моем наборе данных нет пропущенных значений.

Комментарии:

1. Это определенно не ковариационная матрица, которую вы вычисляете, поскольку в ваших операциях нет продуктов, только суммы. Как насчет: sum =x[j][i]*x[i][j] ???

2. @ma3oun я не использую sum для вычисления ковариационной матрицы. Я использовал это для центрирования данных о происхождении. Я использовал точечное произведение dot(x.T,x) для вычисления матрицы cov.

3. ваши собственные значения действительно близки к 0 (за исключением первого). Я думаю, это связано с числовой неточностью (это может быть связано с накоплениями, которые вы используете в своем цикле). Вам следует рассмотреть возможность обрезки значений с использованием их абсолютных значений. Попробуйте заменить цикл центрирования операцией numpy с использованием np.average

4. @ma3oun Я попробую это через час и дам вам знать. Спасибо

5. Ну что ж, большое спасибо @ma3oun , это действительно помогло! : D