least square method LSM

liner model

preface

  1. 基本形式--\(f(x)=w^Tx+b\)
  2. 线性回归--Order序,均方差square loss,最小二乘法了least square method,multivariate liner regression,
    广义线性模型->log-liner regression,\(y=g^{-1}(w^Tx+b)\)
  3. 对数几率回归

线性拟合

math method

\[\begin{align*} (w^*,b^*)=arg min_{(w,b)}\sum_{i=1}^m(f(x_i)-y_i)^2 =argmin_{(w,b)}\sum_{i=1}^m(y_i-wx_i-b)^2 \end{align*} \]

有上式得到均方误差(square loss),求解\(w , b\) 使均方误差最小的过程,称为liner regression在这个过程中采用求导。

\[\frac{\varphi E_{(w,b)}}{\varphi w}=2(w\sum_{i=1}^mx_i^2-\sum_{i=1}^m(y_i-b)x_i) \]

\[\frac{\varphi E_{(w,b)}}{\varphi w}=2(mb-\sum_{i=1}^m(y_i-wx_i)) \]

然后使得(1)(2)两式子为零得到closed-form解

\[w = \frac{\sum_{i=1}^my_i(x_i-\bar x)}{\sum _{i=1}^mx_i^2-\frac 1m (\sum_{i=1}^mx_i)^2} \]

\[b=\frac1m \sum_{i=1}^m(y_i-wx_i) \]

使用最小二乘法拟合曲线

def real_func(x):
    return np.sin(2*np.pi*x)#正玄函数
#目标函数
# 多项式
def fit_func(p, x):
    f = np.poly1d(p)#p应该作为一个列表
    return f(x)

# 残差
def residuals_func(p, x, y):
    ret = fit_func(p, x) - y
    return ret

x = np.linspace(0, 1, 10)#start 0,stop 1 num 10
x_points = np.linspace(0, 1, 1000)#有1000个点进行拟合
# 加上正态分布噪音的目标函数的值
y_ = real_func(x)#正弦函数
y = [np.random.normal(0, 0.1) + y1 for y1 in y_]#normal distribution正态分布噪音

上面初始化了函数,点,噪音

def fitting(M=0):
    """
    M    为 多项式的次数
    """
    # 随机初始化多项式参数
    p_init = np.random.rand(M + 1)#对这个随机化列表,比如M=2,生成[1,2,2.1]
    # 最小二乘法
    p_lsq = leastsq(residuals_func, p_init, args=(x, y))#误差函数,矩阵参数,数据点
    print('Fitting Parameters:', p_lsq[0])#输出拟合残差,得到返回值函数的参数

    # 可视化
    plt.plot(x_points, real_func(x_points), label='real')
    plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
    plt.plot(x, y, 'bo', label='noise')#'bo'表示blue的点,eg'ro',红色的点
    plt.legend()#坐标刻度
    return p_lsq
posted @ 2020-07-05 15:01  做个认真生活的人  阅读(169)  评论(0)    收藏  举报