机器学习笔记 -- 线性回归

1、定义

线性回归是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或一个平面或者更高维度的超平面,使得预测值与真实值的误差最小化。

2、代价函数

代价函数度量全部样本集的平均误差。越小则拟合效果越好。

J ( θ 1 , θ 2 , . . . , θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_1,\theta_2,...,\theta_n)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 J(θ1,θ2,...,θn)=2m1i=1m(hθ(x(i))y(i))2

3、梯度下降

3.1 定义

在一元函数中叫做求导,在多元函数中就叫做求梯度。梯度下降是一个最优化算法,通俗的来讲也就是沿着梯度下降的方向来求出一个函数的极小值。

采用梯度下降,不断迭代,沿着梯度下降的方向来移动,求出极小值。

3.2 分类

  • 批量梯度下降(Batch Gradient Descent,BGD): 梯度下降的每一步中,都用到了所有的训练样本

  • 随机梯度下降(Stochastic Gradient Descent,SGD): 梯度下降的每一步中,用到一个样本,在每一次计算之后便更新参数 ,而不需要首先将所有的训练集求和

  • 小批量梯度下降(Mini-Batch Gradient Descent,MBGD):
    梯度下降的每一步中,用到了一定批量的训练样本

3.3 批量梯度下降

θ j : = θ j − α ∂ ∂ θ j J ( θ 1 , θ 2 , . . . θ n ) = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j:=\theta_j-\alpha\frac{\partial}{\partial \theta_{j}} J(\theta_1,\theta_2,...\theta_n)=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} θj:=θjαθjJ(θ1,θ2,...θn)=θjαm1i=1m(hθ(x(i))y(i))xj(i)

——学习率 α \alpha α: 学习率过大,则代价函数震荡,可能无法收敛;学习率太小,则收敛过慢,需要很大的计算量。

3.4 正规方程求解 θ \theta θ

根据多元变量函数求最值的方法可知,当

∂ ∂ θ j J ( θ j ) = 0 \frac{\partial}{\partial \theta_{j}} J(\theta_j)=0 θjJ(θj)=0
时,代价函数 J ( θ j ) J(\theta_j) J(θj)取得最小值。
假设我们的训练集特征矩阵为 X(包含了 x 0 = 1 x_0=1 x0=1),训练集结果为向量 y,则

θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)1XTy
推导过程参考:https://blog.csdn.net/chenlin41204050/article/details/78220280

4、多项式回归

可用线性回归的方法来拟合非常复杂的函数,甚至是非线性函数。

h ( θ ) = θ 0 + θ 1 x + θ 2 x 2 + . . . + θ n x n h(\theta)=\theta_0+\theta_1x+\theta_2x^2+...+\theta_nx^n h(θ)=θ0+θ1x+θ2x2+...+θnxn
拟合时,可看成多变量线性回归,即

