【问题标题】:did not find slope and intercept in multiple linear regression, nan value coming多元线性回归中没有找到斜率和截距,nan值来了
【发布时间】:2018-07-07 21:39:37
【问题描述】:

我从头开始实现多元线性回归,但我没有找到斜率和截距,梯度体面给了我 nan 值。

这是我的代码,我还提供了 ipython 笔记本文件。

https://drive.google.com/file/d/1NMUNL28czJsmoxfgeCMu3KLQUiBGiX1F/view?usp=sharing

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = np.array([[   1, 2104,    3],
           [   1, 1600,    3],
           [   1, 2400,    3],
           [   1, 1416,    2],
           [   1, 3000,    4],
           [   1, 1985,    4]])

y = np.array([399900, 329900, 369000, 232000, 539900, 299900])

def gradient_runner(x, y, altha, b, theta1, theta2):
    initial_m1 = 0
    initial_m2 = 0
    initial_b = 0
    N = len(x)

    for i in range(0, len(y)):
        x0 = x[i, 0]
        x1 = x[i, 1]
        x2 = x[i, 2]
        yi = y[i]

        h_theta = (theta1 * x1 + theta2 * x2 + b)

        initial_b += -(1/N) * x0 * (yi - h_theta) 

        initial_m1 += -(1/N) * x1 * (yi - h_theta) 

        initial_m2 += -(1/N) * x2 * (yi - h_theta)

    new_b = b - (altha * initial_b)
    new_m1 = theta1 - (altha * initial_m1)
    new_m2 = theta2 - (altha * initial_m2)
    return new_b, new_m1, new_m2

def fit(x, y, alpha, iteration, b, m1, m2):

    for i in range(0, iteration):

        b, m1, m2 = gradient_runner(x, y, alpha, b, m1, m2)
    return b, m1, m2

fit(x,y, 0.001, 1500, 0,0,0) 

【问题讨论】:

  • 您是否尝试过使用调试器单步执行代码以查看 NaN 值开始出现的位置?
  • 如果您需要更多帮助,我建议您在代码中包含玩具数据,以便人们可以复制/粘贴/运行它。
  • 请阅读理解minimal reproducible example。
  • 我添加了玩具数据集,请帮帮我!

标签: python numpy matplotlib machine-learning linear-regression


【解决方案1】:

这不是编程问题,而是您的功能问题。 Numpy can use different data types。在您的情况下,它使用 float64。可以查看最大的数,可以用这种数据格式表示:

>>>sys.float_info
>>>sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

不幸的是,您的迭代对于b, m1, m2 不收敛,至少对于提供的数据集不收敛。在第 83 次迭代中,值变得太大而无法表示为浮点数,它们显示为 inf 和 -inf 以表示无穷大。当它被输入到下一个迭代步骤时,Python 返回 NaN 表示“不是数字”。
尽管 Python 中有一些方法可以克服浮点数表示在精度方面的限制,但这不是您必须探索的策略。这里的问题是您的拟合函数不收敛。这是由于函数本身、您的实现还是选择的初始猜测,我无法决定。非收敛拟合行为的一个常见原因也是,数据集不代表拟合函数。

【讨论】:

    【解决方案2】:

    尝试缩放你的 x

    def scale(x):
        for j in range(x.shape[1]):
            mean_x = 0
            for i in range(len(x)):
                mean_x += x[i,j]
            mean_x = mean_x / len(x)
            sum_of_sq = 0
            for i in range(len(x)):
                sum_of_sq += (x[i,j] - mean_x)**2
            stdev = sum_of_sq / (x.shape[0] -1)
            for i in range(len(x)):
                x[i,j] = (x[i,j] - mean_x) / stdev
        return x        
    

    或者您可以使用预定义的标准缩放器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-23
      • 2014-02-15
      • 1970-01-01
      • 2015-09-09
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      相关资源
      最近更新 更多