简单线性回归 ——最小二乘法

简单线性回归 ——SimpleLinearRegression



一、讨论一元二次方程的线性回归(y=ax+b)


实例:房价预测问题。其中y为我们的房价,x为房子面积,我们假设房子面积与房价存在这样的一层关系(y=ax+b)。so do this,我们来推导一下吧。

二、推导过程 (需高数、线代基本知识)


- 我们根据预测方程,可以得出每一个样本数据存在: y ^ ( i ) = a x ( i ) + b ,其中 y ^ ( i ) 表示为第i个样本( x ( i ) )的预测值。

  • 每一个房价与我们预测的值直接有一个差值,我们使用 ( y ( i ) y ^ ( i ) ) 2 来表示这个差值。

  • 当我们考虑到所有样本时,我们的损失函数这样表达:

    i = 1 n ( y ( i ) a x i b ) 2

  • 目标:找到一组a和b的参数,使得我们的损失函数的值是最小的。对于线性回归,这种损失函数求得参数的方法,我们叫做最小二乘法。

  • 提到最小值我们很容易想到求导,在这里我们需要对损失函数分别对a和w求偏导数,求出来的a和b的表达式,再令他们分别求0,得出a和b。

对b推导

δ J ( a , b ) δ b = i = 1 m 2 ( y ( 2 ) a x ( i ) b ) ( 1 ) = 0 i = 1 m ( y ( 2 ) a x ( i ) b ) = 0 i = 1 m y ( i ) a i = 1 m x ( i ) i = 1 m b = 0 m y ¯ a m x ¯ m b = 0 b = y ¯ a x ¯

对a推导
δ J ( a , b ) δ a = i = 1 m 2 ( y ( i ) a x ( i ) b ) ( x ( i ) ) = 0 b = y ¯ a x ¯ i = 1 m ( y ( i ) a x ( i ) y ¯ + a x ¯ ) x ( i ) = 0 i = 1 m ( y ( i ) x ( i ) a ( x ( i ) ) 2 y ¯ x ( i ) + a x ¯ x ( i ) ) = 0 i = 1 m ( y ( i ) x ( i ) y ¯ x ( i ) ) a i = 1 m ( ( x ( i ) ) 2 x ¯ x ( i ) ) = 0 a = i = 1 m ( y ( i ) x ( i ) y ¯ x ( i ) ) i = 1 m ( ( x ( i ) ) 2 x ¯ x ( i ) )

  • 推导到这里,其实我们已经成功了。但是考虑到这样计算加大了我们程序的运行效率,所以接下来我们使用向量化推导式子加速程序运行。
    : i = 1 m y ¯ x ( i ) = y ¯ i = 1 m x ( i ) = m x ¯ y ¯ = x ¯ i = 1 m y ( i ) = i = 1 m x ¯ y ( i ) i = 1 m x ¯ y ( i ) = i = 1 m x ¯ y ¯ i = 1 m x ¯ x ( i ) = i = 1 m ( x ¯ ) 2 s o = i = 1 m ( x ( i ) y ( i ) x ( i ) y ¯ x ¯ y ( i ) + x ¯ y ¯ ) i = 1 m ( ( x ( i ) ) 2 x ¯ x ( i ) x ¯ x ( i ) + ( x ¯ ) 2 ) a = i = 1 m ( x ( i ) x ¯ ) ( y ( i ) y ¯ ) i = 1 m ( x ( i ) x ¯ ) 2   i = 1 m w ( i ) v ( i ) = w ( i ) . v ( i )

三、关于线性回归算法的评测函数


- (1):Mean Squared Error 均方误差(MSE) ——根据误差判别

  • (2):Root Mean Squared Error 均方根误差(RMSE) ——消除量纲,便于解释误差

  • (3)Mean Absolute Error 平均绝对误差(MAE)

  • (4)Goodness of Fit R方检验 ——最可比性

四、使用python实现

import numpy as np
import matplotlib.pyplot as plt

x=np.array([1,2,3,4,5,7,8,9,10,12])
y=np.array([1,3,2,3,5,5,6,8,9,10])

plt.scatter(x,y)
plt.show()

x_mean = np.mean(x)
y_mean = np.mean(y)

'''

这一块代码使用标准版解出来的a和b

num = 0.0
d = 0.0
for x_i,y_i in zip(x,y):
    num += (x_i - x_mean) * (y_i - y_mean)
    d += (x_i - x_mean) ** 2

a = num / d
b = y_mean - a * x_mean

print(a)
print(b)

'''

#这一块代码使用向量化计算出来
num = (x - x_mean).dot(y - y_mean)
d = (x - x_mean).dot(x - x_mean)
a = num / d
b = y_mean - a * x_mean
print(a)
print(b)


#绘图展示
y_hat = a * x + b
plt.scatter(x, y)
plt.plot(x,y_hat,color='r')
plt.show()

五、可视化展示


最后我们得到的红线所代表的方程就是我们根据最小二乘法拟合出来的函数。
可视化

猜你喜欢

转载自blog.csdn.net/GoLee_Taoist/article/details/81461141
今日推荐