关于感知机原始算法
''' @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 # 返回模型参数
浙公网安备 33010602011771号