Python 多变量线性回归未按预期工作
当我将这段代码用于单变量线性回归时,θ的计算是正确的,但在多变量上,它给出了θ的奇怪输出 我正在尝试转换我的倍频程代码,这是我在学习Andrew Ng课程时编写的 这是主调用文件:Python 多变量线性回归未按预期工作,python,machine-learning,linear-regression,Python,Machine Learning,Linear Regression,当我将这段代码用于单变量线性回归时,θ的计算是正确的,但在多变量上,它给出了θ的奇怪输出 我正在尝试转换我的倍频程代码,这是我在学习Andrew Ng课程时编写的 这是主调用文件: m = data.shape[0] a = np.array(data[0]) a.shape = (m,1) b = np.array(data[1]) b.shape = (m, 1) x = np.append(a, b, axis=1) y = np.array(data[2]) lr = LR.Lin
m = data.shape[0]
a = np.array(data[0])
a.shape = (m,1)
b = np.array(data[1])
b.shape = (m, 1)
x = np.append(a, b, axis=1)
y = np.array(data[2])
lr = LR.LinearRegression()
[X, mu, sigma] = lr.featureNormalize(x)
z = np.ones((m, 1), dtype=float)
X = np.append(z, X, axis=1)
alpha = 0.01
num_iters = 400
theta = np.zeros(shape=(3,1))
[theta, J_history] = lr.gradientDescent(X, y, theta, alpha, num_iters)
print(theta)
以下是课程内容:
class LinearRegression:
def featureNormalize(self, data):#this normalizes the features
data = np.array(data)
x_norm = data
mu = np.zeros(shape=(1, data.shape[1]))#creates mu vector filled with zeros
sigma = np.zeros(shape=(1, data.shape[1]))
for i in range(0, data.shape[1]):
mu[0, i] = np.mean(data[:, i])
sigma[0, i] = np.std(data[:, i])
for i in range(0, data.shape[1]):
x_norm[:, i] = np.subtract(x_norm[:, i], mu[0, i])
x_norm[:, i] = np.divide(x_norm[:, i], sigma[0, i])
return [x_norm, mu, sigma]
def gradientDescent(self, X, y, theta, alpha, num_iters):
m = y.shape[0]
J_history = np.zeros(shape=(num_iters, 1))
for i in range(0, num_iters):
predictions = X.dot(theta) # X is 47*3 theta is 3*1 predictions is 47*1
theta = np.subtract(theta , (alpha / m) * np.transpose((np.transpose(np.subtract(predictions ,y))).dot(X))) #1*97 into 97*3
J_history[i] = self.computeCost(X, y, theta)
return [theta, J_history]
def computeCost(self, X, y, theta):
warnings.filterwarnings('ignore')
m = X.shape[0]
J = 0
predictions = X.dot(theta)
sqrErrors = np.power(predictions - y, 2)
J = 1 / (2 * m) * np.sum(sqrErrors)
return J
我期望θ是3*1矩阵。根据Andrew的课程,我的倍频程实现是产生θ
334302.063993
100087.116006
3673.548451
但在python实现中,我得到了非常奇怪的输出:
[[384596.12996714 317274.97693463 354878.64955708 223121.53576488
519238.43603216 288423.05420641 302849.01557052 191383.45903309
203886.92061274 233219.70871976 230814.42009498 333720.57288972
317370.18827964 673115.35724932 249953.82390212 432682.6678475
288423.05420641 192249.97844569 480863.45534211 576076.72380674
243221.70859887 245241.34318985 233604.4010228 249953.82390212
551937.2817908 240336.51632605 446723.93690857 451051.7253178
456822.10986344 288423.05420641 336509.59208678 163398.05571747
302849.01557052 557707.6...................... this goes on for long
同样的代码在单变量数据集中工作得非常好。它在八度音阶上也很好,但我现在似乎错过了2个多小时。很高兴得到您的帮助。在gradientDescent中尝试以下for循环的第二行:
theta=theta-(alpha/m)*X.T.dot(X.dot(theta)-y)
此外,如果要添加一列“1”,则更容易这样做:
np.c_[np.ones((m,1)),data]
它对你有用吗?还是我应该更深入地研究它?@ericj我能弄明白。似乎是。点应该替换为@。正因为如此,dot制造了很多模棱两可的东西。