目录
目录
梯度下降原理:
梯度下降法简单来说是寻找目标函数最小化的方法,从最快的路径是函数值减少最快,显然梯度的反方向是函数下降最快的方向。 一元函数梯度下降 例如:函数,起初在
处,然后沿着梯度的反方向走,才最快达到最低点。公式为:
,不断的迭代。
梯度下降的求解步骤:
1.设置初始位置
2.参数步长或者叫作学习率,最大迭代次数和阈值
。
3..求损失函数的偏导数或是导数。
4.根据公式求变量的新值。
5.比较新值与老值的差的绝对值与阈值的大小,小于阈值或者达到最大迭代次数就停止迭代。
如果是多与函数的梯度下降,与一元函数一样,就是函数对多个变量分别求解偏导,然后分别迭代。
例题:函数为
代码:
二元函数梯度下降:、例题函数为;Z=(x-10)**2+(y-20)**2
代码:
原函数图像: 梯度下降的轨迹:
一元线性回归:
一元线性回归就是利用数理统计中的回归分析,来确定两种变量间,相互依赖的定量关系的一种统计分析方法,但是这两个变量不是绝对的线性关系,一元线性回归就是要找到一条线去拟合真实的点集,使真实值与预测值的差达到最小 ,一元线性回归方程为, 目标就是求解这个方程。
构造损失函数:
( 其中
)
我们寻找的直线的预测值和真实值的差越小越好,是真实值,
是预测值,除以m是有m个数据,除以2是求导方便。
梯度下降求解a和b:
不断迭代,知道达到最大迭代次数或者损失函数的值小于阈值,停止迭代。
线性回归的例题:
通过分析披萨的直径与价格的线性关系,来预测任一直径的披萨的价格。
import matplotlib.pyplot as plt
import numpy as np
def facta(x,y,a,b,m):
return ((a*x+b)-y)*x/m#损失函数对a求偏导
def factb(x,y,a,b,m):
return ((a*x+b)-y)/m#损失函数对b求偏导
def fact ():
a=0.1
b=0.1
alpha=0.1 #步长赋予初值
stop=1 #阈值
size=[6,8,10,14,18]#样本数据
price=[7,9,13,17.5,18]
m=len(size)
a1=[]#存放a
b1=[]#存放b
for i in range(m):#对a和b进行迭代
a=a-alpha*facta(size[i],price[i],a,b,m)
b=b-alpha*factb(size[i],price[i],a,b,m)
a1.append(a)
b1.append(b)
loss=0
for j in range (m):#求解预测值和真实值的差值
loss+=1/(2*m)*(a*size[j]+b-price[j])**2
if loss < 2 :#差值小于阈值跳出循环
break
print("得到的回归函数是:y={}+{}*x".format(a,b))
#画出预测关系的图像
X=np.arange(0,20,0.5)
Y=a*X+b
plt.figure()
plt.xlabel("size")
plt.ylabel("price")
plt.plot(X,Y,'r')
plt.scatter(size,price,color='b')
plt.show()
fact()
结果为:得到的回归函数是:y=1.1786752+0.12398636800000001*x
红线是预测的函数图像,蓝点是样本点
多元线性回归:
多元线性回归与一元线性回归类似,只是最后的结果由多个变量来决定的,因此多元线性回归的方程可设为: 可以采用矩阵求和的方式表示该式子(写代码的时也常用这种方法)
(其中
是为参数
的一维列表,也是一行矩阵,同理x也是
为1),损失函数为:
求参数的偏导:(i=1,2,3,4......m 其中
等于1)
利用梯度下降原理求各个参数:
不断迭代,当损失函数的值小于阈值或者达到最大迭代次数时,停止迭代。