PLA输出【离散类别】

核心公式

h(x) = sign(∑i=1dwixi−threshold)sign(∑_{i=1}^{d}w_ix_i-threshold)sign(∑i=1d​wi​xi​−threshold)
增广形式:x0=1,w0=−threshold,h(x)=sign(wTx)x_0 = 1,w_0 = -threshold,h(x) = sign(w^Tx)x0​=1,w0​=−threshold,h(x)=sign(wTx)
其中w是权重向量,x是输入特征向量,sign是符号函数

1.PLA感知器算法

寻找最优权重w,使得损失函数lin=0l_{in}=0lin​=0

【损失函数】ℓin=[[yn≠yn^]]ℓ_{in}=[[y_n≠\hat{y_n}]]ℓin​=[[yn​=yn​^​]] 即0-1损失函数

【步骤】

  • 初始化:w0=0
  • 迭代:对于错分样本 (xn​,yn​)(x_n​,y_n​)(xn​​,yn​​),更新权重wt+1​=wt​+yn​xn​w_{t+1}​=w_t​+y_n​x_n​wt+1​​=wt​​+yn​​xn​​
  • 终止:所有样本都被正确分类或达到最大迭代次数

注意:迭代结果与样本遍历顺序相关

2.收敛性分析

【证明】线性可分情况下,PLA 经有限次迭代必收敛到正确分类面。
证明逻辑:wtw_twt​​与wfw_fwf​​方向逐步接近,且wtw_twt​​模长增长有界,迭代次数上界:T≤R2ρ2T≤\frac{R^2}{ρ^2}T≤ρ2R2​
其中R2=maxn∣∣xn∣∣2R^2=max_n||x_n||^2R2=maxn​∣∣xn​∣∣2(样本最大模长平方),ρ=minn​yn​wfT∣∣wf∣∣​​xn​ρ=min_n​y_n​\frac{w_f^T}{||w_f||}​​x_n​ρ=minn​​yn​​∣∣wf​∣∣wfT​​​​xn​​(样本最小规范间隔)​

3.Pocket算法——处理线性不可分问题

【步骤】

  • 初始化:w0​=0w_0​=0w0​​=0,口袋权重w^=w0​\hat{w}=w_0​w^=w0​​
  • 迭代更新:若wtw_twt​​错分样本,更新wt+1​=wt​+yn​xn​w_{t+1}​=w_t​+y_n​x_n​wt+1​​=wt​​+yn​​xn​​;若wt+1w_{t+1}wt+1​​错分样本数少于w^\hat ww^,则替换w^=wt+1\hat w=w_{t+1}w^=wt+1​
  • 停止条件:达到迭代次数

附录:

PLA关键代码(以二维数据为例)

# PLA算法实现
def pla_train(X, y, max_iter=1000, random_state=None):#max_iter指最大迭代次数
    n_samples, n_features = X.shape
    
    # 样本增广:第一列加1,增广后格式[1, x1, x2]
    X_augmented = np.hstack([np.ones((n_samples, 1)), X])  
    # 初始化增广权向量:维度n_features+1
    w_augmented = np.zeros(n_features + 1)  
    
    for _ in range(max_iter):
        # 寻找误分类样本
        misclassified = []
        for i in range(n_samples):
            if y[i] * np.dot(w_augmented, X_augmented[i]) <= 0:
                misclassified.append(i)
        
        # 若所有样本正确分类,停止迭代
        if not misclassified:
            print(f"PLA在第{_+1}次迭代收敛,所有样本正确分类")
            break
        
        # 随机选择一个误分类样本更新权向量
        i = np.random.choice(misclassified)
        w_augmented += y[i] * X_augmented[i]  
    
    return w_augmented


def pla_predict(X, w_augmented): # 预测函数
    n_samples = X.shape[0]
    # 预测函数增广
    X_augmented = np.hstack([np.ones((n_samples, 1)), X])
    # 决策值计算:w0*1 + w1*x1 + w2*x2
    scores = np.dot(X_augmented, w_augmented) 
    return np.where(scores >= 0, 1, -1)

更多推荐