【问题标题】:Dictionary Iteration Lambda Function字典迭代 Lambda 函数
【发布时间】:2020-05-22 16:26:14
【问题描述】:

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

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

在每次迭代中,我都非常有信心将适当的系数和截距分配给 lambda 函数。但是,似乎字典中每个存储的 lambda 函数都在使用系数并截取字典中的“最后一个”键。我似乎无法解释为什么会这样。谢谢!

编辑:我知道我可以将线性回归器对象分配给每个键,而不是使用 lambda 函数(我只是更喜欢 lambda 函数)。然而,这并没有解决这个问题。

【问题讨论】:

    标签: python dictionary for-loop lambda scikit-learn


    【解决方案1】:

    请参阅 herehere

    这在 Python 中有点奇怪——闭包中的变量查找是基于包含范围和变量名的组合。由于您的 lambda 是在模块范围内定义的(请注意,for 循环不会创建新范围),并且由于名称 coeffintercept 没有更改,因此每次查找将始终是上次迭代的值循环。

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

    1. 通过将 my_dict[i] = lambda x: coeff * x + intercept 包装在本地函数中来强制每次迭代使用新范围
    2. 通过将coeffintercept 捕获为默认参数,将它们烘焙到lambda 的定义中:my_dict[i] = lambda x, coeff=coeff, intercept=intercept: coeff * x + intercept
    3. 将单独的 coeffintercept 值保存在 my_dict(或其他容器)中,然后在需要时将它们取出。

    【讨论】:

    • 谢谢!我不知道这个怪癖。
    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2014-09-12
    • 2017-07-27
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多