Ошибка изменения формы в многомерной нормальной функции с Numpy - Python - PullRequest
0 голосов
/ 03 мая 2018

У меня есть эти данные (c4), я хочу использовать 4-кратное перекрестное тестирование для этой матрицы. Я делю данные следующим образом:

from scipy.stats import multivariate_normal
from sklearn.model_selection import KFold
import math

c4 = np.array([
[5,10,14,18,22,19,21,18,18,19,19,18,15,15,12,4,4,4,3,3,3,3,3,3,3,3,3,3,3,1],
[6,9,11,12,10,10,13,16,18,21,20,19,8,5,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3],
[4,8,12,17,18,21,21,21,17,16,15,13,7,8,8,7,7,4,4,4,3,3,3,3,4,4,3,3,3,2],
[3,7,12,17,19,20,22,20,20,19,19,18,17,16,16,15,14,13,12,9,4,4,4,3,3,3,3,3,2,1],
[2,5,8,10,10,11,11,10,13,17,19,20,22,22,20,16,15,15,13,11,8,3,3,3,3,3,3,3,2,1],
[4,8,10,11,10,15,15,17,18,19,18,20,18,17,15,13,12,7,4,4,4,4,4,4,4,4,3,3,3,2],
[2,8,12,15,18,20,19,20,21,21,23,19,19,16,16,16,14,12,10,7,7,7,7,6,3,3,3,3,2,1],
[2,13,17,18,21,22,20,18,18,17,17,15,13,11,8,8,4,4,4,4,4,4,4,4,4,4,4,4,3,1],
[6,6,9,14,15,18,20,20,22,20,16,16,15,11,8,8,8,5,4,4,4,4,4,4,4,5,5,5,5,4],
[8,13,16,20,20,20,19,17,17,17,17,15,14,13,10,6,3,3,3,4,4,4,3,3,4,3,3,3,2,2],
[5,9,17,18,19,18,17,16,14,13,12,12,11,10,4,4,4,3,3,3,3,3,3,3,4,4,3,3,3,3],
[4,6,8,11,16,17,18,20,16,17,16,17,17,16,14,12,12,10,9,9,8,8,6,4,3,3,3,2,2,2] ])

kf = KFold(n_splits=4)

for train_index, test_index in kf.split(c4):
    X_train, X_test = c4[train_index], c4[test_index]
    X_train_mean = np.mean(X_train)
    X_train_cov = np.cov(X_train.T)
    v = multivariate_normal(X_train_mean, X_train_cov)
    res = v.pdf(X_test)
    print (res)

но со мной это не сработало, несмотря на то, что цикл разбиения хорошо работает с небольшой выборкой данных.

Сообщение об ошибке, которое я получил:

ValueError: невозможно преобразовать массив размером 900 в форму (1,1)

Примечание: длина всех строк равна.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вы берете среднее значение всей матрицы X_train, когда делаете np.mean(X_train). Вам нужно взять среднее значение по оси выборки, т. Е. Если ваши объекты расположены по столбцам, а разные выборки - по строкам, то замените np.mean(X_train) на np.mean(X_train, axis=0). Это должно решить ошибку.

Включение этой строки в коде выше заставляет его работать По сути, np.mean(c4[test_index], axis=0) даст вам 1 x 30 средний вектор вместо скалярного среднего.

from scipy.stats import multivariate_normal as mvn
v = mvn(np.mean(c4[test_index], axis=0), X_train_cov + np.eye(30))

Мне пришлось добавить единичную матрицу, потому что я получал ошибку единственной матрицы. Однако это связано с тем, как определяется c4, и не имеет ничего общего с этим кодом. Обратите внимание: чтобы избежать сингулярности, вы обычно добавляете очень маленькое значение по диагонали, а не единичную матрицу. Это только для иллюстрации.

0 голосов
/ 03 мая 2018

Что такое multivariate_normal? Если оно от scipy.stats, то для документа вы должны сделать

 multivariate_normal.pdf(X_test, np.mean(X_train, axis=0), X_train_cov)

Документ здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...