使用scipy或sklearn缩放两个矩阵

2 投票
2 回答
1224 浏览
提问于 2025-04-18 17:31

我想对一个矩阵 X1 进行按列缩放,然后用在缩放 X1 时得到的均值和标准差来缩放另一个矩阵 X2。

据我所知,sklearn 这个库在缩放矩阵时并不会返回均值和方差。有没有其他的方法可以用,而不需要我自己去实现呢?

举个例子:
X1

1  2  3  4
5  6  7  8
9 10 11 12  

X2

12 13 14 15
16 17 18 19 

X2[i][j] 替换成 (X2[i][j] - mean[X1[:, i]]) / std[X1[:, i]]

因为 sklearn 的缩放函数不能用,因为它不返回均值和方差。

2 个回答

0

这段话的意思是,.std().mean() 这两个方法都可以接受一个叫做 axis 的参数,用来计算每一行或每一列的统计数据。其他的事情就会通过一种叫做广播的方式自动处理了。

In [170]:

X1
Out[170]:
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
In [171]:

X2
Out[171]:
array([[12, 13, 14, 15],
       [16, 17, 18, 19]])
In [172]:

(X2-X1.mean(0))/X1.std(0)
Out[172]:
array([[ 2.14330352,  2.14330352,  2.14330352,  2.14330352],
       [ 3.3680484 ,  3.3680484 ,  3.3680484 ,  3.3680484 ]])
4

scikit-learn中的标准化工具(Standard Scaler)可以很好地处理这个问题,以及一些特殊情况。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X1)
output = scaler.transform(X2)

如果需要,你可以通过以下方式获取特征列的均值和标准差:

scaler.std_
scaler.mean_

你还可以将标准化工具放在一个处理流程中,作为在估计器之前的预处理步骤。

撰写回答