我有这组数据(c4),我想对这个矩阵进行4折交叉验证测试。我分割数据的方式如下:
from scipy.stats import multivariate_normalfrom sklearn.model_selection import KFoldimport mathc4 = 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)
注意:所有行的长度是相等的。
提前感谢。
回答:
当你使用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 mvnv = mvn(np.mean(c4[test_index], axis=0), X_train_cov + np.eye(30))
我不得不添加一个单位矩阵,因为我遇到了奇异矩阵错误。然而,这与c4
的定义有关,与这段代码无关。注意,为了避免奇异性,你通常会在对角线上添加一个非常小的值,而不是一个单位矩阵。这只是为了说明问题。