自適應線性神經元(Adline)


自適應線性神經元(Adline)

2019-08-26

 Adline算法屬性:監督算法,分類算法

1.算法框架

1.1凈輸入函數

 凈輸入函數:

 $z = w_{0}x_{0} + w_{1}x_{1} + ··· +w_{n}x_{n}={\sum_{j=0}^{n}}w_{j}x_{j}=w^{T}x$

其中x0的值為1,是函數的偏移量;在實際程序中可以使用兩種方式實現凈輸入函數:

1)在訓練數據X中添加值全部為1的列,作為偏移量的乘子;

2)將參數W中的第一個w0單獨提出來另算

用python實現,這里使用第二種方式

#凈輸入函數
def net_input(x,w):
    return np.dot(x,w[1:]) + w[0]

1.2激勵函數

Adline算法的激勵函數使用恆等函數,即:

$\phi(z)=z$

1.3量化器

$y=\left\{\begin{matrix}
1,\phi(z)\geq 0\\
-1,\phi(z)< 0
\end{matrix}\right.$

 使用python實現:

#量化器
def quantization(z):
    return np.where(z >= 0.0,1,-1)

 

2.代價函數

代價函數一般是為了反映模型與測試數據的擬合程度,

這里使用誤差平方和(SSE)作為Logistic Regression算法的代價函數:

$J(w) = \frac{1}{2} \sum_{i}(y^{(i)}-\phi(z^{(i)}))^{2}$

使用python實現:

#代價函數
#predict是數據的預測值,y是數據的實際值
def cost_function(predict,y):
    return ((y - predict)**2).sum() / 2.0

 

3.優化算法

gradient descent:

代價函數滿足1)可導,2)凸函數,才適合使用梯度下降法;

梯度下降法是基於代價函數J(w)沿着其梯度(即導數)方向做一次權重更新:

$w:=w+\Delta w$

$\Delta w = -\eta \frac{\partial J}{\partial w}$

$\frac{\partial J}{\partial w_{j}}=-\sum_{i}^{n}(y^{(i)}-\phi (z^{(i)}))x^{(i)}_{j}$

 其中$-\eta$ 表示梯度下降法的學習速率,$x^{(i)}_{j}$代表第i個數據的第j個值。

 由於每次權重迭代都是居於全部的測試數據,故此算法也稱為“批量梯度下降法”(batch gradient descent);

 

4.權重迭代停止條件

1)設置一個最大迭代次數

2)設置一個代價函數的閾值,當某次訓練中實際得出的代價函數低於閾值時停止迭代

主要靠經驗獲取這兩個條件。

 

5.數據的標准化

按照每一列單獨處理的方式,將每一列數據轉換為方差為1,均值為0 的數據;數據標准化后訓練過程比較容易收斂。

$x^{'}_{j}=\frac{x_{j}-u_{j}}{\sigma _{j}}$

用python實現:

#數據標准化
def standard(X):
    X_std = np.copy(X)
    m,n = X_std.shape

    for i in range(n):
        X_std[:,i] = (X[:,i] - (X[:,i].mean()) / X[:,i].std()
    
    return X_std

 

6.以鳶尾花數據實現的Adline算法

'''自適應神經元,用於分類
Version = V.0.0'''

import numpy as np

class AdlineGD(object):
    """AdlineGD Classifier"""
    def __init__(self,eta=0.01,n_iter=50):
        self.eta = eta
        self.n_iter = n_iter

    #訓練函數
    def fit(self,X,y):
        self.w_ = np.zeros(X.shape[1])
        self.b_ = np.zeros(1)
        self.cost_ = []

        for _ in range(self.n_iter):
            output = self.net_input(X)
            errors = y - output
            cost = (errors**2).sum()/2.0
            self.cost_.append(cost)
            self.w_ += self.eta * np.dot(X.T,errors)
            self.b_ += self.eta * errors.sum()
        return self


    #神經元輸出
    def net_input(self,x):
        return np.dot(x,self.w_) + self.b_

    #激活函數
    def activation(self,x):
        return self.net_input(x)

    #預測函數
    def predict(self,x):
        return np.where(self.activation(x) > 0.0,1,-1)
View Code

 

更多內容可參考:github地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM