技術共有

線形回帰モデル

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

線形回帰

1. 理論部分

線形回帰:限られたデータにおいて、パラメータを調整することで直線を近似し、この直線(モデル)を使って未知のデータに対して実験を行います。予測する

真っ直ぐ一般的な形式
y = w × x + by = w 掛ける x + bええ=×バツ+b
直線全体の状態は次のように与えられます。 wとbwとbそしてb決める、 わーい直線を決めるスロープ(つまり、傾斜角)、 bbbY軸上の直線を決定しますインターセプト(直線の上下の平行移動を制御します。バイアス )。したがって、計算するだけで済みます わーいそして bbbの値によって特定の直線を決定できます。次に、その求め方を検討します。 わーいそして bbb

ここに画像の説明を挿入します

直線の形状に対する w と b の影響

固有名詞

名詞意味
トレーニングセットモデルのトレーニングに使用されるデータセット
テストセットモデルの品質をテストするために使用されるデータセット
トレーニングサンプル/トレーニングポイント (トレーニングサンプル)トレーニングセット内の各データ項目
特徴モデルに入力されるデータは、数値、カテゴリ ラベル、画像のピクセル値などです。
ラベルモデルはターゲット値を予測する必要があります。分類問題の場合、ラベルは通常クラス名です。回帰問題の場合、ラベルは連続値です。

1. 単変量線形回帰

1) データの前処理

まず一変量線形回帰について勉強しましょう。いわゆる一変量線形回帰とは、次のような独立変数が 1 つだけある線形関数を指します。 y = w ⋅ x + by = wcdot x +bええ=バツ+bあれは単変量直線、入力変数は 1 つだけです xxバツ 。この直線は2次元平面(横軸をX、縦軸をY)上で表現することができる。

分割されていないデータのセットを取得した場合、通常、データをトレーニング セットとテスト セットに分割します。簡単な分割方法は、サンプルの最初の 80% をトレーニング セットとして取得し、残りの 20% をトレーニング セットとして取得することです。テストセット。

2) コスト関数を定義する

わかったと仮定してください わーいそして bbb次に、直線を決定しました。予測する値の判断を容易にするために、この直線を使用して予測を行うことができます。本当の価値を持ってええエラーどれくらい、予測値を測定するために使用される *「定規」* を定義したいと思います y ′ y'ええ真の価値を持って ええええ間のエラー。ここで使用するのは平均二乗誤差定義しますコスト関数

J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sumlimits_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2J(,b)=2メートル1=1メートル(,b(バツ())ええ())2
式の解体

fw, b ( x ( i ) ) − y ( i ) f_{w,b}(x^{(i)}) - y^{(i)},b(バツ())ええ():で fw , b ( x ( i ) ) f_{w,b}(x^{(i)}),b(バツ())はトレーニング済みモデルを使用して予測された値を表します。 y ( i ) y^{( i )} のええ()は各トレーニング サンプルの真の結果を表し、この 2 つの差はモデルによって予測された値と真の値の間の誤差を表します。

なぜ誤差を二乗するのでしょうか?

すべてのサンプル セットで、各誤差は正または負になる可能性があり、合計プロセス中に一定の確率でオフセットが発生します。これにより、各項目の誤差が非常に大きい場合 (-100、+ 90、など) が発生します。 -25、+30)を加算すると小さな値(-5)が得られ、最終的には誤判定が得られます。

1 2 m フラク{1}{2m}2メートル1: すべてのデータ誤差の合計の平均を表し(この平均は、ある意味モデル全体の誤差を表すことができます)、平均二乗誤差を求めます。

なぜ2で割るのか

後で勾配降下を実行するときに、導出によってインデックス 2 が係数に分割されるため、大量のデータの場合、定数はモデルにほとんど影響を与えないため、導出式を導入するために、事前に 2 で割っておきます。 、後続のオフセット用。

