You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中TypeError: 'function' object is not iterable错误排查——基于最小二乘法的多项式拟合RMSE计算问题

问题分析与修复方案

首先,咱们直接定位错误根源:你看到的TypeError: 'function' object is not iterable,是因为你把一个lambda函数传给了polynomial_fit的theta参数,但这个函数的定义明确要求theta是一个可迭代的权重序列(比如列表、numpy数组)——毕竟它要遍历theta里的每个权重,和x的对应幂次相乘求和。

你的循环逻辑是想计算0到9阶多项式的RMSE,但当前传的lambda i: 'theta' + str(i)只是生成字符串的函数,完全不符合polynomial_fit对参数的要求,自然会报错。

修复步骤

假设你已经通过最小二乘法拟合得到了theta0到theta9这些浮点型权重变量,咱们按照以下方式修改代码:

1. 先把所有权重整理到一个列表(推荐做法)

先把分散的theta0到theta9整合到一个列表里,方便后续按多项式阶数截取:

# 把拟合好的所有theta变量放进一个列表
all_thetas = [theta0, theta1, theta2, theta3, theta4, theta5, theta6, theta7, theta8, theta9]

2. 修改循环逻辑,传入对应阶数的权重序列

循环里的m代表多项式的阶数(0到9),每个阶数需要m+1个权重(比如0阶是常数项,只需要theta0;9阶需要全部10个权重):

rmse = []
for m in range(0, 10):
    # 截取对应阶数需要的权重:前m+1个元素
    current_weights = all_thetas[:m+1]
    # 调用polynomial_fit得到拟合值
    y_pred = polynomial_fit(current_weights, xtr)
    # 计算RMSE并加入列表
    current_rmse = np.sqrt(np.mean((y_pred - ytr)**2))
    rmse.append(current_rmse)

为什么这样能解决问题?

  • current_weights是一个可迭代的列表,完全符合polynomial_fit对theta参数的要求,函数可以正常遍历它来计算多项式值。
  • 循环逻辑和你的需求完全匹配:每一次循环对应一个阶数的多项式,计算其RMSE并存入rmse列表。

备选方案(不推荐,但可临时使用)

如果你不想提前整理权重列表,也可以直接通过变量名动态获取(但这种方式不够安全,不推荐在正式代码中使用):

rmse = []
for m in range(0, 10):
    # 动态获取theta0到thetam的变量
    current_weights = [globals()[f'theta{n}'] for n in range(m+1)]
    y_pred = polynomial_fit(current_weights, xtr)
    current_rmse = np.sqrt(np.mean((y_pred - ytr)**2))
    rmse.append(current_rmse)

内容的提问来源于stack exchange,提问作者PRANJAL SINGH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:42:27