改写Python核预测代码为列表推导式以支持任意数量数据点
Part3 正确实现方案
你之前的两种写法错误原因如下:
ynew = sum(w[i] * y[i]):缺少遍历索引的逻辑,sum仅接收了单个元素的计算值,无法完成所有对应位置的累加ynew = (sum(val * y[i]) for val in w):把sum放在了生成器表达式内部,最终返回的是生成器对象而非累加后的数值结果
推荐实现(Python 风格写法)
使用zip()函数同时遍历权重列表w和标签列表y,配对对应位置的元素相乘后求和:
ynew = sum(weight * label for weight, label in zip(w, y))
如果你习惯用索引遍历,也可以写成以下形式:
ynew = sum(w[i] * y[i] for i in range(len(w)))
完整通用版函数参考
以下是适配任意长度数据集的完整代码,你可以直接参考使用:
import math def foobar(data, x_new, h): x = data[0] y = data[1] # Part1:计算所有核函数值 k = [math.e**(-(x_new - val)**2 / (2 * h)) for val in x] # Part2:通用权重计算(你说已解决,此处补全供参考) sum_k = sum(k) w = [kh / sum_k for kh in k] # Part3:加权求和得到预测结果 ynew = sum(weight * label for weight, label in zip(w, y)) return ynew
该版本无需修改即可支持任意长度的输入数据集,仅需保证输入数据中特征列表x和标签列表y的长度一致即可。
内容的提问来源于stack exchange,提问作者ashnotallyson
相关产品推荐
相关产品推荐

