Pythonの機械学習 - ADALINE

一部は、このブログは主にADALINEにバーナード・ウィドロウと彼の博士課程のTEDD Hoff氏によって提案されたアルゴリズムや他のいくつかのトレーニングの詳細、ADALINE(Adalineと呼ばれる)に記録され、我々は認識があると言うブログパーセプトロンアルゴリズムに改善されています。

入力ベクトルxと知覚プロセスのAdalineコースが同じである、ことを除いて、バイナリ入力(1 / -1)を用いて圧縮され、次いで線形結合X Z、Z-活性化機能を与えるためにwは重みベクトルで使用されAdaline wは勾配降下法を使用して更新。

私たちの目的は、正確に分類することで、我々は我々がここでの目的関数を導入、分類結果の品質を測定する必要があるので:
\ [J(W)= \ frac12 \ n型sum_i ^(I ^ Yを-私は^ \ファイ(Z ))^ 2 \]
乗誤差のそれはまた、すべての学習サンプルの実際の値と予測値との二乗誤差を計算することができ、一般的機能の喪失と呼ばれる理由を私たちが理解できる式で、損失関数を呼び出すことができ、および(合計、SSE)は、他の意味の導出後に追加することは容易である式の前半と呼ばれます。

損失関数では、私たちのより具体的なを目指し、より小さな損失関数、最小値を取得するために、右ワット、損失関数を選択することですので、それはより良い、アルゴリズムの分類の効果を誤分類の少ない例を意味。Adaline損失関数が凸関数であるので、我々は重みベクトルwの損失関数の最小値を見つけるために、勾配降下を使用できるようにと、私たちは丘を転がり落ちたボールを想像することができます:

W初めは大きな損失関数を得ることができますが、原因の損失関数にJはWの関数であり、また、それが最小の凸関数が存在し、学んだ友人が機能を見つけるために微積分を知っている必要があります一般的なアプローチの誘導体がゼロで最も値、すなわちxが最も価値ある誘導体と、ここで勾配降下即ち導出することで解決するが、wは重みベクトルは多次元であるので、それが必要な損失関数であります各成分の偏導関数を取得し、その後、全体Wを更新するwでの偏導関数、次のように具体的に由来する:
\ [注:wはベクトルであり、w_j \\ Wは、W = Wベクトルの成分であります+ \デルタ\\\デルタW W = - \ ETA \デルタJ(W)\\\ FRAC {\部分J} {\部分w_j} = \ FRAC {\部分} {\部分w_j} \ FRAC 12 \ sum_i (Y ^ I- \ PHI(Z ^ I))^ 2 = \\ \ FRAC 12 \ FRAC {\部分} {\部分w_j} \ sum_i(Y ^ I- \ PHI(Z ^ I))^ 2 \ \ = \ FRAC 12 \ sum_i2( Y ^ I- \ PHI(Z ^ I))\ FRAC {\部分} {\部分w_j}(y ^ I- \ PHI(Z ^ I))\\ = \ sum_i( Y ^ I- \ PHI(Z ^ I))\ FRAC {\部分} {\部分w_j}(y ^ I- \ sum_i(w_j ^ ix_j ^ I))\\ = \ sum_i(Y ^ I- \ PHI (Z ^ I))( - X - jが^ I)\\ = - \ sの um_i(Y ^ I- \ PHI( Z ^ I))X - jが^ I \\ ので\デルタw_j = - \ ETA \ FRAC {\部分J} {\部分w_j} = \ ETA \ sum_i(Y ^ I- \ PHI(Z ^ I))X - jが
^ I \] は同時に更新されるベクトルw、及び使用されるすべての学習サンプルの各更新の重量成分は、勾配降下法はまた、バルク勾配として知られているように留意すべきです衰退(バッチ勾配降下)

次に、我々は特にADALINEを達成し、パーセプトロン学習ルールは非常に似ているので、ここでは、A勾配降下アルゴリズムを使用しているので、それが直接、前記の方法を変更するフィット必要性、パーセプトロンに基づいて得られた変性されています。

