python实现感知机学习算法的原始形式

感知机

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面

感知机学习算法的原始形式

输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} ,其中 x i χ = R n x_i\in\chi=R^n y i γ = { 1 , + 1 } y_i\in\gamma=\{-1,+1\} i 1 , 2 , . . . , N i-1,2,...,N ;学习率 η ( 0 < η 1 ) \eta(0<\eta\le1)
输出:w,b;感知机模型 f ( x ) = s i g n ( w x + b ) f(x)=sign(w \cdot x + b)
步骤:
(1)选取初值 w 0 , b 0 w_0,b_0
(2)在训练集中选取数据 ( x i , y i ) (x_i,y_i)
(3)判断是否误分类,如果 y i ( w x i + b ) 0 y_i(w \cdot x_i + b)\le0 :
w w + η y i x i w\gets w+\eta y_ix_i
b b + η y i b\gets b + \eta y_i
(4)转至(2),直至训练集中没有误分类点。

python实现

#感知机算法的原始形式
import pandas as pd
import numpy as np
dataSet = pd.DataFrame({'x1':[3,4,1], 'x2':[3,3,1], 'y':[1,1,-1]})
w = [0, 0]
b = 0
r = 1
lengths = 100
def perceptronOriginal(dataSet, w, b, r, lengths):
    X = dataSet.iloc[:,:-1].as_matrix()
    Y = dataSet.iloc[:,-1].as_matrix()
    W = np.array(w)
    count = 0
    while count < lengths:
        #记录对于所有X是否都没有误分类
        correctCount = 0
        for i in range(len(X)):
        	#判断是否属于误分类
            if Y[i] * (np.dot(W, X[i]) + b) <= 0:
                W = W + r * Y[i] * X[i]
                b = b + r * Y[i]
                #print('Xi:',X[i], 'Yi:',Y[i], 'W:',W, 'b:',b)
                #每次迭代更新参数后,退出循环,重新判断
                break
            else:
                correctCount += 1
        count += 1
        #所有X都正确分类后
        if correctCount == len(X):
            #print (count, W, b)
            return W, b            
        #记录迭代次数
        else:
            print (count)

猜你喜欢

转载自blog.csdn.net/longwei92/article/details/82900321
今日推荐