コスト関数がわかれば、コストを削減する方法を見つけるだけで済みます。コストが低いほど、予測値は真の値に近づきます。

誤差コスト関数を観察すると、誤差コスト関数が二次関数であることがわかります。凸関数、凸関数のプロパティは次のとおりです。極点は最大点です 、コスト関数は上に開く二次関数であるため (式は展開でき、二乗項の係数が 0 より大きいことが直感的に感じられます)、凸関数には最小値のみがあり、を見つける必要があります。最小値は最小値です。誤差コスト関数の場合 J ( w , b ) J(w,b)J(,b) 、その式展開は次のように記述できます。
J ( w , b ) = 1 2 m ∑ i = 1 m ( ( wx ( i ) + b ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sumlimits_{i = 1}^m((wx^{(i)}+b) - y^{(i)})^2J(,b)=2メートル1=1メートル((バツ()+b)ええ())2
ジェイジェイJサイズはパラメータによって異なります わーいそして bbb、これは勾配降下法で解くことができます。コスト関数の形状はおおよそ次のとおりです。

ここに画像の説明を挿入します

3) 勾配降下法

勾配降下の考え方は主に実行されます偏導関数を求めます生物学的手法に関連する制御変数この方法は次のように非常に似ています。 bbb変更せずに更新します わーい(見える bbbは定数です)、式: w ′ = w − α ∂ J ( w ) ∂ ww' = w - α frac{部分 J(w)}{部分 w}=αJ() 順次更新されていることを示します わーい、で α アルファα を表します学習率 歩幅を表すために使用され、降下速度としても理解できます。 ∂ J ( w ) ∂ w frac{部分 J(w)}{部分 w}J() 権利を表明する わーい偏導関数を求めると、次のようになります。 W − JW - JJ(重みそして価格J関数) 凸関数上の接線。最も速く減少する関数値を表すために使用されます。方向、2 つの積は次を表します。関数値が最も早く減少する方向に 1 ステップ移動します 。この距離はデータセットに応じて調整する必要があります。 α アルファα大きすぎる(ステップサイズが大きすぎる)と、 わーい最低点を直接超えて反対側の最高点まで移動するため、最小値に近づくことはありません。 α アルファα小さすぎると(ステップサイズが小さすぎると)、 わーい最小値に近づくにつれて速度はどんどん遅くなり、計算コストが消費されます。


学習率 ( α アルファα)調整方法

  1. 最初に小さいものを設定します α アルファα 例: 0.001。

  2. その後、毎回 10 倍ずつ増加し、最大 1 倍になります。

  3. 0.01 などの特定の値を決定した後。

  4. 次に、次のような処理を 3 回実行します。 0.01 × 3 = 0.03、0.03 × 3 = 0.09 0.01 掛ける 3 = 0.03、0.03 掛ける 3 = 0.090.01×3=0.03,0.03×3=0.09 (この目的は、収束を高速化することです)。


偏導関数を解くプロセス (勾配降下法の方向を見つける):

  • 懇願する ∂ J ( w ) ∂ w frac{部分 J(w)}{部分 w}J() :

    ∂ J ( w ) ∂ w frac{部分 J(w)}{部分 w}J() = ∂ ∂ w 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{partial}{partial w}frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^22メートル1=1メートル(,b(バツ())ええ())2

    ​ = ∂ ∂ w 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{partial}{partial w}frac{1}{2m}sumlimits_{i = 1}^{m}wx^{(i)} - y^{(i)})^22メートル1=1メートルバツ()ええ())2

    ​ = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 x ( i ) frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot2x^{(i)}2メートル1=1メートル(,b(バツ())ええ())2バツ()

    ​ = 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) x ( i ) frac{1}{m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}メートル1=1メートル(,b(バツ())ええ())バツ()

  • 懇願する ∂ J ( w ) ∂ b frac{部分 J(w)}{部分 b}bJ() :

    ∂ J ( w ) ∂ b frac{部分 J(w)}{部分 b}bJ() = ∂ ∂ b 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{partial}{partial b}frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2b2メートル1=1メートル(,b(バツ())ええ())2

    ​ = ∂ ∂ b 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{partial}{partial b}frac{1}{2m}sumlimits_{i = 1}^{m}wx^{(i)} - y^{(i)})^2b2メートル1=1メートルバツ()ええ())2

    = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot22メートル1=1メートル(,b(バツ())ええ())2

    ​ = 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) frac{1}{m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})メートル1=1メートル(,b(バツ())ええ())

