R 中的归一化函数
Normalization function in R
我有一个要转换的矩阵,转换后的数据集中的每个特征均值为 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
函数。
这是一个例子,我们用介于 0 和 1 之间的随机均匀变量填充矩阵并居中并将它们缩放为具有 0 均值和单位标准差:
m <- matrix(runif(1000), ncol=4)
m_scl <- scale(m)
确认列均值为0(在公差范围内)且标准差为1:
colMeans(m_scl)
# [1] -1.549004e-16 -2.490889e-17 -6.369905e-18 -1.706621e-17
apply(m_scl, 2, sd)
# [1] 1 1 1 1
有关详细信息,请参阅 ?scale
。
要编写自己的归一化函数,您可以使用:
my_scale <- function(x) {
apply(m, 2, function(x) {
(x - mean(x))/sd(x)
})
}
m_scl <- my_scale(m)
或以下,在较大的矩阵上可能更快
my_scale <- function(x) sweep(sweep(x, 2, colMeans(x)), 2, apply(x, 2, sd), '/')
根据我的经验,只是建议另一个自己编写的规范化函数来避免 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。
我试过使用下面的代码:
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
函数。
这是一个例子,我们用介于 0 和 1 之间的随机均匀变量填充矩阵并居中并将它们缩放为具有 0 均值和单位标准差:
m <- matrix(runif(1000), ncol=4)
m_scl <- scale(m)
确认列均值为0(在公差范围内)且标准差为1:
colMeans(m_scl)
# [1] -1.549004e-16 -2.490889e-17 -6.369905e-18 -1.706621e-17
apply(m_scl, 2, sd)
# [1] 1 1 1 1
有关详细信息,请参阅 ?scale
。
要编写自己的归一化函数,您可以使用:
my_scale <- function(x) {
apply(m, 2, function(x) {
(x - mean(x))/sd(x)
})
}
m_scl <- my_scale(m)
或以下,在较大的矩阵上可能更快
my_scale <- function(x) sweep(sweep(x, 2, colMeans(x)), 2, apply(x, 2, sd), '/')
根据我的经验,只是建议另一个自己编写的规范化函数来避免 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)
(注意这里考虑的是行向量)