class AdalineGD(object):
    """ADAptive LInear NEuron classifier.

    Parameters
    ----------
    eta:float
        Learning rate(between 0.0 and 1.0
    n_iter:int
        Passes over the training dataset.

    Attributes
    ----------
    w_:1d-array
        weights after fitting.
    errors_:list
        Number of miscalssifications in every epoch.

    """

    def __init__(self, eta=0.01, n_iter=10):
        self.eta = eta
        self.n_iter = n_iter

    def fit(self, X, y):
        """Fit training data.

        :param X:{array-like}, shape=[n_samples, n_features]
        Training vectors,
        :param y: array-like, shape=[n_samples]
        Target values.
        :return:
        self:object

        """

        self.w_ = np.zeros(1 + X.shape[1]) # Add w_0
        self.cost_ = []

        for i in range(self.n_iter):
            output = self.net_input(X)
            errors = (y - output)
            self.w_[1:] += self.eta * X.T.dot(errors)
            self.w_[0] += self.eta * errors.sum()
            cost = (errors ** 2).sum() / 2.0
            self.cost_.append(cost)
        return self

    def net_input(self, X):
        """Calculate net input"""
        return np.dot(X, self.w_[1:]) + self.w_[0]
    
    def activation(self, X):
        """Computer linear activation"""
        return self.net_input(X)
    
    def predict(self, X):
        """Return class label after unit step"""
        return np.where(self.activation(X) >= 0.0, 1, -1)

異なる学習率(0.01および0.0001)トレーニング使用して、ニューロンの学習過程を観察しました。学習率は、我々は(ハイパー)スーパーパラメータそれらを呼び出す反復回数は、我々は手動で超パラメータ設定の妥当性を設定することができますどこで全体のトレーニングプロセスのために重要です。

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(8,4))
ada1 = AdalineGD(n_iter=10, eta=0.01).fit(X, y)
ax[0].plot(range(1, len(ada1.cost_) + 1), np.log10(ada1.cost_), marker='o')
ax[0].set_xlabel('Epochs')
ax[0].set_ylabel('log(Sum-squared-error)')
ax[0].set_title('Adaline - Learning rate 0.01')
ada2 = AdalineGD(n_iter=10, eta=0.0001).fit(X, y)
ax[1].plot(range(1, len(ada2.cost_) + 1), ada2.cost_, marker='o')
ax[1].set_xlabel('Epochs')
ax[1].set_ylabel('Sum-squared-error')
ax[1].set_title('Adaline - Learning rate 0.0001')
plt.show()

大きな損害を生じる、反復回数として、学習率0.0001権利を、不適切な学習速度設定を示す、反復が増加すると、エラーの数が増加するように、0.01の左の学習を見ることができます我々は大きすぎるか小さすぎる学習率が不適切であると見ることができるように増加、減少のエラーが、減少が遅すぎる、非常に遅い収束、トレーニング効率が低すぎます。

それが右から分かるように、学習率が大きすぎると、それは、アルゴリズムが収束することができないように、重みベクトルwの各勾配降下に対応する最小量をスキップするつながります。

次に、我々は、本明細書で我々は機能を標準化するために呼ばれるスケーリング動作前トレーニングのいくつかの種類を備えて、前処理データのための方法を記載し、データのすべての機能は、学習モデルまで0、分散1、速度の平均値を作るためにスケーリングすることができますおよび回避学習モデルは非常に歪んでいます。

次のように具体的な式は:
\ [^ X - jが、= \ {FRAC x_j- \ mu_j} {\ sigma_j} \]
次のように具体的に実現さ:

X_std = np.copy(X)
X_std[:, 0] = (X[:,0] - X[:,0].mean()) / X[:,0].std()
X_std[:, 1] = (X[:,1] - X[:,1].mean()) / X[:,1].std()

データの前処理が終了した後、我々はモデルのトレーニング開始します

ada = AdalineGD(n_iter=15, eta=0.01)
ada.fit(X_std, y)
plot_decision_region(X_std, y, classifier=ada)
plt.title('Adaline - Gradient Descent')
plt.xlabel('sepal length [standardized]')
plt.ylabel('petal length [standardized]')
plt.legend(loc='upper left')
plt.show()

plt.plot(range(1, len(ada.cost_) + 1), ada.cost_, marker='o')
plt.xlabel('Epoches')
plt.ylabel('Sum-squared_error')
plt.show()

研究は0.01、標準化の前に、アルゴリズムが収束しないものの、反復の数が増加し、誤差が減少するように、図から分かるように、最終的に収束するアルゴリズムを標準化しました。

おすすめ

転載: www.cnblogs.com/Dzha/p/11846125.html