ループ反復を通じて特定のものを見つける わーいとの値 bbb価値:

while() : while():こんにちはle():

w ∗ = w − α ∂ ∂ w J ( w , b ) w^* = w - α frac{partial}{partial w}J(w,b)=αJ(,b)

b ∗ = b − α ∂ ∂ b J ( w , b ) b^* = b - アルファ frac{partial}{partial b}J(w,b)b=bαbJ(,b)

w = w ∗ w = w^*=

b = b ∗ b = b^*b=b

最初に w と b をランダムに値付けし、それから反復を行って、誤差が特定のしきい値を下回ったときに終了するように勾配降下を設定したり、限られたステップで反復回数をカスタマイズしたりすることができます。 わーい値の合計 bbb価値。

2. 多変数線形回帰

多変数線形回帰は、次元を 3 次元、さらには次のような多次元状態に拡張します。 y = w 1 x 1 + w 2 x 2 + by = w_1 x_1 + w_2 x_2 + bええ=1バツ1+2バツ2+b 次のように理解できますバツ軸とはい軸は x 1 と x 2 x_1 と x_2バツ1そしてバツ2 軸は ええええ、これは 3 次元状態です。各トレーニング サンプルは 3 次元空間内の点です。3 次元空間内のサンプル点に適合する適切な直線を見つける必要があります。

方法: 変数ごとに個別に ( w 1 、 w 2 、 … 、 wn 、 b w_1、w_2、ドット、w_n、b1,2,,,b) 勾配降下処理の場合

要点: 多変数線形回帰の場合、さまざまな特徴値の値の範囲は次のように異なります。 年齢特徴の値の範囲: 0 0 0 ~ 100 100 100、カバー範囲: 0 平方メートル 0平方メートル0メートル2 ~ 10000 m 2 10000m^210000メートル2 、もあるかもしれません。奇妙なサンプル、単一のサンプル データが存在すると、学習時間が増加し、収束に失敗する可能性もあります。そのため、単一のサンプル データがある場合は、学習前にデータを前処理する必要があります。正規化された ; 逆に、特異なサンプルデータが存在しない場合には、正規化を行う必要はありません。この問題に対処するには、次のことを実行する必要があります。特徴はスケーリング (正規化) されます

1) データの前処理

データ正規化処理

成し遂げるデータの正規化次の 3 つの方法があります。

  1. 最大値で割ることと同じ:

    各特徴のすべての値をその特徴の最大値で割ります。

  2. 平均正規化:

    各特徴の値からその特徴の値を減算します。平均を計算し、特徴量の最大値と最小値の差で割ります。

  3. Z スコアの正規化:

    各特徴量を計算する標準偏差そして平均

    その特徴のすべての値から各特徴の値を減算します平均値を特徴量で割ります。平均

正規化が実行されない場合、特徴ベクトル内のさまざまな特徴の値の大きな違いにより、コスト関数が変化します。 "フラット" 。このように、勾配降下を行うと、勾配の方向が最小値の方向からずれてしまい、大きく進んでしまいます。迂回、トレーニング時間が長くなりすぎます。

正規化後、目的関数は比較を示します。 "ラウンド"、その結果、トレーニング速度が大幅に加速され、多くの回り道が回避されます。

