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
相关产品推荐
相关产品推荐

