【问题标题】:Why two different normalized results from Python vs R为什么 Python 与 R 有两种不同的归一化结果
【发布时间】:2018-09-14 12:17:15
【问题描述】:

谁能解释幕后的数学原理?为什么 Python 和 R 会返回不同的结果?我应该将哪一个用于实际业务场景?

原始数据

id  cost    sales   item
1   300      50     pen
2   3        88     wf
3   1        70     gher
4   5        80     dger
5   2        999    ww

Python 代码:

import pandas as pd
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('Scale.csv')
df[['cost', 'sales']] = StandardScaler().fit_transform(df[['cost', 'sales']])
df

Python 标准化结果

    id     cost        sales    item
0   1   1.999876    -0.559003   pen
1   2   -0.497867   -0.456582   wf
2   3   -0.514686   -0.505097   gher
3   4   -0.481047   -0.478144   dger
4   5   -0.506276   1.998826    ww

和R代码

library(readr)
library(dplyr)
df <- read_csv("C:/Users/Ho/Desktop/Scale.csv")
df <- df %>% mutate_each_(funs(scale(.) %>% as.vector), 
                             vars=c("cost","sales"))

R 归一化结果

   id   cost     sales     item 

1   1   1.7887437   -0.4999873  pen
2   2   -0.4453054  -0.4083792  wf
3   3   -0.4603495  -0.4517725  gher
4   4   -0.4302613  -0.4276651  dger
5   5   -0.4528275  1.7878041   ww

感谢@温

【问题讨论】:

  • 如果我们真的有 Scale.csv 会有所帮助,这样我们就可以自己运行和验证。
  • 我不怎么使用 Python,但看起来它的转换在计算要按比例缩放的方差时使用 n 作为分母,而 R 在分母中使用 (n-1)。
  • 数据中是否有缺失值?
  • @Dason 即 R 使用的是 正确 分母。 (我在开玩笑。)
  • @joran 是有道理的,因为 R 适用于自认为是程序员的统计学家,而 Python 适用于自认为是统计学家的程序员。

标签: python r normalization standardized


【解决方案1】:

我在 Python 中使用的函数不多,但数据似乎暗示不同之处在于 Python 中的函数在计算要标准化的方差时使用“n”,而 R 使用“n-1”。我们可以通过乘法在两者之间进行转换,下图显示,在乘以 sqrt(5/4) 后,R 中的数据与 Python 值匹配。

> tab <- read.table(textConnection("1   1   1.7887437   -0.4999873  pen
+ 2   2   -0.4453054  -0.4083792  wf
+ 3   3   -0.4603495  -0.4517725  gher
+ 4   4   -0.4302613  -0.4276651  dger
+ 5   5   -0.4528275  1.7878041   ww"))
> tab
  V1 V2                   V3                   V4   V5
1  1  1  1.78874369999999994 -0.49998730000000002  pen
2  2  2 -0.44530540000000002 -0.40837920000000000   wf
3  3  3 -0.46034950000000002 -0.45177250000000002 gher
4  4  4 -0.43026130000000001 -0.42766510000000002 dger
5  5  5 -0.45282749999999999  1.78780410000000001   ww
> # To transform as if we used n in the denominator instead of
> # n-1 we just multiply by sqrt(n/(n-1))
> tab$V3 * sqrt(5/4)
[1]  1.99987625376224520 -0.49786657257386746 -0.51468638770401975
[4] -0.48104675744371517 -0.50627653604064304
> tab$V4 * sqrt(5/4)
[1] -0.55900279534329034 -0.45658182589849106 -0.50509701018251196
[4] -0.47814411760212272  1.99882574902641608

【讨论】:

  • 实际上,@joran 指出的戏弄有些正确。由于样本量非常小,使用 n-1 在统计上更稳健。
  • 没关系,因为 Python 仅适用于 BIIIIiiiiG 数据。
  • 我应该在实际业务场景中使用哪一个?
  • @BigData 这很可能无关紧要。不同之处在于数据集的舍入误差足以让您在实际应用程序中使用机器学习算法,我假设您希望在 R 中使用 scikit-learn 或任何类似的东西。
猜你喜欢
  • 2021-04-02
  • 2016-10-24
  • 2011-09-18
  • 2019-11-10
  • 1970-01-01
  • 2023-04-09
  • 2021-03-14
  • 1970-01-01
  • 2019-04-19
相关资源
最近更新 更多