勾配降下
勾配降下法(英語:勾配降下)はまた、一般的に最急降下法として知られている、一次最適化アルゴリズムです。勾配降下法を用いて関数の極小値を見つけるために、それは長い距離点反復検索手順の現在の点までの所定の関数の逆方向勾配(約または勾配)に対応しなければなりません。検索代わり場合、関数は、正方向反復勾配に近い極大点になります。このプロセスは、勾配上昇法と呼ばれます。
勾配降下読影
今、あなたはA点である今回は、その後、あなたは勾配降下の最下点を見つけるために、この時間を使用することができ、あなたは谷のローエンドに到達したい、谷があります。あなたが参照としてあなたの現在の方向を注文するたびに。少し離れたびに落ちて山の方に歩いて、最も急な方向を選択し、手順を繰り返し、あなたは常にトップに到達することができます。
##勾配降下アルゴリズム理論
原理を紹介:
### 微分
実際には、差分画像は、いくつかの点での傾きの関数として見ることができます。そこ単変量および多変量微分差分
勾配
方向(この勾配の方向)に沿って機能最速変化を変更するに、この時点で方向の方向微分の最大値を取得する関数を表す勾配ベクトル(ベクトル)、すなわちポイントを意図しています(勾配モード)最大レート。
勾配ベクトル。実際ガイドの構成部分ベクトルをとる変数の各々のための点の勾配。
プリンキピア・マテマティカ勾配降下アルゴリズム
式を説明:\(\ Theta_0 \) 、現在位置を表す(\ theta_1 \)\、位置を表す(\アルファ\)\工程、を表し(J \)を\関数は、現在の勾配です。ステップサイズマイナス記号は下り坂、即ち、逆方向を示しています。
機械学習では\(\アルファ\)学習率やステップサイズを表し、我々はする必要があります\(\アルファ\)に行くために、各ステップの距離を制御するために、どちらも速すぎても遅すぎます。
勾配降下アプリケーション例
今、私たちは、単一の変数の機能を持っています:
差別化機能の場合:
セット(Theta_0 \ 1 = \)\、学習率(\ \アルファ= 0.4 \)
勾配降下式
私たちは、繰り返しを続けます。
後に(4 \)\反復、最終的な結果は、近い関数の最小値です。
同じ多変数関数及び一変量を解決するためのプロセスを解きます。
回帰直線的勾配降下解決
住宅価格と面積(以下の表のデータ)
いいえ。 | エリア | 価格 |
---|---|---|
1 | 150 | 6450 |
2 | 200 | 7450 |
3 | 250 | 8450 |
4 | 300 | 9450 |
5 | 350 | 11450 |
6 | 400 | 15450 |
7 | 600 | 18450 |
使用梯度下降求解线性回归(求\(\Theta_0,\Theta_1\))
我们的目的是使得我们的估计值和实际值相差最小,因此我们定义一个代价函数,这里我们使用均方误差代价函数:
即:
而其中\(h_\Theta(x)=\Theta_0+\Theta_1x\)
让函数分别对\(\Theta_0,\Theta_1\)求偏导。
其中:
接下来就是代码时间了
import math
m=7 #数据集大小
Theta0=300
Theta1=100
#初始坐标
alpha=0.000000001#学习率
area=[150,200,250,300,350,400,600];#数据集
price=[6450,7450,8450,9450,11450,15450,18450];
def gradientx(Theta0,Theta1):#对Theta0的偏导
ans=0
for i in range(0,7):
ans=ans+Theta0+Theta1*area[i]-price[i]
ans=ans/m
return ans
def gradienty(Theta0,Theta1):#对Theta1的偏导
ans=0
for i in range(0,7):
ans=ans+(Theta0+Theta1*area[i]-price[i])*area[i]
ans=ans/m
return ans
nowTheta0 = Theta0-alpha*gradientx(Theta0, Theta1)#下一个点的坐标
nowTheta1 = Theta1-alpha*gradienty(Theta0, Theta1)
#print(nowTheta0,nowTheta1)
while math.fabs(nowTheta1-Theta1)>0.000000001:#梯度下降
nowa = nowTheta0-alpha*gradientx(nowTheta0,nowTheta1)
nowb = nowTheta1-alpha*gradienty(nowTheta0, nowTheta1)
nowTheta0=nowa
nowTheta1=nowb
nowa = Theta0-alpha*gradientx(Theta0, Theta1)
nowb = Theta1-alpha*gradienty(Theta0, Theta1)
Theta0=nowa
Theta1=nowb
print(nowTheta0,nowTheta1 )
#299.85496413867725 32.638872688242515
绘图
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
area=[150,200,250,300,350,400,600]#数据集
price=[6450,7450,8450,9450,11450,15450,18450]
pyplot.scatter(area,price)
x=np.arange(100,700,100)
y=32.37648991481203*x+299.85496413867725
pyplot.plot(x,y)
pyplot.xlabel('area')
pyplot.ylabel('price')
pyplot.show()
结果:
我们可以看到梯度下降求解出的线性回归很好的与结果吻合了。
拟合过程(每次的\(\Theta_0\)和\(\Theta_1\)):