使用 Numpy 重塑多元正态函数中的错误 - Python

Reshaping error in multivariate normal function with Numpy - Python

我有这个数据 (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: cannot reshape array of size 900 into shape (1,1)

注意:所有行的长度相等。

提前致谢。

什么是multivariate_normal?如果它来自 scipy.stats,那么根据文档您必须执行

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

The doc is here.

当您执行 np.mean(X_train) 时,您正在取整个矩阵 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 的定义方式有关,与此代码无关。请注意,为避免奇点,您通常会在对角线上添加一个非常小的值而不是单位矩阵。这只是为了说明。