关于感知机原始算法

'''
@Project :numpy_test 
@Env    :Python 3.8
@Author  :摩羯
@Date    :2020/10/12 20:58 
'''

import numpy

'''
感知机原始算法 version:1.0
参数说明:z_mat,f_mat分别是正负例列表,即分别代表y = {1, -1}
        w代表权重 b代表偏置 n代表学习率
主要判断条件:y(w*x+b) <= 0; w += nyx; b += ny; 
'''
z_mat = numpy.array([[3,3],[4,3]])
f_mat = numpy.array([[1,1]])
w,b=[0,0],0

def a(z,ws=[0,0],bs=0, err=0):
    w = ws
    b = bs
    n = 1
    de = w[0] * z[0] + w[1] * z[1] + b
    if de < 0 or de == 0:
        err += 1 # 错误标记点
        w = w + z
        b = b + n
        print(z, w, b, de)
        a(z,ws=w,bs=b,err=err)
    return {'w':w,'b':b,'err':err}

def f(z,ws=[0,0],bs=0,err=0):
    w = ws
    b = bs
    n = 1
    de = -1 * (w[0] * z[0] + w[1] * z[1] + b)
    if de < 0 or de == 0:
        err += 1
        w = w - z
        b = b - n
        print(z, w, b, de)
        f(z,ws=w,bs=b,err=err)
    return {'w': w, 'b': b, 'err':err}

# 将训练集训练到没有误差点,用errorNum标记,若不为0,则无限循环
while True:
    errorNum = 0

    for z in z_mat:
        dict = a(z, ws=w, bs=b, err=errorNum)
        w = dict['w']
        b = dict['b']
        errorNum = dict['err']

    for z in f_mat:
        dict = f(z, ws=w, bs=b, err=errorNum)
        w = dict['w']
        b = dict['b']
        errorNum = dict['err']

    if errorNum == 0:
        break

print(w,b)

值得注意的是,该算法最为重要的便是损失函数,也是经验风险函数。

不要被吓到了,就只是y(w*x+b)而已。

时至此刻,我还是没有搞懂感知机算法,但是今天耗费的这些时间,也告诉我,只有先会用,才能去搞懂原理。

 

这边给出参考的,无敌正确的代码,来源:https://blog.csdn.net/ggdhs/article/details/92803970

def vectorInnerProduct(vector1,vector2):   # 实现两个向量的內积
    result = 0
    length = len(vector1)
    for i in range(length):
        result += vector1[i] * vector2[i]
    return result
def elementAddition(vector1,vector2):    # 实现两个向量的对应元素相加
    for i in range(len(vector1)):
        vector1[i] += vector2[i]
    return vector1
def  numberMultiply(num,vector):        # 实现向量的数乘
    tempVector =  []
    for i in range(len(vector)):
        tempVector.append(vector[i] * num)
    return tempVector
    # 不能直接修改原来的vector,要不然带入到感知机的主函数会一边修改权重和偏置,
    # 一边修改原来的数据集
"""
上面三个函数,是为了方便对数据(向量)进行相关的运算,写的辅助函数。很简单
"""
def perceptron(bias,dataSet,learnRate):  
# 感知机原始算法,需要输入三个变量,偏置,数据集以及学习率。
    weightVector = [0 for i in range(len(dataSet[0][0]))]   # 权重向量初始化为0
    while True:  
    # 因为要不断遍历训练集,直到没有误分类点,因此利用一个while循环,和记录误分类点数量的变量errornum
        errorNum = 0
        for data in dataSet:  # 一遍一遍的遍历数据集,进行迭代
            if data[1] * (vectorInnerProduct(weightVector,data[0])+bias) <= 0:
                errorNum += 1
                weightVector = elementAddition(weightVector,numberMultiply(learnRate * data[1],data[0]))
                bias += learnRate * data[1]
        if errorNum == 0:  # 如果没有误分类点,退出循环
            break
    return weightVector,bias  # 返回模型参数

 

posted @ 2020-10-12 23:17  otaku-250  阅读(136)  评论(0)    收藏  举报