代码之家  ›  专栏  ›  技术社区  ›  MathMan 99

Python:用于规范化权重的约束,使得权重不大于1/sqrt(n)

  •  1
  • MathMan 99  · 技术社区  · 4 年前

    我有以下数据帧:

    df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
    df:
    
        a   b
     0  1   3
     1  2   4
    

    我有一个样本量N=5。我想使用

    df.div(df.sum(axis=1), axis=0)
    

    这可以在一行中完成吗?

    1 回复  |  直到 4 年前
        1
  •  2
  •   mozway    4 年前

    要规范化并确保没有任何值大于引用,需要获取规范化值的最大值并再次规范化:

    import numpy as np
    N = 5 # 1/np.sqrt(N) = 0.447214
    df2 = df.div(df.sum(axis=1), axis=0)
    df2 = df2.div(df2.values.max()*np.sqrt(N))
    

    输出:

              a         b
    0  0.149071  0.447214
    1  0.198762  0.397523
    

    你能一行完成吗?是的,但是你应该吗?

    通过两次执行相同的计算:低效

    N = 5
    df2 = df.div(df.sum(axis=1), axis=0).div(df.div(df.sum(axis=1), axis=0).values.max()*np.sqrt(N))
    

    N = 5
    df2 = (df2:=df.div(df.sum(axis=1), axis=0)).div(df2.values.max()*np.sqrt(N))
    

    我会坚持这两条线