数学推导
线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数:
向量形式:
线性模型的几种推导:
线性回归的目标是使得线性函数与样本点的均方差最小化
为了使均方差最小化,可以对E_ω进行最小二乘参数估计
以下是推导过程上面求解的推导过程
按照标量的链式求导法则写出的结果中左边的向量与右边矩阵X无法直接乘积,因此需要对向量或矩阵转置。如果对向量转置,乘积后得到的是行向量,需要再次转置。所以可以对矩阵X转置,并将X的转置移动到向量的左边
代码实现
数据
首先我们准备x和y的随机数据,数据只有三列,第一列和第二列为x的数据,第三列为y的数据,同时y需要转置
def load_dataset(filename):
df = pd.read_csv(filename, sep='\s+', header=None)
x_mat = np.mat(df.iloc[:, 0: -1])
y_mat = np.mat(df.iloc[:, -1]).T
return x_mat, y_mat
求w的估计值
def line_regression(x_mat, y_mat):
xTx = x_mat.T*x_mat
if np.abs(np.linalg.det(xTx)) < 1e-8:
print("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (x_mat.T * y_mat)
return ws
绘图
def line_regression_test(data_file):
x_mat, y_mat = load_dataset(data_file)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x_mat[:, 0].flatten().A[0], y_mat[:, 0].flatten().A[0])
ws = line_regression(x_mat, y_mat)
x_copy = x_mat.copy()
x_copy.sort(1)
y_hat = x_copy * ws
ax.plot(x_copy[:, 0], y_hat, color='red')
plt.show()