最近打算学习下深度学习,先从感知机看起,感觉感知机这个算法不是特别的难,但是从学习感知机算法我学习到了很多的东西,最主要就是代码的整洁性,以前也遇到过些的很漂亮的代码,一直没怎么注意,反正我自己写代码都是实现就可以了,能用一个函数解决的,绝对不多用,就导致我写的代码基本上就是过两天我也看不懂了。我决定最近要把以前学习的机器学习的算法也按照这样的格式整理出来。加深下自己的印象顺便提提升下自己的写代码的能力。
感知机这个算法不是特别的难,可以用来处理线性可分二分类问题,如果不可分的话感知机就没办法了,甚至它不像其他处理线性问题的算法一样,别的处理线性问题的算法在处理非线性问题时,虽然效果不好但是会收敛于某个值。感知机不同,对于非线性二分类问题,它是震荡的,所以导致了感知机基本不怎么用,但是是感知机的出现才有了以后的神经网络,深度学习才得以发展,所以学习感知机可以让我们更好的去理解神经网络。
import numpy as np
class ganzhiji():
'''感知机算法
by xz'''
def __init__(self,lr,freq):
'''初始化:
lr: 学习率
freq: 迭代频次
'''
self.lr=lr
self.freq=freq
def step(self,X):
'''np.where(a,b,c) if a:b
else: c
'''
return np.where(X>=0,1,0)
def fit(self,X,y):
'''X:特征矩阵,类数组类型
y:类别 '''
self.w_=np.zeros(X.shape[1]+1)
X=np.array(X)
y=np.array(y)
for i in range(self.freq):
error=0
for x,y1 in zip(X,y):
out1=np.dot(x,self.w_[0:-1])+self.w_[-1]
y_predict=self.step(out1)
#
####调整权重
self.w_[0:-1]+=self.lr*x*(y1-y_predict)
####调整偏置
self.w_[-1]+=self.lr*(y1-y_predict)
return self.w_
def predict(self,X):
X=np.array(X)
return self.step(np.dot(X,self.w_[0:-1])+self.w_[-1])
train_data=[[0,0,0],[0,1,0],[1,0,1],[1,1,1]]
train_data=np.array(train_data)
train_X=train_data[:,0:2]
train_y=train_data[:,2]