データ正規化の利点:

  1. 正規化後最適な解を見つけるために勾配降下を高速化しますつまり、トレーニング ネットワークの収束を高速化します。
  2. 正規化により精度が向上する可能性があります。
2) コスト関数 (単変量線形回帰のコスト関数と同じ)

J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sumlimits_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2J(,b)=2メートル1=1メートル(,b(バツ())ええ())2

3) 勾配降下法

重回帰の勾配降下法

w 1 = W 1 − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) x 1 ( i ) w_1 = W_1 - alpha frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_1^{(i)}1=1αメートル1=1メートル( ,bバツ ()ええ())バツ1()

⋮ ビデオドット

wn = W n − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) xn ( i ) w_n = W_n - alpha frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_n^{(i)}=αメートル1=1メートル( ,bバツ ()ええ())バツ()

b = b − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) b = b - α frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})b=bαメートル1=1メートル( ,bバツ ()ええ())

説明する: w 1 ⋯ wn w_1cdots w_n1 は各変数の係数、bは一次関数の定数項を表す。

3.正規方程式

1) データの前処理

省略...

2) コスト関数

数学的導出:

J = 1 2 m ∑ i = 1 m ( θ ⃗ ix ⃗ i − yi ) 2 J = frac{1}{2m}sumlimits_{i = 1}^{m}(vec{theta}_i vec{x}_i - y_i)^2J=2メートル1=1メートル(θ バツ ええ)2

​ = 1 2 m ∣ ∣ θ ⃗ x ⃗ − y ∣ ∣ 2 frac{1}{2m}||vec{theta} vec{x} - y||^22メートル1∣∣θ バツ ええ2

​ = 1 2 m ( θ ⃗ x ⃗ − y ) T ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta} vec{x} - y)^T(vec{theta} vec{x} - y)2メートル1(θ バツ ええ)T(θ バツ ええ)

​ = 1 2 m ( θ ⃗ T x ⃗ T − y T ) ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta}^T vec{x}^T - y^T)(vec{theta} vec{x} - y)2メートル1(θ Tバツ TええT)(θ バツ ええ)

​ = 1 2 m ( θ ⃗ T x ⃗ T x ⃗ θ ⃗ − y T x ⃗ θ ⃗ − θ ⃗ T x ⃗ T y + y T y ) frac{1}{2m}(vec{theta}^T vec{x}^Tvec{x}vec{theta} - y^Tvec{x}vec{theta} -vec{theta}^Tvec{x}^Ty +y^Ty )2メートル1(θ Tバツ Tバツ θ ええTバツ θ θ Tバツ Tええ+ええTええ)

3) 勾配降下法

θ シータθ偏導関数を求めます。 Δ = ∂ J ∂ θ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) デルタ =frac{部分 J}{部分 θ}= frac{1}{2m}(frac{部分 vec{theta}^T vec{x}^Tvec{x}vec{theta}}{部分 θ} - frac{部分 y^Tvec{x}vec{theta}}{部分 θ} - frac{部分 vec{theta}^Tvec{x}^Ty}{部分 θ} + frac{y^Ty}{部分θ})Δ=θJ=2メートル1(θθ Tバツ Tバツ θ θええTバツ θ θθ Tバツ Tええ+θええTええ)

行列導出ルール:

  1. ∂ θ TA θ ∂ θ = ( A + AT ) θ frac{部分θ^{T}Atheta}{部分θ} = (A + A^T)thetaθθTθ=(+T)θ

  2. ∂ XTA ∂ X = A 部分 X^{T}A}{部分 X} = AバツバツT=

  3. ∂ AX ∂ X = AT frac{部分 AX}{部分 X} = A^Tバツバツ=T

  4. ∂ A ∂ X = 0 部分 A}{部分 X} = 0バツ=0

