Вычисление ковариационной матрицы без использования numpy - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь вычислить ковариационную матрицу, которая максимизирует оценку вероятности вручную, без использования библиотеки numpy, но я не могу получить правильный ответ. Я пытаюсь go по этой формуле:

Maximum Likelihood estimate for covariance

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

mat = [[1,2,3],[4,6,8],[3,5,7]]

#now calc covariance for each element of the matrix
Cov = []
for j in range(len(means)):
    sum = 0
    covs = []
    for k in range(len(means)):
        for i in range(len(means)):
            sum += ((mat[i][j] - means[j]) * (mat[i][k] - means[k]))
        result  = sum/ len(means)
        covs.append(result)
    Cov.append(covs)
print(np.reshape(S,(3,3)))

Вот что я получаю:

[[ 1.55555556  3.66666667  6.33333333]
[ 2.11111111  5.          8.66666667]
[ 2.66666667  6.33333333 11.        ]]

Вот что я должен получить:

[[1.55555556 2.11111111 2.66666667]
[2.11111111 2.88888889 3.66666667]
[2.66666667 3.66666667 4.66666667]]

1 Ответ

3 голосов
/ 02 апреля 2020

Вы должны сбросить сумму для каждой записи ковариационной матрицы,

    covs = []
    for k in range(len(means)):
        sum = 0
        for i in range(len(means)):
            sum += ((mat[i][j] - means[j]) * (mat[i][k] - means[k]))
        covariance  = sum/ len(means)
        covs.append(covariance)

Вы можете сократить этот бит до

    covs = []
    for k in range(len(means)):
        terms = ( (mat[i][j] - means[j]) * (mat[i][k] - means[k]) for i in range(len(means)) )
        covariance  = sum(terms) / len(means)
        covs.append(covariance)

Обязательно очистите рабочее пространство так, чтобы sum опять-таки является встроенной функцией, а не числом.

...