import numpy as np
from math import exp,pow
首先Import東西進來!
class preceptron():
def __init__(self): #初始參數
self.bias = 0 #偏差
self.weights = np.array([]) #權重
# monitor
def show_weights(self): #外部監控參數用
print(self.weights)
def show_bias(self):
print(self.bias)
# math function
def Active_value(self,data): #計算激發強度(訊息*權重的加權合+偏差)
value = np.dot(self.weights,data)-self.bias
return value
def Sigmoid (self,x): #激活函數
result = 1/(1+exp(-x))
return result
def Err (self,predict,label): #誤差
return(label - predict)
def MSE (self,err): #均方誤差(Loss Function)
MSError = 0.5*pow(err,2)
return MSError
# Process control
def initalization(self,data,label,input_dim,lr): #讀資料,完全初始化
self.weights = np.zeros(input_dim)
self.bias = np.random.rand(1)
self.data = data
self.label = label
self.lr = lr
self.input_dim = input_dim
def fit(self): #開始訓練
totalLoss=0
for dat in range(data.shape[0]):
Act = self.Active_value(self.data[dat])
result = self.Sigmoid(Act)
Err = self.Err(result,self.label[dat])
Loss = self.MSE(Err)
totalLoss +=Loss #計算Loss
print("Activevalue =",Act) #印出來監控
print("result =",result)
print("Error = ",Err)
print("Loss =",Loss)
for weight in range(self.input_dim):
Gradient = (result-Err)*result*(1-result)*self.data[dat][weight] #更新權重Array
print("Gradient =",Gradient) #印出來監控
self.weights[weight] = self.weights[weight]-self.lr*Gradient #更新偏差
self.bias =self.bias-self.lr*(Err*result*(1-result))
print("==============================================") #分隔線
再來創建Preceptron的Class!
現在我們要來讀取資料了,在Sklearn的套件裡,我們可以簡單地讀入Iris的資料!
from sklearn import datasets
iris = datasets.load_iris() #讀取資料
data,label = iris["data"][:100],iris["target"][:100] #取前100
至於為什麼要取前100前一篇已經有說過囉!
我們要來開始訓練了!
先來初始化Preceptron!
model = preceptron()
再來讀入資料,設定超參數。
model.initalization(data = data,label = label,input_dim=4 ,lr = 0.1)
讀入後我們的Model就準備好可以訓練囉!
model.fit()
當然只訓練一次Model的表現可能會不怎麼樣!
我們可以用For迴圈來達到Epoch的效果。
for i in range(100):
model.fit()
就這樣啦!好好觀察Loss Function的數值,是不是會越來越小呢?
我們的ML鐵人30天就這樣完美的結束囉。