編譯環境使用的是anaconda,應用的是python語言
軟件包的下載:https://mirrors.tuna.tsinghua.edu.cn/
安裝後進入:
Environment-->root-->open with Jupyter NoteBook-->彈出網頁-->new-->python
然後進行代碼編寫(代碼是根據教學視頻中的代碼給出的)
import numpy as np
class Perceptron(object):
"""
實現感知器的類
eta:學習率
n_iter:權重向量的訓練次數
w_:神經分叉權重向量
errors_:用於記錄神經元判斷出錯次數
def _int:爲初始化函數
"""
def _int_(self, eta = 0.01, n_iter=10):
self.eta=eta;
self.n_iter=n_iter
pass
def fit(self,X,y):
"""
1.fit方法是爲輸入訓練數據,培訓神經元
2.其中X是電信號向量,即輸入樣本向量
3.y:每一個樣本所屬於的分類
4.每一個X都有一個shape屬性,是對X向量的描述
X:shape(n_samples,n_features)
其中n_samples是指X中有多少個輸入的樣本量
n_features這個分叉輸入的電信號有多少個,比如神經元有三個分叉,則這個神經元
可以接受三個輸入電信號
eg:x:[[1,2,3],[4,5,6]]
n_samples:2
n_features:3
y:[1,-1]表示[1,2,3]屬於分類1,[4,5,6]屬於分類-1
1.初始化權重向量爲0
2.np.zero:數學庫,初始化分量全是0的一個向量
3.其中X.shape[1]爲X.shape中的n_samples的值即爲2
4.爲什麼np.zero中要+1,是對應閾值中的對應的w0,(步調函數的閾值)
5.self.errors_表示記錄錯誤的次數
"""
self.w_=np.zero(1+X.shape[1]);
self.errors_=[]
"""
進入訓練的過程,訓練n_iter,如果嘗試了n_iter次都是錯誤的,則終止訓練
"""
for _ in range(self.n_iter):
errors=0
"""
1. X:[[1,2,3],[4,5,6]] y:[1,-1]
2.zip(X,y) = [[1,2,3,1],[4,5,6,-1]]
3.for中運用權值更新算法
update=η*(y-y'),η是學習率,y是電信號的向量分類,y'是計算出來的分類
y'是對應predict所調用出來的結果
"""
for xi,target in zip(X,y):
update = self.eta * (target - self.predict(xi))
"""
1.xi是向量,update是常量
update * xi等價於:
▽w(1)=X[1]*update,▽w(2)=X[2]*update,▽w(3)=X[3]*update
self.w[1:] +=等價於:
把原來的權重分量全部加上增加的分量▽w(1),▽w(2),▽w(3)
self.w[1:]等價於
是從1開始,忽略0元素,即忽略掉0
這樣就可以更新每一個神經分叉進行更新
"""
self.w[1:] += update * xi
"""
更新閾值w0,然後統計判斷錯誤的次數,如果錯誤次數越來越少,學習效果
越來越好,對新數據的判斷越來越準確
如果判斷正確,則y-y'=0,則target - self.predict(xi)=0
"""
self.w_[0] += update;
errors += int(update !=0.0)
self.errors_.append(errors)
pass
pass
"""
1.當神經元接受信號的時候會將接受的數據弱化,通過向量的點積運算來進行弱化
2.np.dot做點積,其中權重向量就是進行弱化的那個向量
3.z=w0*1+w1*x1+w2*x2+...+xn*wn
如果z<0則輸入的x屬於電信號-1
"""
def net_input(self,X):
return np.dot(X,self.w_[1:])+self.w_[0]
pass
def predict(self,X):
return np.where(self.net_input(X) >= 0.0 , 1,-1)
pass
pass
import numpy as np
class Perceptron(object):
def _int_(self, eta = 0.01, n_iter=10):
self.eta=eta;
self.n_iter=n_iter
pass
def fit(self,X,y):
self.w_=np.zero(1+X.shape[1]);
self.errors_=[]
for _ in range(self.n_iter):
errors=0
for xi,target in zip(X,y):
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update;
errors += int(update !=0.0)
self.errors_.append(errors)
pass
pass
def net_input(self,X):
return np.dot(X,self.w_[1:])+self.w_[0]
pass
def predict(self,X):
return np.where(self.net_input(X) >= 0.0 , 1,-1)
pass
pass
以上代碼是構建神經元的學習基本模型
通過將大量數據給學習模型,讓學習模型通過對大量數據進行觀察總結出相應規律
根據數據的特點不斷的調節神經元的權重數值,當神經元的權重數值調節到合適範圍之後,就可以利用訓練後的模型
去對新的數據進行運算,通過運算結果就能準確對新的數據進行分類和預測
pandas是python中的提供的非常強大的數據讀取類庫
header=None是因爲csv數據中第一行往往不是一個數據,往往是用來說明下面一些數據的信息的,但代碼中file中第一行就是數據,所以設置文件頭爲None
file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)
運行結果:
關於CSV文件問題:(該段摘自某網友的回答)
file
= 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)
1.網址是文件的原地址,數據是可以直接從網址上拔下來的。
2.如果運行以上代碼csv的文件,網站只能下載txt需要下載txt後轉化成csv。
以上運行結果一致。