使用Centering matrix实现行均值中心化函数出错求助
代码问题排查与修正
问题1:函数调用名称不匹配
定义的函数是centering,但调用时写的是center_with_matrix,会直接触发名称错误。
问题2:shape属性使用错误
data.shape是numpy数组的属性,并非可调用方法,不能加括号,正确写法是data.shape[0],而非data.shape()[0]。
问题3:函数无返回值
函数内部仅修改了data变量,但未通过return返回计算结果,调用后无法获取中心化后的矩阵。
问题4:中心化矩阵逻辑错误(核心问题)
你需要实现每行减去自身均值的行中心化,但当前代码构造的是用于列中心化(每列减去该列均值)的矩阵,且矩阵维度、乘法顺序均不符合需求:
- 当前构造的是n×n(n为样本数,即行数)的矩阵,左乘数据矩阵会对列进行操作;
- 要实现行中心化,需构造p×p(p为特征数,即列数)的中心化矩阵,并让数据矩阵右乘该矩阵。
修正后的行中心化代码
import numpy as np def centering(data): # 获取特征数(列数)p p = data.shape[1] # 构造行中心化的p×p矩阵 centering_matrix = np.identity(p) - (1/p) * np.ones((p, p)) # 数据矩阵右乘中心化矩阵,实现每行减自身均值 centered_data = data @ centering_matrix return centered_data data = np.array([[1,2,3], [3,4,5]]) result = centering(data) print(result)
验证结果
运行后输出符合预期:
[[-1. 0. 1.] [-1. 0. 1.]]
第一行均值为2,第二行均值为4,每个元素减去对应行的均值后得到上述结果。
若需求为列中心化(每列减列均值)
仅修正前三个问题,保留原矩阵构造逻辑即可:
import numpy as np def centering(data): n = data.shape[0] centering_matrix = np.identity(n) - (1/n) * np.ones((n, n)) centered_data = centering_matrix @ data return centered_data data = np.array([[1,2,3], [3,4,5]]) result = centering(data) print(result)
输出结果
[[-1. -1. -1.] [ 1. 1. 1.]]
内容的提问来源于stack exchange,提问作者sonsuz-ders
相关产品推荐
相关产品推荐

