この記事は私の理解に過ぎません。逸脱やエラーがある場合は訂正してください。
回帰:回帰は最初に実験モデルを提案しましたが、モデルの主要なパラメーターは不明です。大量のデータを使用して、テストデータに最適な実験モデルを見つけます。つまり、の主要なパラメーターを見つけます。モデル次に、LiHongyiの講義の例を使用します。具体的には回帰とは何かを参照してください。
これは、進化後のポケモンの戦闘能力(CP)を評価するための非常に興味深い例です。
Xcp、Xs、Xhp、Xw、Xhなどの他の属性が含まれています。
最初のステップはモデル(モデル)を決定することです。ここで線形モデルが決定されます。b、wはパラメーターであり、任意のデータであると表現することもできます。Xiはポケモンのさまざまな属性であり、wは重みとして理解できます。とbが理解できる偏差です。
2番目のステップは、これらの関数のどれが優れているかを判断することです。実際、b、wを判断し、最初にポケモンの進化データを収集します。
以下は、収集された10個のデータ(非常に少ないと感じます)と、進化の前後のデータの2次元グラフです。確率論で学ぶことのように感じますか?実際、これらを作成するための直線を見つけることです。可能な限りポイントします。近い場合は、最小二乗法が使用されます。
最小二乗法を使用してb、wを解きます。損失関数Lを使用します。実際、これは平均二乗誤差であり、小さいほど良いです。解b、wはLです。
最小化のプロセスは、線形回帰モデルの最小二乗法パラメーター推定と呼ばれます。
図の各点はモデル関数を表し、色は平均二乗誤差を表し、青は良好を表し、赤は不良を表します。
3番目のステップは、微分導出を使用するLの最小値である最良の関数を選択することです。ここで使用される方法は、勾配降下法です。
最急降下法:ここでは、最初に1次元で計算しますが、未知のwは1つだけです。
1.初期点をランダムに選択します
2.導関数を計算します。負の数の場合はwの値を増やし、正の数の場合はwを減らします。実際、これによって減少の方向が決まります。これは学習率と呼ばれます。wiがどれだけ増えるかまたは減少は、導関数と学習率に依存します。
だから2番目のポイントを取得します
3. 2番目の手順を繰り返して、ローカルオプティカルを見つけます。
実際、この方法で局所最適のみを見つけることができることに誰もが非常に戸惑っています。実際、このモデルでは局所最適はありません。
2つのパラメーターの下で:偏導関数が使用され、他は基本的に1つのパラメーターと同じです。自分で確認してください(笑)。2つのパラメーターの下での局所最適もありません。
これは、問題を解決するための手順の図です
だから私はこのモデルを見つけました:平均エラー率を計算します、これはサンプルと直線の間の垂直距離の合計です;私たちはテストの平均エラー率についてもっと心配しています、テストの平均エラー率はわずかです平均エラー率よりも大きい場合は、それをより適切に行う方法を説明する必要があります。
1つ目:2次形式を使用すると、効果は最初の場合よりも明らかに優れています。さらに改善する必要があります。3乗、4乗、5乗を使用します。
トレーニングの結果がどんどん良くなっていることを見つけるのは難しいことではありませんが、4番目と5番目のテストの結果は悪化し、5乗で不合理な結果があり、負の数が表示されます。実際、これは過剰適合です。 。
収集するデータが少なすぎることを前述しましたが、現在は大量のデータを収集しています。上記の作業が無駄に見えることは難しくありません。単純な線形関係ではありません。また、それらの分布は次のようになります。それらのタイプにも関連しています。関連しています。つまり、彼の属性(cp)の1つだけを見るだけでは不十分です。
次の線形構造を使用して、別の処理方法があります。
0と1によると、次の方程式は理解に役立ちます
次のモデルを見つけることは、効果が上記よりも優れていることを見つけるのは難しいことではありませんが、直線の上下に他の属性を考慮する必要があるポイントがまだあります。
考えているすべての属性を入力できますが、トレーニング効果は良好で、テスト効果は非常に悪いことがわかります。別の方法を使用して調整します。
wiが小さいほど良いので、結果は滑らかになります。これは特定の数値です。
これは実験の結果です:あなたが理解できるかどうか見てください、私は書くのが面倒です
##############コードをお見せしましょう##########################
これは後で追加されるコードです
##李弘毅线性回归模型demo
#y_data = b + w*x_data
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
x_data = [338.,333.,328.,207.,226.,25.,179.,60.,208.,606.]
y_data = [640.,633.,619.,393.,428.,27.,193.,66.,226.,1591.]
b = -120
w = -4
lr = 1##学习率//这个是添加lr_b,lr_w之后随意设置的
iteration = 100000###迭代次数
##求值过程之中b,w的保存用于画图
b_history = [b]
w_history = [w]
############添加lr_b,lr_w效果更好一些,这涉及到一个方法以后会写
lr_b = 0.0
lr_w = 0.0
############
for i in range(iteration):
##偏导
b_grad = 0.0;
w_grad = 0.0;
for n in range(len(x_data)):
b_grad = b_grad-2.0*(y_data[n]-b-w*x_data[n])*1.0
w_grad = w_grad-2.0*(y_data[n]-b-w*x_data[n])*x_data[n]
#################################
lr_b = lr_b + b_grad ** 2
lr_w = lr_w + w_grad ** 2
################################
##更新b,w的值 b0->b1 w0->w1
b = b - lr/(np.sqrt(lr_b))*b_grad
w = w - lr/(np.sqrt(lr_w))*w_grad
##将数据保存,用于画图
b_history.append(b)
w_history.append(w)
#################作图准备工作########################
x = np.arange(-200,-100,1)##bias
y = np.arange(-5,5,0.1)##weight
Z =np.zeros((len(x),len(y)))
X,Y = np.meshgrid(x,y)
for i in range(len(x)):
for j in range(len(y)):
b= x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] -b -w*x_data[n])**2
Z[j][i] = Z[j][i]/len(x_data)
###########################作图###########################
plt.contourf(x,y,Z,50,alpha=0.5,cmap=plt.get_cmap('jet'))
plt.plot([-188.4],[2.67],'x',ms=12,markeredgewidth=3,color='orange')
plt.plot(b_history,w_history,'o-',ms=3,lw=1.5,color='black')
plt.xlim(-200,-100)
plt.ylim(-5,5)
plt.xlabel(r'$b$',fontsize=16)
plt.ylabel(r'$w$',fontsize=16)
plt.show()
効果画像: