TypeError: unsupported operand type(s) for -: 'str' and 'float' when trying to loop over a function in Python

TypeError: unsupported operand type(s) for -: 'str' and 'float' when trying to loop over a function in Python

我正在尝试让核估计器(如 The Article 中给出的)预测给定向量的值,而不是单个值。这是代码:

from scipy.stats import norm
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
import math

class GKR:
    def __init__(self, x, y, b):
        self.x = x
        self.y = y
        self.b = b

    '''Implement the Gaussian Kernel'''
    def gaussian_kernel(self, z):
        return (1/math.sqrt(2*math.pi))*math.exp(-0.5*z**2)

    '''Calculate weights and return prediction'''
    def predict(self, X):
        kernels = [self.gaussian_kernel((xi-X)/self.b) for xi in self.x]
        weights = [len(self.x) * (kernel/np.sum(kernels)) for kernel in kernels]
        return np.dot(weights, self.y)/len(self.x)


llke = GKR(x, y, 0.2)

y_hat=pd.DataFrame(index=range(x.shape[0]))
for row in range(x.shape[0]):
    y_hat.iloc[row] = llke.predict(float(x.iloc[row]))
y_hat

但我收到错误:TypeError: unsupported operand type(s) for -: 'str' and 'float'。据我了解,问题出在 self.gaussian_kernel((xi-X) 中,它出于某种原因将 xi 视为字符串。我试图将它包装在 float() 函数中,但它没有帮助。可能是什么问题呢?或者,请随意建议将函数预测应用于向量而不是单个值的替代方法。

问题是 xy 以错误的格式给出(作为列表的列表,而不是列表),这就是解释器可以正确处理它的原因。