利用可能 Δ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) = 1 2 m ⋅ ( 2 x T x θ − 2 x T y ) = 1 m ⋅ ( x T x θ − x T y ) デルタ = frac{1}{2m}(frac{partial vec{theta}^T vec{x}^Tvec{x}vec{theta}}{partial theta} - frac{partial y^Tvec{x}vec{theta}}{partial theta} - frac{partial vec{theta}^Tvec{x}^Ty}{部分θ} + frac{y^Ty}{部分θ}) = frac{1}{2m}cdot (2x^Txtheta - 2x^Ty) = frac{1}{m} cdot (x^Txtheta - x^Ty)Δ=2メートル1(θθ Tバツ Tバツ θ θええTバツ θ θθ Tバツ Tええ+θええTええ)=2メートル1(2バツTバツθ2バツTええ)=メートル1(バツTバツθバツTええ)
いつ Δ = 0 デルタ = 0Δ=0 時間: x T x θ = x T yx^Tx シータ = x^TyバツTバツθ=バツTええ , θ = ( x T x ) − 1 x T y シータ = (x^Tx)^{-1}x^Tyθ=(バツTバツ)1バツTええ 計算できる θ シータθ 価値。

勾配降下方程式と正規方程式の比較

  • 勾配降下法: 学習率 α を選択する必要がありますが、これには複数回の反復が必要です。また、特徴量 n が大きい場合にもより適切に適用でき、さまざまなタイプのモデルに適しています。

  • 正規方程式:学習率αは選択する必要はありません。一度計算されますので計算する必要があります。 ( x T x ) − 1 (x^Tx)^{-1}(バツTバツ)1 、特徴の数の場合 んん逆行列の計算時間は大きくなるため、演算コストが大きくなります。 O ( n 3 ) O(n^3)(3) 、通常、いつ んん10,000未満であればまだ許容されます。線形モデルでのみ使用可能、ロジスティック回帰モデルなどの他のモデルには適していません。

4.多項式回帰

場合によっては、直線ですべてのデータを当てはめることが難しいため、データを当てはめるために 2 次モデル、3 次モデルなどの曲線が必要になります。

一般にデータの回帰関数は不明であり、たとえわかっていても単純な関数変換で線形モデルに変換するのは難しいため、以下のようなアプローチが一般的です。多項式回帰(多項式回帰)、つまり、多項式関数を使用してデータを近似します。

多項式の次数を選択する方法

一般に、多項式関数にはさまざまな種類があります。まず、データの形状を観察してから、問題を解くためにどの形式の多項式関数を使用するかを決定する必要があります。たとえば、データの散布図から、「曲げる " の場合は、2 次多項式 (つまり、特性を 2 乗する) を使用することを検討できます。次の 2 つがあります。"曲げる " の場合は、3 次多項式 (特徴の 3 次乗を計算) を使用することを検討できます。次の 3 つがあります。"曲げる 」を考えてから、4 次多項式 (特徴量の 4 乗) の使用を検討します。

実回帰関数は必ずしもある程度の多項式である必要はないが、近似が良好であれば、適切な多項式を使用して実回帰関数を近似することが可能である。

2. 実験部分

記事の最後にある付録には、実験で使用されたすべての元のデータが含まれています。ex1data1.txt人口と利益の関係、 ex1data2.txt家の大きさと寝室の数が家の価格に与える影響です。

1. 単変量線形回帰

1) データのロード
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = "ex1data1.txt"
data = pd.read_csv(path,header = None,names=['Population','Profit'])
data.head()   # 预览数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ここに画像の説明を挿入します

2) データを見る
data.describe()    # 更加详细的数据描述
  • 1

ここに画像の説明を挿入します

# 可视化训练数据
data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (12,8))
plt.show()
  • 1
  • 2
  • 3

ここに画像の説明を挿入します

3) コスト関数を定義する
def computerCost(X,y,theta):    # 定义代价函数
    inner = np.power(((X*theta.T)-y),2)   # theta.T表示theta的转置
    return np.sum(inner)/(2*len(X))
  • 1
  • 2
  • 3
