【问题标题】:Normalization function in RR中的归一化函数
【发布时间】:2015-04-18 06:48:21
【问题描述】:

我有一个要转换的矩阵,这样转换后的数据集中的每个特征都具有 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)

但是,这对我不起作用。我在正确的轨道上吗?

编辑:我对语法很陌生!

【问题讨论】:

    标签: r normalization


    【解决方案1】:

    您可以为此使用内置的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), '/')
    

    【讨论】:

    • 谢谢。这是家庭作业,因此我尝试自己编写一个函数,但我很可能会使用内置函数,因为我已经花了太多时间编写自己的函数。
    • 感谢您的澄清!
    【解决方案2】:

    根据我的经验,只是建议另一个自己编写的规范化函数避免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 的情况下写道;现在已修复
    • 非常好!谢谢你的坚持。我曾怀疑您之前无法对其进行测试。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2020-11-05
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多