私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
線形回帰:限られたデータにおいて、パラメータを調整することで直線を近似し、この直線(モデル)を使って未知のデータに対して実験を行います。予測する。
真っ直ぐ一般的な形式:
y = w × x + by = w 掛ける x + bええ=わ×バツ+b
直線全体の状態は次のように与えられます。 wとbwとbわそしてb決める、 わーいわ直線を決めるスロープ(つまり、傾斜角)、 bbbY軸上の直線を決定しますインターセプト(直線の上下の平行移動を制御します。バイアス )。したがって、計算するだけで済みます わーいわそして bbbの値によって特定の直線を決定できます。次に、その求め方を検討します。 わーいわそして bbb。
固有名詞
名詞 | 意味 |
---|---|
トレーニングセット | モデルのトレーニングに使用されるデータセット |
テストセット | モデルの品質をテストするために使用されるデータセット |
トレーニングサンプル/トレーニングポイント (トレーニングサンプル) | トレーニングセット内の各データ項目 |
特徴 | モデルに入力されるデータは、数値、カテゴリ ラベル、画像のピクセル値などです。 |
ラベル | モデルはターゲット値を予測する必要があります。分類問題の場合、ラベルは通常クラス名です。回帰問題の場合、ラベルは連続値です。 |
まず一変量線形回帰について勉強しましょう。いわゆる一変量線形回帰とは、次のような独立変数が 1 つだけある線形関数を指します。 y = w ⋅ x + by = wcdot x +bええ=わ⋅バツ+bあれは単変量直線、入力変数は 1 つだけです xxバツ 。この直線は2次元平面(横軸をX、縦軸をY)上で表現することができる。
分割されていないデータのセットを取得した場合、通常、データをトレーニング セットとテスト セットに分割します。簡単な分割方法は、サンプルの最初の 80% をトレーニング セットとして取得し、残りの 20% をトレーニング セットとして取得することです。テストセット。
わかったと仮定してください わーいわそして 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、これは勾配降下法で解くことができます。コスト関数の形状はおおよそ次のとおりです。
勾配降下の考え方は主に実行されます偏導関数を求めます生物学的手法に関連する制御変数この方法は次のように非常に似ています。 bbb変更せずに更新します わーいわ(見える bbbは定数です)、式: w ′ = w − α ∂ J ( w ) ∂ ww' = w - α frac{部分 J(w)}{部分 w}わ′=わ−α∂わ∂J(わ) 順次更新されていることを示します わーいわ、で α アルファα を表します学習率 歩幅を表すために使用され、降下速度としても理解できます。 ∂ J ( w ) ∂ w frac{部分 J(w)}{部分 w}∂わ∂J(わ) 権利を表明する わーいわ偏導関数を求めると、次のようになります。 W − JW - Jわ−J(重みわそして価格J関数) 凸関数上の接線。最も速く減少する関数値を表すために使用されます。方向、2 つの積は次を表します。関数値が最も早く減少する方向に 1 ステップ移動します 。この距離はデータセットに応じて調整する必要があります。 α アルファα大きすぎる(ステップサイズが大きすぎる)と、 わーいわ最低点を直接超えて反対側の最高点まで移動するため、最小値に近づくことはありません。 α アルファα小さすぎると(ステップサイズが小さすぎると)、 わーいわ最小値に近づくにつれて速度はどんどん遅くなり、計算コストが消費されます。
学習率 ( α アルファα)調整方法:
最初に小さいものを設定します α アルファα 例: 0.001。
その後、毎回 10 倍ずつ増加し、最大 1 倍になります。
0.01 などの特定の値を決定した後。
次に、次のような処理を 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)})^2∂わ∂2メートル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)})^2∂わ∂2メートル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}∂b∂J(わ) :
∂ J ( w ) ∂ b frac{部分 J(w)}{部分 b}∂b∂J(わ) = ∂ ∂ 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)})^2∂b∂2メートル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)})^2∂b∂2メートル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−α∂b∂J(わ,b)
w = w ∗ w = w^*わ=わ∗
b = b ∗ b = b^*b=b∗
最初に w と b をランダムに値付けし、それから反復を行って、誤差が特定のしきい値を下回ったときに終了するように勾配降下を設定したり、限られたステップで反復回数をカスタマイズしたりすることができます。 わーいわ値の合計 bbb価値。
多変数線形回帰は、次元を 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、bわ1,わ2,…,わん,b) 勾配降下処理の場合
要点: 多変数線形回帰の場合、さまざまな特徴値の値の範囲は次のように異なります。 年齢特徴の値の範囲: 0 0 0 ~ 100 100 100、カバー範囲: 0 平方メートル 0平方メートル0メートル2 ~ 10000 m 2 10000m^210000メートル2 、もあるかもしれません。奇妙なサンプル、単一のサンプル データが存在すると、学習時間が増加し、収束に失敗する可能性もあります。そのため、単一のサンプル データがある場合は、学習前にデータを前処理する必要があります。正規化された ; 逆に、特異なサンプルデータが存在しない場合には、正規化を行う必要はありません。この問題に対処するには、次のことを実行する必要があります。特徴はスケーリング (正規化) されます。
データ正規化処理
成し遂げるデータの正規化次の 3 つの方法があります。
最大値で割ることと同じ:
各特徴のすべての値をその特徴の最大値で割ります。
平均正規化:
各特徴の値からその特徴の値を減算します。平均を計算し、特徴量の最大値と最小値の差で割ります。
Z スコアの正規化:
各特徴量を計算する標準偏差そして平均
その特徴のすべての値から各特徴の値を減算します平均値を特徴量で割ります。平均
正規化が実行されない場合、特徴ベクトル内のさまざまな特徴の値の大きな違いにより、コスト関数が変化します。 "フラット" 。このように、勾配降下を行うと、勾配の方向が最小値の方向からずれてしまい、大きく進んでしまいます。迂回、トレーニング時間が長くなりすぎます。
正規化後、目的関数は比較を示します。 "ラウンド"、その結果、トレーニング速度が大幅に加速され、多くの回り道が回避されます。
データ正規化の利点:
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
重回帰の勾配降下法:
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_nわ1⋯わん は各変数の係数、bは一次関数の定数項を表す。
省略...
数学的導出:
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ええ)
右 θ シータθ偏導関数を求めます。 Δ = ∂ 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ええ)
行列導出ルール:
∂ θ TA θ ∂ θ = ( A + AT ) θ frac{部分θ^{T}Atheta}{部分θ} = (A + A^T)theta∂θ∂θTあθ=(あ+あT)θ
∂ XTA ∂ X = A 部分 X^{T}A}{部分 X} = A∂バツ∂バツTあ=あ
∂ AX ∂ X = AT frac{部分 AX}{部分 X} = A^T∂バツ∂あバツ=あT
∂ 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未満であればまだ許容されます。線形モデルでのみ使用可能、ロジスティック回帰モデルなどの他のモデルには適していません。
場合によっては、直線ですべてのデータを当てはめることが難しいため、データを当てはめるために 2 次モデル、3 次モデルなどの曲線が必要になります。
一般にデータの回帰関数は不明であり、たとえわかっていても単純な関数変換で線形モデルに変換するのは難しいため、以下のようなアプローチが一般的です。多項式回帰(多項式回帰)、つまり、多項式関数を使用してデータを近似します。
多項式の次数を選択する方法:
一般に、多項式関数にはさまざまな種類があります。まず、データの形状を観察してから、問題を解くためにどの形式の多項式関数を使用するかを決定する必要があります。たとえば、データの散布図から、「曲げる " の場合は、2 次多項式 (つまり、特性を 2 乗する) を使用することを検討できます。次の 2 つがあります。"曲げる " の場合は、3 次多項式 (特徴の 3 次乗を計算) を使用することを検討できます。次の 3 つがあります。"曲げる 」を考えてから、4 次多項式 (特徴量の 4 乗) の使用を検討します。
実回帰関数は必ずしもある程度の多項式である必要はないが、近似が良好であれば、適切な多項式を使用して実回帰関数を近似することが可能である。
記事の最後にある付録には、実験で使用されたすべての元のデータが含まれています。ex1data1.txt
人口と利益の関係、 ex1data2.txt
家の大きさと寝室の数が家の価格に与える影響です。
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() # 预览数据
data.describe() # 更加详细的数据描述
# 可视化训练数据
data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (12,8))
plt.show()
def computerCost(X,y,theta): # 定义代价函数
inner = np.power(((X*theta.T)-y),2) # theta.T表示theta的转置
return np.sum(inner)/(2*len(X))
data.insert(0,"One",1) # 表示在第0列前面插入一列数,其表头为One,其值为1
データセットの最初の列に挿入します 1 1 1機能は次のとおりですマトリックスの計算を容易にする、行列を乗算するときは重みが関係します。 わーいわそして偏見 bbb、なぜなら bbb変数は乗算されないため、 1 1 1、一緒に使用されます bbbかける。
cols = data.shape[1]
X = data.iloc[:,0:cols - 1] #“,”前只有“:”,表示所有的行,“,”后表示抽取数据中第[0列~第cols-1列)(左闭右开),去掉最后一列,最后一列为预测值
y = data.iloc[:,cols - 1:cols] #只取最后一列的值,表示预测值
X.head()
y.head()
X = np.matrix(X.values)
y = np.matrix(y.values) #只将表格中的值装换为矩阵而不是包括序号与标题
#初始化theta
theta = np.matrix(np.array([0,0])) #先是一个一维的数据,然后在转换为一个二维的矩阵
theta
# => matrix([[0, 0]])
X.shape,theta.shape,y.shape # 此时theta为一行列,需要进行转置
# => ((97, 2), (1, 2), (97, 1))
computerCost(X,y,theta)
# => 32.072733877455676
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
alpha = 0.01 # 学习率
iters = 1000 # 迭代次数
g,cost = gradientDecent(X,y,theta,alpha,iters)
g
# => matrix([[-3.24140214, 1.1272942 ]])
computerCost(X,y,g)
# => 4.515955503078914
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()
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()
path = "ex1data2.txt"
data2 = pd.read_csv(path,header = None,names=["Size","Bedroom","Price"])
data2.head()
data2 = (data2 - data2.mean())/data2.std()
data2.head()
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
g2,cost2 = gradientDecent(X2,y2,theta2,alpha,iters) #记录放回值g2(theta2)和cost2
g2
# => matrix([[-1.10868761e-16, 8.78503652e-01, -4.69166570e-02]])
computerCost(X2,y2,g2)
# => 0.13070336960771892
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()
#正规方程
def normalEqn(X,y):
theta = np.linalg.inv(X.T@X)@X.T@y #.linalg中包含线性代数中的函数,求矩阵的逆(inv)、特征值等。@表示矩阵相乘
return theta
final_theta2 = normalEqn(X,y)
final_theta2
# => matrix([[-3.89578088], [ 1.19303364]])
モデルをトレーニングするための一般的な手順:
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
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