data.insert(0,"One",1)  # 表示在第0列前面插入一列数,其表头为One,其值为1
  • 1

データセットの最初の列に挿入します 1 1 1機能は次のとおりですマトリックスの計算を容易にする、行列を乗算するときは重みが関係します。 わーいそして偏見 bbb、なぜなら bbb変数は乗算されないため、 1 1 1、一緒に使用されます bbbかける。

4) データを分割する
cols = data.shape[1]
X = data.iloc[:,0:cols - 1]  #“,”前只有“:”,表示所有的行,“,”后表示抽取数据中第[0列~第cols-1列)(左闭右开),去掉最后一列,最后一列为预测值

y = data.iloc[:,cols - 1:cols]  #只取最后一列的值,表示预测值

  • 1
  • 2
  • 3
  • 4
  • 5
X.head()
  • 1

ここに画像の説明を挿入します

y.head()
  • 1

ここに画像の説明を挿入します

X = np.matrix(X.values)
y = np.matrix(y.values)  #只将表格中的值装换为矩阵而不是包括序号与标题

#初始化theta
theta = np.matrix(np.array([0,0]))  #先是一个一维的数据,然后在转换为一个二维的矩阵
  • 1
  • 2
  • 3
  • 4
  • 5
5) 初期化パラメータ
theta  
# => matrix([[0, 0]])
  • 1
  • 2
X.shape,theta.shape,y.shape  # 此时theta为一行列,需要进行转置
# => ((97, 2), (1, 2), (97, 1))
  • 1
  • 2
computerCost(X,y,theta)
# => 32.072733877455676
  • 1
  • 2
6) 勾配降下関数を定義する
def gradientDecent(X,y,theta,alpha,iters):   #iters为迭代次数
    temp = np.matrix(np.zeros(theta.shape))   #构造一个与theta大小一样的零矩阵,用于存储更新后的theta
    parmaters = int (theta.ravel().shape[1])    #.ravel()的功能是将多维数组降至一维,用于求需要求的参数个数
    cost = np.zeros(iters)   #构建iters个0的数组,相当于对每次迭代的cost进行记录
    
    for i in range(iters):
        error = (X * theta.T - y)     #记录误差值,结果为一个数组
        for j in range(parmaters):    #对每一个参数进行更新,j用于表示每一个参数
            term = np.multiply(error,X[:,j])   #.multiply 是对矩阵当中的数对应相乘,这里表示与X矩阵的第j列相乘。
            temp[0,j] = theta[0,j] - ((alpha/len(X))*np.sum(term))  #存储更行后的theta的值,.sum()表示将矩阵中的数进行求和
        
        theta = temp      #更新theta
        cost[i] = computerCost(X,y,theta)  #计算此时的代价,并记录在cost中。
    return theta,cost
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
7) ハイパーパラメータの初期化
alpha  = 0.01		# 学习率
iters = 1000		# 迭代次数
  • 1
  • 2
8) 勾配降下法
g,cost = gradientDecent(X,y,theta,alpha,iters)
g
# => matrix([[-3.24140214,  1.1272942 ]])
  • 1
  • 2
  • 3
9) コストを計算する
computerCost(X,y,g)
# => 4.515955503078914
  • 1
  • 2
10) 線形モデルの描画
x = np.linspace(data.Population.min(),data.Population.max(),100) #抽取100个样本  (从data数据集中的最小值到最大值之间抽取100个样本)
f = g[0,0] + (g[0,1] * x)  #f = ax + b

fig,ax = plt.subplots(figsize = (12,8))    #figsize表示图的大小
ax.plot(x,f,'r',label = "Prediction")    #绘制直线,横坐标,纵坐标,直线名称
ax.scatter(data.Population,data.Profit,label = 'Training data')   #绘制点,横坐标,纵坐标,点的名称
ax.legend(loc = 4)  #显示图例位置
ax.set_xlabel('Population')  #设置x轴的名称
ax.set_ylabel('Profit')   #设置y轴的名称
ax.set_title('Predicted Profit vs. Population Size')  #设置标题的名称
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ここに画像の説明を挿入します

