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

Posted

技术标签:

【中文标题】Python:规范化权重的约束,使得没有权重大于 1/sqrt(n)【英文标题】:Python: Constraint to normalize weights, such that no weight is greater than 1/sqrt(n) 【发布时间】:2022-01-08 13:09:57 【问题描述】:

我有以下数据框:

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/sqrt(N)。

这可以在一行中完成吗?

【问题讨论】:

【参考方案1】:

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

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

我会坚持这两行

【讨论】:

它正在处理我在此处发布的数据框。但由于某种原因,在我拥有的原始数据帧(更大)上,由于某种原因,我得到了所有条目 NaN。 你知道为什么会这样吗? 不是没有例子,你能提供一个吗? 好吧,我误解了这个问题。如果任何权重大于 1/sqrt(N),则应将其剪裁为 1/sqrt(N),剩余权重根据其相对权重按比例分配。这可以做到吗?很抱歉造成误解。 你应该在你的问题中提供一个例子

以上是关于Python:规范化权重的约束,使得没有权重大于 1/sqrt(n)的主要内容,如果未能解决你的问题,请参考以下文章

PuLP:规范化多个决策变量并分配权重

深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码

使用 R 中的 quadprog 包对投资组合优化中的权重进行约束

algorithms IV带权重的并查集算法

林轩田Adaptive Boosting

损失函数设计,为假阳性和假阴性结合不同的权重