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)的主要内容,如果未能解决你的问题,请参考以下文章
深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码