R中的归一化函数

R中的归一化函数,r,normalization,R,Normalization,我有一个要变换的矩阵,这样变换后的数据集中的每个特征的平均值为0,方差为1 我已尝试使用以下代码: scale <- function(train, test) { trainmean <- mean(train) trainstd <- sd(train) xout <- test for (i in 1:length(train[1,])) { xout[,i] = xout[,i] - trainmean(i) } for (i in 1:lengh

我有一个要变换的矩阵,这样变换后的数据集中的每个特征的平均值为0,方差为1

我已尝试使用以下代码:

scale <- function(train, test) 
{   
trainmean <- mean(train)
trainstd <- sd(train)
xout <- test
for (i in 1:length(train[1,])) {
    xout[,i] = xout[,i] - trainmean(i)
}
for (i in 1:lenght(train[1,])) {
    xout[,i] = xout[,i]/trainstd[i]
}

}
invisible(xout)

normalized <- scale(train, test)

scale您可以为此使用内置的
scale
功能

下面是一个例子,我们用0到1之间的随机均匀变量填充矩阵,并将其标度为0平均值和单位标准偏差:

m <- matrix(runif(1000), ncol=4)    
m_scl <- scale(m)
有关更多详细信息,请参见
?比例

要编写自己的归一化函数,可以使用:

my_scale <- function(x) {
  apply(m, 2, function(x) {
    (x - mean(x))/sd(x)
  }) 
}

m_scl <- my_scale(m)

my_scale根据我的经验,仅仅建议使用另一个自己编写的规范化函数来避免
apply
,比矩阵计算慢:

m = matrix(rnorm(5000, 2, 3), 50, 100)

m_centred = m - m%*%rep(1,dim(m)[2])%*%rep(1, dim(m)[2])/dim(m)[2]
m_norm = m_centred/sqrt(m_centred^2%*%rep(1,dim(m)[2])/(dim(m)[2]-1))%*%rep(1,dim(m)[2])

## Verirication
rowMeans(m_norm)
apply(m_norm, 1, sd)

(注意这里考虑了行向量)

谢谢。这是家庭作业,因此我试图自己编写一个函数,但我很可能会使用内置函数,因为我已经花了太多时间编写自己的函数。谢谢您的澄清!我无法计算出这里的中心(以及随后的缩放)是什么。行向量和列向量的均值都不接近0,方差也不接近1。这里有打字错误吗?我的矩阵代数非常粗略,但我希望看到它工作:)对不起,我每次都忘了用
dim(m)[2]
除法,现在修改好了。可能有一些地方放错了
,因为我写的时候没有R;这个问题现在就解决了非常好!谢谢你的坚持。我怀疑你之前无法测试它。
my_scale <- function(x) sweep(sweep(x, 2, colMeans(x)), 2, apply(x, 2, sd), '/')
m = matrix(rnorm(5000, 2, 3), 50, 100)

m_centred = m - m%*%rep(1,dim(m)[2])%*%rep(1, dim(m)[2])/dim(m)[2]
m_norm = m_centred/sqrt(m_centred^2%*%rep(1,dim(m)[2])/(dim(m)[2]-1))%*%rep(1,dim(m)[2])

## Verirication
rowMeans(m_norm)
apply(m_norm, 1, sd)