数学推导

image
线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数:
image-1665043033964
向量形式:
image-1665043060584
线性模型的几种推导:
image-1665043121570
image-1665043128118
image-1665043134347
线性回归的目标是使得线性函数与样本点的均方差最小化

image-1665043151398
image-1665043173610

为了使均方差最小化,可以对E_ω进行最小二乘参数估计
image-1665043205082
image-1665043216298
image-1665043223601
以下是推导过程上面求解的推导过程
image-1665043268286
image-1665043274519
image-1665043282918
image-1665043300860
image-1665043309492
按照标量的链式求导法则写出的结果中左边的向量与右边矩阵X无法直接乘积,因此需要对向量或矩阵转置。如果对向量转置,乘积后得到的是行向量,需要再次转置。所以可以对矩阵X转置,并将X的转置移动到向量的左边
image-1665043328510

代码实现

数据

首先我们准备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()

结果展示

image-1665046525788