文章目录

  • 原理以及公式
    • 【1】一元线性回归问题
    • 【2】多元线性回归问题
    • 【3】学习率
    • 【4】流程分析(一元线性回归)
    • 【5】流程分析(多元线性回归)
      • 归一化原理以及每种归一化适用的场合
  • 一元线性回归代码以及可视化结果
  • 多元线性回归代码以及可视化结果
  • 总结


原理以及公式

【1】一元线性回归问题

原函数是一元函数(关于x),它的损失函数是二元函数(关于w和b)

这里介绍两种损失函数:平方损失函数和均方差损失函数
在这里插入图片描述

【2】多元线性回归问题

X和W都是m+1维的向量,损失函数是高维空间中的凸函数

【3】学习率

学习率属于超参数(超参数:在开始学习之前设置,不是通过训练得到的)
可以选择在迭代次数增加时减少学习率大小.
下图是学习率正常或较小、稍大、过大的迭代图。

【4】流程分析(一元线性回归)

过程分析:

1、加载样本数据x,y
2、设置超参数学习率,迭代次数
3、设置模型参数初值w0, b0
4、训练模型w, b
5、结果可视化

														流程图:

在这里插入图片描述

【5】流程分析(多元线性回归)

归一化原理以及每种归一化适用的场合

在这里插入图片描述

线性归一化:适用于样本分布均匀且集中的情况,如果最大值(或者最小值)不稳定,和绝大数样本数据相差较大,使用这种方法得到的结果也不稳定.为了抑制这个问题,在实际问题中可以用经验值来代替最大值和最小值
标准差归一化适用于样本近似正态分布,或者最大最小值未知的情况,有时当最大最小值处于孤立点时也可以使用标准差归一化
非线性映射归一化,通常用于数据分化较大的情况(有的很大有的很小)
总结:样本属性归一化需要根据属性样本分布规律定制

过程分析:

加载样本数据area,room,price
数据处理归一化,X,Y
设置超参数学习率,迭代次数
设置模型参数初值W0(w0,w1,w2)
训练模型W
结果可视化

在这里插入图片描述

一元线性回归代码以及可视化结果

#解析法实现一元线性回归 
# #Realization of one variable linear regression by analytic method
#导入库
import numpy as np
import matplotlib.pyplot as plt 
#设置字体
plt.rcParams['font.sans-serif'] =['SimHei']
#加载样本数据
x=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])
#设置超参数,学习率
learn_rate=0.00001
#迭代次数
iter=100
#每10次迭代显示一下效果
display_step=10
#设置模型参数初值
np.random.seed(612)
w=np.random.randn()
b=np.random.randn()
#训练模型
#存放每次迭代的损失值
mse=[]
for i in range(0,iter+1):
    #求偏导
    dL_dw=np.mean(x*(w*x+b-y))
    dL_db=np.mean(w*x+b-y)
    #更新模型参数
    w=w-learn_rate*dL_dw
    b=b-learn_rate*dL_db
    #得到估计值
    pred=w*x+b
    #计算损失(均方误差)
    Loss=np.mean(np.square(y-pred))/2
    mse.append(Loss)
    #显示模型
    #plt.plot(x,pred)
    if i%display_step==0:
        print("i:%i,Loss:%f,w:%f,b:%f"%(i,mse[i],w,b))
#模型和数据可视化
plt.figure(figsize=(20,4))
plt.subplot(1,3,1)
#绘制散点图
#张量和数组都可以作为散点函数的输入提供点坐标
plt.scatter(x,y,color="red",label="销售记录")
plt.scatter(x,pred,color="blue",label="梯度下降法")
plt.plot(x,pred,color="blue")

#设置坐标轴的标签文字和字号
plt.xlabel("面积(平方米)",fontsize=14)
plt.xlabel("价格(万元)",fontsize=14)

#在左上方显示图例
plt.legend(loc="upper left")

#损失变化可视化
plt.subplot(1,3,2)
plt.plot(mse)
plt.xlabel("迭代次数",fontsize=14)
plt.ylabel("损失值",fontsize=14)
#估计值与标签值比较可视化
plt.subplot(1,3,3)
plt.plot(y,color="red",marker="o",label="销售记录")
plt.plot(pred,color="blue",marker="o",label="梯度下降法")
plt.legend()
plt.xlabel("sample",fontsize=14)
plt.ylabel("price",fontsize=14)
#显示整个绘图
plt.show()

在这里插入图片描述

多元线性回归代码以及可视化结果

#解析法实现多元线性回归
#Realization of multiple linear regression by analytic method
#导入库与模块
import numpy as np
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D
#=======================【1】加载样本数据===============================================
area=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
room=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2])
price=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])
num=len(area) #样本数量
#=======================【2】数据处理===============================================
x0=np.ones(num)
#归一化处理,这里使用线性归一化
x1=(area-area.min())/(area.max()-area.min())
x2=(room-room.min())/(room.max()-room.min())
#堆叠属性数组,构造属性矩阵
#从(16,)到(16,3),因为新出现的轴是第二个轴所以axis为1
X=np.stack((x0,x1,x2),axis=1)
print(X)
#得到形状为一列的数组
Y=price.reshape(-1,1)
print(Y)
#=======================【3】设置超参数===============================================
learn_rate=0.001
#迭代次数
iter=500
#每10次迭代显示一下效果
display_step=50
#=======================【4】设置模型参数初始值===============================================
np.random.seed(612)
W=np.random.randn(3,1)
#=======================【4】训练模型=============================================
mse=[]
for i in range(0,iter+1):
    #求偏导
    dL_dW=np.matmul(np.transpose(X),np.matmul(X,W)-Y)   #XT(XW-Y)
    #更新模型参数
    W=W-learn_rate*dL_dW
    #得到估计值
    PRED=np.matmul(X,W)
    #计算损失(均方误差)
    Loss=np.mean(np.square(Y-PRED))/2
    mse.append(Loss)
    #显示模型
    #plt.plot(x,pred)
    if i % display_step==0:
        print("i:%i,Loss:%f"%(i,mse[i]))
#=======================【5】结果可视化============================================
plt.rcParams['font.sans-serif'] =['SimHei']
plt.figure(figsize=(12,4))
#损失变化可视化
plt.subplot(1,2,1)
plt.plot(mse)
plt.xlabel("迭代次数",fontsize=14)
plt.ylabel("损失值",fontsize=14)
#估计值与标签值比较可视化
plt.subplot(1,2,2)
PRED=PRED.reshape(-1)
plt.plot(price,color="red",marker="o",label="销售记录")
plt.plot(PRED,color="blue",marker="o",label="预测房价")
plt.xlabel("sample",fontsize=14)
plt.ylabel("price",fontsize=14)
plt.legend()
plt.show()

在这里插入图片描述

总结

注意点:选择归一化方式


喜欢的话点个赞和关注呗!