機械学習のpython - パーセプトロン

最近の研究に関連する機械を見て、書籍、日々の共有に部分を読んで書き出す方法、一緒に学ぶ一緒に進行状況を議論します!機械学習の最初のブログとして、私は、その後、徐々に他のコンテンツを更新している感覚から開始する準備ができています。

認識アルゴリズムを実装する前に、我々は他の神経の元からの情報を受信して​​細胞に運ばすることができ、多くの神経細胞の樹状突起と軸索、樹状突起(樹状突起)が存在する神経細胞(ニューロン)作品を見てする必要があります本体(細胞核)、軸索(軸索)情報は、他のニューロンに細胞体から送信されても​​よいです。デンドライト情報算出処理を通過した後、結果がある閾値を超えた場合、それは他のニューロンの軸索に信号を送信し、体細胞で行います。これは、学習アルゴリズムパーセプトロンを作成したプロセスを、理解することによって仕事をするニューロン。

パーセプトロンは、それがフィードフォワードニューラルネットワークの最も単純な形として見られ、本発明のコーネル研究所で働いていた1975年の人工ニューラルネットワークフランク・ローゼンブラットあるバイナリ線形分類器、不十分その直線切っても切れない問題に処理することはできません。

次の図に示す三つの異なるケースは、直線状に左の二つは使用されてもよい(すなわち、線形関数)を別々に、即ち線形分離;直線不可分のために、別々に使用することができない中間および線形関数による権利。

データセットの花に含まれている私たちはいくつかの機能に応じて分類する必要があり、私たちは直接、私たちは今、分類を過ごすために必要があるとし、例を見て2つの花のデータセットは、それぞれ1と表記があると-1、どこのみ前記2つの花、萼片および花弁の長さ、すなわち長さは、2つの特徴ベクトルは、によって表される:
\ [X = \ {bmatrix開始X_1} \\ X_2 \ bmatrix終了{} \]
Xも呼ばれる入力ベクトルは、我々は次いで、対応する定義重みベクトルを W:
\ [W = \開始{bmatrix} W_1 \\ W_2 \終了{bmatrix} \]
Zの後に得られたwの組み合わせリニアX:
\ [Z = w_1x_1 + w_2x_2 \]
我々は仮定試料は、事前に閾値Bのセットよりも大きいZの活性値と等しい場合には、我々はそれ以外の場合は、クラスに属し、このサンプルはクラス1に属する言う-1、として表現式は、以下:
\ [\ファイ(Z)= \ケースは、{1}を始めます\クワッドZ \ GE Bを\\\\ -
1、\クワッドさもなければ\端{ケース} \]は、 このアイデアは非常に類似しており、神経細胞機能していることが分かります。便宜のために、我々は、左右のパラメータの上式の閾値Bに移動する場所-bに追加の重量を定義し、Zは次式に更新される:
\ [+ Z = w_0x_0 w_2x_2 w_1x_1 + \]
次に、式は以下のz以下でありますケースを得ることができる前に、Zが閾値bに等しいより大きい場合には0と等価である:
。\ [\ファイ(Z)= \ケース} {開始1、\クワッドZ \ GE0 \\\\ - 1、\クワッドそうでなければ\端{ケース} \]
上記の機能はまた、活性化関数と呼ばれ、zは即ち、機能を活性化することによりバイナリ出力(1、-1)に圧縮されます。

分類が正確であると判断しwは私たちは、その後どのように我々はそれwは右重みベクトルを選択するか、重みベクトルを見ることができますか?作業負荷が大きすぎると非効率的であるように、我々は、実際には、パーセプトロンは、自動的にトレーニング進行すると、Wの変化が安定し、分類精度が大幅に意志、wはサンプルデータセットを調整することができ、ワット割り当てを与えることができません増加。

