Python:对权重进行归一化的约束,使得权重不大于 1/sqrt(n)

Python: Constraint to normalize weights, such that no weight is greater than 1/sqrt(n)

我有以下数据框:

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)

并强制执行约束,使得 none 的权重大于 1/sqrt(N)。

这可以一行完成吗?

要规范化并确保没有值大于参考值,您需要获取规范化值的最大值并再次规范化:

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))

我会坚持使用这两条线