least square method LSM
liner model
preface
- 基本形式--\(f(x)=w^Tx+b\)
- 线性回归--Order序,均方差square loss,最小二乘法了least square method,multivariate liner regression,
广义线性模型->log-liner regression,\(y=g^{-1}(w^Tx+b)\) - 对数几率回归
线性拟合
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

浙公网安备 33010602011771号