4.パーセプトロン

1.パーセプトロン

パーセプトロンは2クラスの線形分類モデルです。私が理解している限り、「線形回帰」に類似した超平面を見つけ、すべてのインスタンスを2つのカテゴリに分割し、勾配降下最適化アルゴリズムを使用して誤分類ポイントを最小限に抑えます。誤分類ポイントが超平面に近いほど、損失値は小さくなります

1.1パーセプトロンモデル

パーセプトロンモデル
どこに署名するs i g nシンボリック関数。つまり、
サイン関数
パーセプトロンモデルは最初にw ∗ x + bw * x + bを変換できます。wバツ+bは線形モデルと見なされます。ここで、wは重みベクトル、bはバイアスです。次に、線形モデル出力の結果を符号signに代入しますSI G Nシンボリック関数、対応するカテゴリが出力されます。

1.2学習戦略

損失関数:超平面への誤分類点(wx + b = 0 wx + b = 0w x+b=0)合計距離。

次に、任意の点から超平面までの距離は次のとおりです。

ここに画像の説明を挿入
ここで∣ ∣ w ∣ ∣ || w ||w wwwl 2 l_2l2ノルム。

なぜなら、誤分類ポイントについては:

ここに画像の説明を挿入
したがって、誤って分類された点から超平面
ここに画像の説明を挿入
までの距離は次のとおりです。したがって、すべての誤って分類された点から超平面までの合計距離は次のようになります。

ここに画像の説明を挿入
ここでは考慮しません1 ∣ ∣ w ∣ ∣ \ frac {1} {|| w ||}w 1、それで、
ここに画像の説明を挿入
必要な損失関数を取得しました:したがって、損失関数を最小化し、勾配降下法を使用して、モデルに必要な最適なパラメーターを取得する必要があります。

2.パーセプトロンプリミティブモード

勾配降下法の詳細についてはあまり説明しません。ここでは、モデルの損失関数値を最小化して、モデルパラメーター "w、b"を取得する必要があります。次に、損失関数式の偏微分を取得するだけでよく、勾配降下法と以下に従ってください。アルゴリズムはモデルの最適なパラメーターを見つけます。
ここに画像の説明を挿入

2.1オリジナルモードアルゴリズムの実装

# 感知机算法实现
import numpy as np
import time
# 定义时间装饰器
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        stop_time = time.time()
        print('Func %s,run time :%s' %(func.__name__,stop_time-start_time))
        return res
    return wrapper

class Perceptron:
    def __init__(self):
        self.weights=None
        self.bias=None

    def sign(self,value):
        return 1 if value>=0 else -1
    @timmer
    def train(self,dataSet,labels,iter=50):
        # 学习率
        lr=0.9
        dataSet = np.array(dataSet)
        n,m = np.shape(dataSet)

        # 初始化参数
        w = np.zeros(m)
        b=0

        # 迭代
        for k in range(iter):
            print("Round{0}:{1}".format(k,iter))
            # 使用随机梯度下降
            for i in range(n):
                if (-labels[i]*self.sign(np.dot(w,dataSet[i])+b)>=0):
                    w=w+lr*labels[i]*dataSet[i]
                    b=b+lr*labels[i]
        self.weights=w
        self.bias=b

    def predict(self, data):
        if (self.weights is not None and self.bias is not None):
            return self.sign(np.dot(self.weights, data) + self.bias)
        else:
            return 0

if __name__ == '__main__':
    data_set = [[3, 3],
                [4, 3],
                [1, 1]]
    labels = [1, 1, -1]

    perceptron = Perceptron()
    perceptron.train(data_set, labels,30)
    print("weights is:", perceptron.weights)
    print("bias is:", perceptron.bias)
    result = perceptron.predict([3, 3])
    print("prediction:", result)

おすすめ

転載: blog.csdn.net/weixin_41044112/article/details/108513620