h ( θ ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h(\theta)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n h(θ)=θ0+θ1x1+θ2x2+...+θnxn
以矩阵形式表示

p r e d i c t i o n ( Y ) = [ 1 x 1 ( 1 ) x 2 ( 1 ) ⋯ x n ( 1 ) 1 x 1 ( 2 ) x 2 ( 2 ) ⋯ x n ( 2 ) ⋮ ⋮ 1 x 1 ( m ) x 2 ( m ) ⋯ x n ( m ) ] [ θ 0 θ 1 ⋮ θ n ] prediction(Y)= \begin{bmatrix} {1}&{x^{(1)}_1}&{x^{(1)}_2}&{\cdots}&{x^{(1)}_n}\\ {1}&{x^{(2)}_1}&{x^{(2)}_2}&{\cdots}&{x^{(2)}_n}\\ {\vdots}&{\vdots}\\ {1}&{x^{(m)}_1}&{x^{(m)}_2}&{\cdots}&{x^{(m)}_n}\\ \end{bmatrix} \begin{bmatrix} {\theta_0}\\ {\theta_1}\\ {\vdots}\\ {\theta_n}\\ \end{bmatrix} prediction(Y)=111x1(1)x1(2)x1(m)x2(1)x2(2)x2(m)xn(1)xn(2)xn(m)θ0θ1θn

5、数据归一化/标准化

(1) 为什么要归一化/标准化

  • 提升模型精度: 不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

  • 加速模型收敛:
    最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

(2) 归一化/标准化方法

  • 归一化 (最大-最小规范化): 将数据映射到[0,1]区间。

x ∗ = x − x m i n x m a x − x m i n x^*=\frac{x-x_{min}}{x_{max}-x_{min}} x=xmaxxminxxmin

  • Z-Score标准化: 处理后的数据均值为0,方差为1,即标准正态分布。

x ∗ = x − μ σ x^*=\frac{x-\mu}{\sigma} x=σxμ

欢迎关注公众号哦~~

6、课后习题

6.1 单变量线性回归

import matplotlib.pyplot as plt
import numpy as np

#读取数据文件
fr = open("ex1data1.txt",'r')
lines = fr.readlines()

datasets_X = []
datasets_Y = []

for line in lines:
    item = line.strip().split(',')
    datasets_X.append(float(item[0]))
    datasets_Y.append(float(item[1]))

datasets_X = np.array(datasets_X).reshape(-1,1)
datasets_Y = np.array(datasets_Y).reshape(-1,1)

#定义代价函数
def costFunction(X,Y,theta):
    X = np.insert(X,0,1,axis=1)       #第一列增加1,便于矩阵计算
    m = X.shape[0]
    sqrError = (np.dot(X,theta) - Y)**2         #np.dot是矩阵乘法,*是对应元素相乘
    J = np.sum(sqrError)/(2*m)
    return J

#定义梯度下降函数
def gradient(X,Y,theta,alpha):
    X = np.insert(X,0,1,axis=1)       #第一列增加1,便于矩阵计算
    m = X.shape[0]
    for i in range(1000):     #迭代1000次
        Error = np.dot(X,theta)-Y
        theta = theta-(alpha/m) * (np.dot(X.T,Error))         #注意此处矩阵计算
    return theta


#线性回归计算
theta = np.zeros((2,1))     #参数初始化
alpha = 0.01
theta = gradient(datasets_X,datasets_Y,theta,alpha)
J = costFunction(datasets_X,datasets_Y,theta)
print('theta=',theta)
print('J=',J)

#绘图
X_max = max(datasets_X)
X_min = min(datasets_X)
X = np.linspace(X_min,X_max,100).reshape(-1,1)     #以X最大值和最小值为范围,画图

plt.scatter(datasets_X,datasets_Y,label='Traning Data')   #散点图

Prediction_Y = theta[0] + theta[1]*X
plt.plot(X,Prediction_Y,'r',label = 'Prediction')   #回归线

plt.legend(loc=2)    #点和线的图例,2表示在左上角
plt.title('Predicted Profit vs. Population Size')
plt.xlabel("Population")
plt.ylabel("Profit")
plt.show()


#*****************************************************************
# 正规方程求解
def nomalEqn(X,Y):
    X = np.insert(X,0,1,axis=1)       #第一列增加1,便于矩阵计算
    theta = np.linalg.inv(X.T@X)@X.T@Y   #@相当于dot()
    return theta

theta2 = nomalEqn(datasets_X,datasets_Y)
print("theta2=",theta2)

6.2 多变量线性回归

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#读取数据文件
path = "ex1data2.txt"
data = pd.read_csv(path,sep=",",names=["Sizes","Bedroom","Price"])

#标准化
data_std = (data-data.mean())/data.std()        #默认沿列计算

datasets_X = np.array(data_std.iloc[:, :-1]).reshape(-1,2)
datasets_Y= np.array(data_std.iloc[:, -1]).reshape(-1,1)

#定义代价函数
def costFunction(X,Y,theta):
    X = np.insert(X,0,1,axis=1)       #第一列增加1,便于矩阵计算
    m = X.shape[0]
    sqrError = (np.dot(X,theta) - Y)**2         #np.dot是矩阵乘法,*是对应元素相乘
    J = np.sum(sqrError)/(2*m)
    return J

# 定义梯度下降函数
def gradient(X,Y,theta,alpha):
    X = np.insert(X,0,1,axis=1)       # 第一列增加1,便于矩阵计算
    m = X.shape[0]
    for i in range(1000):     #迭代1000次
        Error = np.dot(X,theta)-Y
        theta = theta-(alpha/m) * (np.dot(X.T,Error))         # 注意此处矩阵计算
    return theta


# 线性回归计算
theta = np.zeros((3,1))   # 参数初始化
alpha = 0.01
theta = gradient(datasets_X,datasets_Y,theta,alpha)
J = costFunction(datasets_X,datasets_Y,theta)
print('theta=',theta)
print('J=',J)


# 画散点图
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.scatter3D(data["Sizes"],data["Bedroom"],data["Price"])
ax.set_xlabel('Sizes',rotation=-15)
ax.set_ylabel('Bedroom',rotation=50)
ax.set_zlabel('Price',rotation=90)
plt.show()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值