【问题标题】:can't convert type 'ndarray' to numerator/denominator无法将类型“ndarray”转换为分子/分母
【发布时间】:2019-11-04 13:31:43
【问题描述】:

这是我为实现线性回归而制作的一个类

from statistics import mean

import numpy as np 

xs = np.array([1,2,3],dtype = float)

ys = np.array([2,5,6],dtype = float)

class Linear_Regression():        # Our own linear regression Model

  def __init__(self):
     print("The model is ready for use")


  def best_fit_slope_intercept(self,xs,ys):                    # for finding best fit slope(m) and intercept(c)
     self.m = ( ( mean(xs) * mean(ys) -mean(xs*ys)  ) / ( pow(mean(xs),2) - mean(pow(xs,2)) ) )   # For slope (m)
     self.c = mean(ys) - self.m * mean(xs)                                                             # For y-intercept(c)                        

  def fit(self,xs,ys):

     self.best_fit_slope_intercept(xs,ys) 
     self.regression_line = [((self.m)*x)+ (self.c) for x in xs]
     print("Model fitting completed")
     return self.regression_line                             # Returns the fitted values (ys_line) for each input (xs) 

  def squared_error(self,ys_orig, ys_line):                   # Calculates the mean squared error between y_orig and y_line
     return sum((ys_line-ys_orig)**2)                        # N.B.  ys_orig = ys , ys_line = self.regression_line


  def score(self,ys_orig,ys_line):
     y_mean_line = [mean(ys_orig) for y in ys_orig]
     sqr_err_reg = self.squared_error(ys_orig, ys_line)
     sqr_err_y_mean = self.squared_error(ys_orig, y_mean_line)
     return 1- (sqr_err_reg / sqr_err_y_mean )

  def predict(self,x_testing):
     s = self.m *(x_testing) + self.c
     return s 

regr = Linear_Regression()

regr.best_fit_slope_intercept(xs,ys)

执行此代码后,我收到此错误:

TypeError: can't convert type 'ndarray' to numerator/denominator

虽然如果我在类之外创建这些函数,代码运行良好。我真的无法解决问题!

【问题讨论】:

    标签: python machine-learning linear-regression


    【解决方案1】:

    我在您的代码中发现了一些错误,正确的类型是 float:

    xs = np.array([1,2,3],dtype = float)    
    
    ys = np.array([2,5,6],dtype = float)     
    

    你忘了把自己放在这里:

    self.c = mean(ys) - self.m * mean(xs)       
    

    【讨论】:

    • 我按照你说的做了修改,但是错误还是一样
    • 在函数fit的第二行有一个self.b,我觉得应该是self.c,为了让代码更容易调试,我做的一件事就是在init 方法与 None 以避免在另一个方法中创建它们
    【解决方案2】:

    @deepraj1729,在使用statistics.mean()之前先展平你的数据。

    例如:

    变化:

    self.c = mean(ys) - self.m * mean(xs)
    

    到:

    self.c = mean(ys.flatten()) - self.m * mean(xs.flatten())
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多