我々は、式wは重みベクトルを更新:
\ [w_j = w_j + \デルタw_j \の】

\ [\デルタw_j = \ ETA(S ^ I- \ハット^ {Y} I)X ^ i_j \]

\ [\ Eta-学習率\\ w_j-W j番目の特徴ベクトル\\ Y ^ I- i番目のカテゴリの実サンプル\\\ハット{Y ^ iは} - 予測クラスi番目のサンプル\\ J番目の特徴のX - jが^ I-i番目のサンプル\]

同期パラメータの各々に重みwベクトル、wは更新の程度を制御するための0.0と1.0の間の範囲の学習速度は、各パラメータについてのみ更新の大きさ、すなわち、更新されている、請求だけwを算出します我々は徐々に分類精度を向上させるために、ワット更新にサンプルデータセットを訓練の多くを使用し、X、Wの値を変更します。

リニア型知覚アルゴリズム少ない学習率と分離ケース収束を確保するために、トレーニングサンプルは、パーセプトロンXを受けWおよびXは、として分類結果を生成するために活性化するために、Zに結合するリニアZ伝達関数を与えますこのような収束ともトレーニングを完了パーセプトロン、wは予測カテゴリサンプルは、その後、更新に更新された規則に従ってにおいて、X。

その後、我々は認識アルゴリズムを実現するために始めたとアイリスデータセットのトレーニングを使用しています。

import pandas as pd

データセットを読みます

df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
df.tail()
0 1 2 3 4
145 6.7 3.0 5.2 2.3 アイリス-virginicaの
146 6.3 2.5 5.0 1.9 アイリス-virginicaの
147 6.5 3.0 5.2 2.0 アイリス-virginicaの
148 6.2 3.4 5.4 2.3 アイリス-virginicaの
149 5.9 3.0 5.1 1.8 アイリス-virginicaの

上記の表から、入力ベクトルxの各々は、4つの機能(0,1,2,3)と適切なカテゴリ(4)を含んでいることがわかります

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

その入力カテゴリ「アイリスsetosa」は、それが-1に設定されている場合、前のベクトルカテゴリに運ば100個のトレーニングサンプルは、そうでない場合は1に設定されています

y = df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)

最初の100個の訓練サンプルの最初の二つの固有ベクトルを削除します

X = df.iloc[0:100, [0, 2]].values

訓練サンプルの100クラスの分布を描きます

plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor')
plt.xlabel('petal length')
plt.ylabel('sepal length')
plt.legend(loc='upper left')
plt.show()

パーセプトロンを実装

import numpy as np

class Perceptron(object):
    """Perceptron 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, where n_samples is the number of samples and
        n_features is the number of features.
        :param y: array-like, shape=[n_samples]
        Target values.
        :return:
        self:object

        """

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

        for _ in range(self.n_iter):
            errors = 0
            for xi, target in zip(X, y):
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update != 0.0)
            self.errors_.append(errors)
        return self

    def net_input(self, X):
        """Calculate net input"""
        return np.dot(X, self.w_[1:]) + self.w_[0]

    def predict(self, X):
        """Return class label after unit step"""
        return np.where(self.net_input(X) >= 0.0, 1, -1) #analoge ? :n in C++

ppn = Perceptron(eta = 0.1, n_iter = 10)
ppn.fit(X, y)
<__main__.Perceptron at 0x16680906978>

トレーニング曲線を描きます

plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker = 'o')
plt.xlabel('Epoches')
plt.ylabel('Number of misclassifications')
plt.show()

分割線を引きます

from matplotlib.colors import ListedColormap
def plot_decision_region(X, y, classifier, resolution=0.02):
    # setup marker generator and color map
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    
    # plot the decision surface
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 0].max() + 1
    
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                          np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())
    
    #plot class samples
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
                   alpha=0.8, c=cmap(idx), marker = markers[idx],
                   label=cl)
plot_decision_region(X, y, classifier=ppn)
plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')
plt.show()

参考:

https://www.toutiao.com/a6669391886744027662/
https://zh.wikipedia.org/wiki/%E6%84%9F%E7%9F%A5%E5%99%A8

おすすめ

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