已完成向量化的子数组调用np.cov仅得单个值,遗漏哪些步骤?
问题原因及解决步骤
你现在只得到单个数值的核心问题是:np.cov() 对一维数组只会计算该数组的方差,而你当前的代码每次循环都覆盖了vectorized_points,最后只保留了一个样本的一维向量,自然输出单个数值。要得到(k²,k²)的协方差矩阵,需要完成以下两步:
1. 收集所有向量化后的样本
你需要把每个子数组向量化后的结果收集起来,形成一个二维数组——其中每一行是一个样本,每一列是一个特征(比如28×28的子数组向量化后是784维特征,最终数组形状为(n_samples, 784))。
2. 正确调用np.cov()
np.cov()默认参数rowvar=True,即把每一行当作一个特征、每一列当作样本。但我们的数组是行对应样本,所以需要设置rowvar=False,让函数按列处理特征,最终得到特征间的协方差矩阵。
修正后的代码示例
import numpy as np # 初始化列表存储所有向量化样本 vectorized_samples = [] for i in indexes_cov: # 对每个子数组向量化并加入列表 vec = np.reshape(data[i], -1) vectorized_samples.append(vec) # 转换为二维numpy数组,形状为(样本数, k²) samples_array = np.array(vectorized_samples) # 计算协方差矩阵,rowvar=False指定列是特征 cov_matrix = np.cov(samples_array, rowvar=False) # 验证矩阵形状,应为(k², k²) print(cov_matrix.shape)
关键说明
- 如果你的子数组是28×28,
k=28,那么k²=784,最终协方差矩阵形状就是(784,784),完全符合需求。 - 必须保证
indexes_cov对应的样本数≥2,否则协方差矩阵无法有效计算(单个样本的协方差无意义)。
内容的提问来源于stack exchange,提问作者user16446371
相关产品推荐
相关产品推荐