11) コスト変化曲線を描く
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost,'r')
ax.set_xlabel('Interations')
ax.set_ylabel('Cost')
ax.set_title("Error vs. Training Epoc")
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ここに画像の説明を挿入します

2. 多変数線形回帰

1) データのロード
path = "ex1data2.txt"
data2 = pd.read_csv(path,header = None,names=["Size","Bedroom","Price"])
data2.head()
  • 1
  • 2
  • 3

ここに画像の説明を挿入します

2) データ正規化処理
data2 = (data2 - data2.mean())/data2.std()
data2.head()
  • 1
  • 2

ここに画像の説明を挿入します

3) データを分割する
data2.insert(0,'Ones',1)  #在x的第一列插入1

clos = data2.shape[1]   #存储第二维(列)的数据量
X2 = data2.iloc[:,0:clos-1]  #对X2进行赋值
y2 = data2.iloc[:,clos-1:clos]  #对y2进行赋值

X2 = np.matrix(X2.values)  #将X2转为矩阵
y2 = np.matrix(y2.values)  #将y2转为矩阵
theta2 = np.matrix(np.array([0,0,0]))  #初始化theta2为0矩阵
computerCost(X2, y2, theta2)
# => 0.48936170212765967
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
4) 勾配降下法
g2,cost2 = gradientDecent(X2,y2,theta2,alpha,iters)   #记录放回值g2(theta2)和cost2
g2
# => matrix([[-1.10868761e-16,  8.78503652e-01, -4.69166570e-02]])
  • 1
  • 2
  • 3
5) コストを計算する
computerCost(X2,y2,g2)
# => 0.13070336960771892
  • 1
  • 2
6) コスト変化曲線を描く
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost2,'x')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

画像の説明を追加してください

3. 正規方程式

#正规方程
def normalEqn(X,y):
    theta = np.linalg.inv(X.T@X)@X.T@y   #.linalg中包含线性代数中的函数,求矩阵的逆(inv)、特征值等。@表示矩阵相乘
    return theta
  • 1
  • 2
  • 3
  • 4
final_theta2 = normalEqn(X,y)
final_theta2
# => matrix([[-3.89578088], [ 1.19303364]])
  • 1
  • 2
  • 3

3. まとめ

モデルをトレーニングするための一般的な手順

  1. データの前処理。
  2. 特定の問題に基づいてモデルを選択してください。
  3. コスト関数を設定します。
  4. 勾配降下法アルゴリズムを使用して、最適なパラメーターを見つけます。
  5. モデルを評価し、ハイパーパラメータを調整します。
  6. モデルを使用して予測を行います。

4. 付録

1. ex1data1.txt

6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

2. ex1data2.txt

2104,3,399900
1600,3,329900
2400,3,369000
1416,2,232000
3000,4,539900
1985,4,299900
1534,3,314900
1427,3,198999
1380,3,212000
1494,3,242500
1940,4,239999
2000,3,347000
1890,3,329999
4478,5,699900
1268,3,259900
2300,4,449900
1320,2,299900
1236,3,199900
2609,4,499998
3031,4,599000
1767,3,252900
1888,2,255000
1604,3,242900
1962,4,259900
3890,3,573900
1100,3,249900
1458,3,464500
2526,3,469000
2200,3,475000
2637,3,299900
1839,2,349900
1000,1,169900
2040,4,314900
3137,3,579900
1811,4,285900
1437,3,249900
1239,3,229900
2132,4,345000
4215,4,549000
2162,4,287000
1664,2,368500
2238,3,329900
2567,4,314000
1200,3,299000
852,2,179900
1852,4,299900
1203,3,239500
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47