分享
三行代码  ›  专栏  ›  技术社区  ›  tryingtocode101

字典迭代Lambda函数

  •  1
  • tryingtocode101  · 技术社区  · 5 天前

    我一直在遍历数组字典,并对字典中的每个数组元素应用线性回归。

    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    for i in my_dict.keys():
        test = model.fit(x_val.reshape(-1,1), my_dict[i].reshape(-1,1))
        coeff = float(test.coef_)
        intercept = float(test.intercept_)
        my_dict[i] = lambda x: coeff * x  + intercept
    

    在每一次迭代中,我都非常确信将正确的coeff和截取分配给lambda函数。然而,似乎字典中存储的每个lambda函数都在使用系数并截取字典中的“last”键。我似乎不明白这是为什么。谢谢!

    1 回复  |  直到 5 天前
        1
  •  1
  •   0x5453    5 天前

    here here

    这在Python中有点奇怪——闭包中的变量查找基于包含范围和变量名的组合。因为lambda是在模块范围内定义的(注意 for 循环不创建新作用域),并且由于名称 coeff intercept

    要解决此问题,可以执行以下操作之一:

    1. 通过包装每个迭代强制新作用域 my_dict[i] = lambda x: coeff * x + intercept
    2. 烘烤 系数 拦截 my_dict[i] = lambda x, coeff=coeff, intercept=intercept: coeff * x + intercept
    3. 拯救个人 拦截 my_dict