【问题标题】:Reshaping error in multivariate normal function with Numpy - Python使用 Numpy 重塑多元正态函数中的错误 - Python
【发布时间】:2018-10-13 02:31:55
【问题描述】:

我有这个数据 (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)

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

提前致谢。

【问题讨论】:

  • 作为备注,请在代码开头包含您的导入(KFold,multivariate_normal)。此外,您可以减小 c4 的大小,但仍然存在错误:这将使示例更具可读性。
  • 好的,谢谢@P.Camilleri
  • 还可以减少特征数量(c4的列)

标签: python numpy machine-learning scikit-learn cross-validation


【解决方案1】:

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

【讨论】:

  • 你试过你的方法了吗?它不能解决错误。
  • 我做到了......它没有给我一个错误。当我删除 axis=0 时,我能够重现 OP 发布的错误。让我发布一个有效的代码 sn-p。
  • 这并不能解决错误,但我做了@P.Camilleri 在他的帖子中谈到的更改。如果我在参数中添加 X_train,则会出现此错误:TypeError: __call__() got multiple values for argument 'cov' 如果我没有添加此参数,则会出现此错误:numpy.linalg.linalg.LinAlgError: 奇异矩阵
  • 从同一个 multivariate_normal 文档中,在没有第一个参数 x 的情况下调用它是有效的,即仅使用均值和方差。阅读以下内容:>。因此,这可能是也可能不是您的错误的解决方案。但是,我提到的很可能是您的错误。你确定你想要一个30 x 30 协方差矩阵,然后是一个1 x 1 标量作为平均值。这没有意义。
  • 数据集来自M.L.的讲师。当然,它代表一个文本识别值。但最后一个 np.eye(30) 对我有用。
【解决方案2】:

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

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

The doc is here.

【讨论】:

  • 是的,它来自 scipy.stats import multivariate_normal
  • 和你看到的一样,第一个参数是均值,第二个是协方差。
  • 不,我认为第一个参数是所需的分位数。阅读我指给你的文档
  • 我做了这个改变:v = multivariate_normal(X_train, X_train_mean, cov=X_train_cov) 但是我得到了这个错误:TypeError: __call__() got multiple values for argument 'cov'
  • @MeqdadDarweesh 查看我的编辑。确保 X_train_cov 不是单数。
猜你喜欢
  • 2018-02-06
  • 2020-07-11
  • 2017-07-22
  • 2019-08-30
  • 2023-04-07
  • 1970-01-01
  • 2019-08-25
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多