一、问题描述
假设平面上3个点: (-1.0,-1.2) , (0.0,1.0), (1.0,2.8)。
(1)请写出相应的正规方程。
(2)并通过求解正规方程来计算这3个点的最佳直线拟合。
二、实验目的
画出原始数据的散点图;
画出拟合的直线。
三、实验内容
1、首先对数据进行特征处理
2、然后求出正规方程的最优解
3、通过最优解预测数据
四、实验结果及分析
五、完整代码
机器学习GitHub:https://github.com/wanglei18/machine_learning
linear_regression.py
import numpy as np
class LinearRegression:
def fit(self, X, y):
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y) #最优解
return
def predict(self, X): #预测
return X.dot(self.w)
def mean_squared_error(y_true, y_pred): #h的均方误差
return np.average((y_true - y_pred)**2, axis=0) #axis = 0 按列计算
def r2_score(y_true, y_pred): #R^2的决定系数
numerator = (y_true - y_pred)**2
denominator = (y_true - np.average(y_true, axis=0))**2
return 1- numerator.sum(axis=0) / denominator.sum(axis=0) #按列计算
import numpy as np
import matplotlib.pyplot as plt
import machine_learning.linear_regression.lib.linear_regression as lib
def mean_squared_error(y_true, y_pred): # h的均方误差
return np.average((y_true - y_pred) ** 2, axis=0) # axis = 0 按列计算
def r2_score(y_true, y_pred): # R^2的决定系数
numerator = (y_true - y_pred) ** 2
denominator = (y_true - np.average(y_true, axis=0)) ** 2
return 1 - numerator.sum(axis=0) / denominator.sum(axis=0) # 按列计算
def process_features(X): #特征处理
m,n = X.shape
X = np.c_[np.ones((m,1)), X] #按行连接,(1,x)
return X
plt.figure(1)
x = np.mat([[-1.0],[0.0],[1.0]])
y = np.mat([[-1.2],[1.0],[2.8]])
plt.plot(x[:, 0], y[:, 0],"bs", ms=3)
x_train = process_features(x)
model = lib.LinearRegression()
model.fit(x_train, y)
print(model.w)
y_pred = model.predict(x_train)
plt.plot(x,y_pred)
plt.show()