今日手写高斯朴素贝叶斯算法,执行概率密度函数方法出现:TypeError: got multiple values for argument 'x',这个报错是说x传入多个值,实际不是该问题导致,因为报错提示给误导了很长的时间去排查参数问题。
代码如下:一个MyGaussianNB类下,自定义高斯分布的方法和预测方法
class MyGaussianNB(object):
def _gaussian_distribution(x, mu, sigma):
return (1 / (np.sqrt(2 * np.pi) * sigma)) * np.exp(-((x - mu) ** 2) / (2 * sigma ** 2))
def predict(self, X):
prob *= self._gaussian_distribution(x = x, mu = mu, sigma = sigma
根据代码和我们截图标注的位置可以看到,调用_gaussian_distribution方法时我们传递了3个参数,那为什么还一直在报错了
解决方案:
def _gaussian_distribution(self, x, mu, sigma):在方法中加一个 self参数
解析:_gaussian_distribution是我们定义的一个成员方法(实例方法),成员方法(实例方法)而的第一个参数必须是self,它代表类的实例本身。
self._gaussian_distribution(x = x[features_idx], mu = self.y_params[j]['mu'][features_idx], sigma = self.y_params[j]['sigma'][features_idx]),通过这种方法调用我们是调用成员方法,但是之前_gaussian_distribution方法缺少参数self,所以该方法它是属于类方法,定义在类上,如果要访问类方法需要使用类.方法()。