一、线性回归
问题概述
线性回归要解决的问题是给一堆样本点X(m, n)和每个点对应的函数值Y(m,1)要求找到一个线性函数 y=w1∗x1+w2∗x2+...+wn∗xn+b y = w 1 ∗ x 1 + w 2 ∗ x 2 + . . . + w n ∗ x n + b 使得其对原样本点的拟合度最好。拟合度最好就是每个样本点到这条直线的距离和最小,转化成数学语言就是使得误差函数 J(y^,y)=1/2∗(y^−y)2=1/2∗(wTx+b−y)2 J ( y ^ , y ) = 1 / 2 ∗ ( y ^ − y ) 2 = 1 / 2 ∗ ( w T x + b − y ) 2 最小,选平方函数消除误差的正负情况。
公式推导及实现
令误差函数对两参数的倒数分别为0,即可得出其表达式。但最后 θ(w,b)=(XTX)−1XTY θ ( w , b ) = ( X T X ) − 1 X T Y 高维矩阵的逆不易算,而且存在矩阵不可逆的情况。实现上往往采用梯度下降法: θ=θ−α∂J(w,b)∂θ θ = θ − α ∂ J ( w , b ) ∂ θ ,下面做个简单的示例。首先统一样本及标签矩阵的格式如下:
样本特征矩阵是 n×m 的,其中 n 是每个样本的特征数,m是样本个数。标签y为 1×m 的行向量。按此格式生成100个样本点:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def generate_data():
x = np.linspace(-2, 2, 100).reshape(100, 1)
y = -3 * x + 7 + (np.random.rand(100, 1) - 0.5)
return x, y
x, y = generate_data()
x = x.T
y = y.T
print(x.shape,)
print(y.shape,)
((1, 100),)
((1, 100),)
拟合函数为 y=−3∗x+7 y = − 3 ∗ x + 7 ,每个样本点加一个噪声。作图如下:
plt.figure(figsize=(12, 8))
plt.scatter(x.T, y.T, c= 'y')
plt.plot(x.T, (-3 * x + 7).T, c='b', linewidth=2)
plt.show()
接下来就用梯度下降法得到使得误差函数最小的 w,b w , b 。参数更新公式推导: J(y^,y)=1