統(tǒng)計學習方法 李航 感知機模型 python sklearn 實現(xiàn) 及課后習題

  • 李航
    感知機(perception)是二分類的線性分類模型,其輸入為實例的特征向量,輸出為實例的類別,取+1和-1.感知機對應于輸入空間(特征空間)中將實例化分為正負兩類的分離超平面,為此,導入基于誤分類的損失函數,利用梯度下降法對損失函數進行極小化,求得感知機模型。感知及算法具有簡單而易于實現(xiàn)的優(yōu)點,分為原始形式和對偶形式。感知機預測是利用學習到的感知機模型對新的輸入實例進行分類。感知機1957年由Rosenblatt提出,是神經網絡和支持向量機的基礎。

  • 收斂性證明結果:
    k < (R/Y)^2 ,其中,k為誤分類次數,R為||xi||的最大值i=1,2,3...n, Y為yi(Wopt*xi + Bopt)的最小值。這個定理表明,誤分類次數是有上界的,經過有限次搜索可以找到將訓練數據完全正確分開的分離超平面,也就是說,當訓練數據集線性可分時,感知基學習算法原始形式迭代是收斂的。但是當初始值及更新樣本不定時學出來的超平面是變化的,故需要加約束條件,SVM就是加了約束條件。當訓練數據集線性不可分時,感知機學習算法不收斂,迭代結果將會發(fā)生震蕩。

  • 對偶形式
    對偶形式的基本思想,將權重w和偏置b表示為實例xi和yi的線性組合形式,通過求解其系數,從而求解最終的的w和b

  • python代碼:輔助理解感知機算法

import numpy as np

data = np.array([[3, 3], [4, 3], [1, 1]])
label = np.array([1, 1, -1])
class preceptron(object):
    def __init__(self, data,label,l=1):
        self.a = np.zeros([len(data), 1])
        self.b = 0
        self.l = 1
        self.count = 0
        self.data = data
        self.label = label

    def model(self):
        gram_matrix = self.__get_gram_matrix(self.data)
        flag = True
        index = 0
        while flag:
            index += 1
            i = index % len(self.data)
            self.__updata_wb(gram_matrix, self.label, i)
            if self.count == len(data):
                flag = False
        return np.sum(self.a * self.data, axis=0), self.b

    def __get_gram_matrix(self, data):
        return np.matmul(data, np.transpose(data))

    def __updata_wb(self, gram_matrix, label, i):

        sum = 0
        for j in range(len(self.a)):
            sum += self.a[j] * label[j] * gram_matrix[j][i]
        if label[i] * (sum  + self.b) <= 0:
            self.a[i] += self.l
            self.b += label[i]
            self.count = 0
            return self.__updata_wb(gram_matrix, label, i)
        else:
            self.count += 1
            return


w, b = preceptron(data,label).model()
print('W %s, \nb %s.\n' % (w, b))
  • sklearn代碼:所用數據為kaggle中mnist數據,將特征PCA至六維

# -*- coding: utf-8 -*-

"""
使用sklearn實現(xiàn)的感知機算法進行分類的一個實例,
使用數據集是Kaggle數字手寫體數據庫
"""



import pandas as pd

import numpy as np

from sklearn.linear_model import Perceptron
from sklearn.decomposition import PCA

import sklearn



# 加載數據集

def load_data(filename, n, mode):

    data_pd = pd.read_csv(filename)

    data = np.asarray(data_pd)

    pca = PCA(n_components=n)

    if not mode == 'test':

        dateset = pca.fit_transform(data[:, 1:])

        return dateset, data[:, 0]

    else:

        dateset = pca.fit_transform(data)

        return dateset, 1



def main(train_data_path, test_data_path, n_dim):

    train_data, train_label = load_data(train_data_path, n_dim, 'train')

    print("Train set :" + repr(len(train_data)))

    test_data, _ = load_data(test_data_path, n_dim, 'test')

    print("Test set :" + repr(len(test_data)))

    ppn = Perceptron()

    # 訓練數據集

    ppn.fit(train_data, train_label)

    # 訓練準確率

    score = ppn.score(train_data, train_label)

    print(">Training accuracy = " + repr(score))

    predictions = []

    for index in range(len(test_data)):

        # 預測

        result = ppn.predict([test_data[index]])

        predictions.append([index + 1, result[0]])

        print(">Index : %s, predicted = %s" % (index + 1, result[0]))

    columns = ['ImageId', 'Label']

    save_file = pd.DataFrame(columns=columns, data=predictions)

    save_file.to_csv('ppn.csv', index=False, encoding="utf-8")



if __name__ == ''__main__'':

    train_data_path = 'train.csv'

    test_data_path = 'test.csv'

    n_dim = 6

    main(train_data_path, test_data_path, n_dim)

課后習題

喜歡的關注點贊哈

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容