import numpy as np
import io
class Perceptron(object):
# 輸入節點初始化權重和偏置常數b(假設與偏置常數相乘的輸入值一直爲0)
def __init__(self, inode_num, learning_rate):
# self.inode_vec = inode_vec # 初始化輸入節點個數
self.weight = np.zeros(inode_num) # 初始化權重
self.learning_rate = learning_rate
self.bias = 0.0
#定義激活函數
def activator(self, Sum): # 返回0/1
if Sum > 0:
outcome = 1
else:
outcome = 0
return outcome
#權重更新
def train(self, inode_vec, label):
ixw = np.hstack((inode_vec * self.weight, np.array([self.bias]))) # 計算輸入與權重乘積後與偏置常數合併爲一個向量
ixw_sum = ixw.sum() # 返回計算後的元素總和
output = self.activator(ixw_sum) # 總和輸入激活函數
delta = label - output # 計算誤差
delta_weight = self.learning_rate * delta * inode_vec # 計算權重誤差
delta_bias = self.learning_rate * delta # 計算偏置常數誤差
self.weight += delta_weight # 權重更新
self.bias += delta_bias #偏置常數更新
def printout(self):
print('weight:', self.weight, 'bias:', self.bias,)
samples = io.open(r'C:\Users\john\PerceptronTest.csv','r') # 打開訓練樣本
list_samples = samples.readlines()
samples.close()
inode_num = 2
learning_rate = 0.1
n = Perceptron(inode_num, learning_rate)
iterate_num = 5 #設置迭代次數
for i in range(0,iterate_num):
for item in list_samples:
inode_vec = np.asfarray( item[:-1].split(',') )
label = inode_vec[2]
inode_vec = inode_vec[:2]
n.train(inode_vec, label)
n.printout()