单变量线性回归输出NaN

时间:2017-07-26 21:35:03

标签: python machine-learning linear-regression

我目前正在python上编写单变量线性回归的实现:

MappingRegistry

此代码在输入无穷大后将为theta输出NaN - 我无法弄清楚出了什么问题,但这肯定与我在渐变中更改theta有关下降功能。

我使用的数据是一个简单的线性回归对我上网的数据集 - 并且正确加载。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,当您执行X[:,1]data[:,1]时,您会获得形状对象(m,)。将形状对象(m,)与形状矩阵(m,1)相乘时,得到一个大小为(m,m)的矩阵

a = np.array([1,2,3])
b = np.array([[4],[5],[6]])
(a*b).shape #prints (3,3)

如果你这样做     Y = y.reshape((M,1)) 在您的if __name__块中以及您执行的gradient_descent函数内

X_1 = X[:,1].reshape((m,1))

应该解决问题。现在发生的事情是,当你做

((hypothesis(X, theta) - y) * X[:, 1])

你得到一个100乘100的矩阵,这不是你想要的。

我用于测试的完整代码是:

# implementation of univariate linear regression
import numpy as np


def cost_function(hypothesis, y, m):
  return (1 / (2 * m)) * ((hypothesis - y) ** 2).sum()


def hypothesis(X, theta):
  return X.dot(theta)


def gradient_descent(X, y, theta, m, alpha):
  X_1 = X[:,1]
  X_1 = X_1.reshape((m,1))
  for i in range(1500):
    temp1 = theta[0][0] - alpha * (1 / m) * (hypothesis(X, theta) - y).sum()
    temp2 = theta[1][0] - alpha * (1 / m) * ((hypothesis(X, theta) - y) * X_1).sum()
    theta[0][0] = temp1
    theta[1][0] = temp2

  return theta

if __name__ == '__main__':
  data= np.random.normal(size=(100,2))

  y = 30*data[:,0] + data[:, 1]
  m = y.size
  X = np.ones(shape=(m, 2))
  y = y.reshape((m,1))
  X[:, 1] = data[:, 0]
  theta = np.zeros(shape=(2, 1))
  alpha = 0.01

  print(gradient_descent(X, y, theta, m, alpha))