python實(shí)現(xiàn)多層感知器MLP(基于雙月數(shù)據(jù)集)
本文實(shí)例為大家分享了python實(shí)現(xiàn)多層感知器MLP的具體代碼,供大家參考,具體內(nèi)容如下
1、加載必要的庫(kù),生成數(shù)據(jù)集
import math
import random
import matplotlib.pyplot as plt
import numpy as np
class moon_data_class(object):
def __init__(self,N,d,r,w):
self.N=N
self.w=w
self.d=d
self.r=r
def sgn(self,x):
if(x>0):
return 1;
else:
return -1;
def sig(self,x):
return 1.0/(1+np.exp(x))
def dbmoon(self):
N1 = 10*self.N
N = self.N
r = self.r
w2 = self.w/2
d = self.d
done = True
data = np.empty(0)
while done:
#generate Rectangular data
tmp_x = 2*(r+w2)*(np.random.random([N1, 1])-0.5)
tmp_y = (r+w2)*np.random.random([N1, 1])
tmp = np.concatenate((tmp_x, tmp_y), axis=1)
tmp_ds = np.sqrt(tmp_x*tmp_x + tmp_y*tmp_y)
#generate double moon data ---upper
idx = np.logical_and(tmp_ds > (r-w2), tmp_ds < (r+w2))
idx = (idx.nonzero())[0]
if data.shape[0] == 0:
data = tmp.take(idx, axis=0)
else:
data = np.concatenate((data, tmp.take(idx, axis=0)), axis=0)
if data.shape[0] >= N:
done = False
#print (data)
db_moon = data[0:N, :]
#print (db_moon)
#generate double moon data ----down
data_t = np.empty([N, 2])
data_t[:, 0] = data[0:N, 0] + r
data_t[:, 1] = -data[0:N, 1] - d
db_moon = np.concatenate((db_moon, data_t), axis=0)
return db_moon
2、定義激活函數(shù)
def rand(a,b): return (b-a)* random.random()+a def sigmoid(x): #return np.tanh(-2.0*x) return 1.0/(1.0+math.exp(-x)) def sigmoid_derivate(x): #return -2.0*(1.0-np.tanh(-2.0*x)*np.tanh(-2.0*x)) return x*(1-x) #sigmoid函數(shù)的導(dǎo)數(shù)
3、定義神經(jīng)網(wǎng)絡(luò)
class BP_NET(object):
def __init__(self):
self.input_n = 0
self.hidden_n = 0
self.output_n = 0
self.input_cells = []
self.bias_input_n = []
self.bias_output = []
self.hidden_cells = []
self.output_cells = []
self.input_weights = []
self.output_weights = []
self.input_correction = []
self.output_correction = []
def setup(self, ni,nh,no):
self.input_n = ni+1#輸入層+偏置項(xiàng)
self.hidden_n = nh
self.output_n = no
self.input_cells = [1.0]*self.input_n
self.hidden_cells = [1.0]*self.hidden_n
self.output_cells = [1.0]*self.output_n
self.input_weights = make_matrix(self.input_n,self.hidden_n)
self.output_weights = make_matrix(self.hidden_n,self.output_n)
for i in range(self.input_n):
for h in range(self.hidden_n):
self.input_weights[i][h] = rand(-0.2,0.2)
for h in range(self.hidden_n):
for o in range(self.output_n):
self.output_weights[h][o] = rand(-2.0,2.0)
self.input_correction = make_matrix(self.input_n , self.hidden_n)
self.output_correction = make_matrix(self.hidden_n,self.output_n)
def predict(self,inputs):
for i in range(self.input_n-1):
self.input_cells[i] = inputs[i]
for j in range(self.hidden_n):
total = 0.0
for i in range(self.input_n):
total += self.input_cells[i] * self.input_weights[i][j]
self.hidden_cells[j] = sigmoid(total)
for k in range(self.output_n):
total = 0.0
for j in range(self.hidden_n):
total+= self.hidden_cells[j]*self.output_weights[j][k]# + self.bias_output[k]
self.output_cells[k] = sigmoid(total)
return self.output_cells[:]
def back_propagate(self, case,label,learn,correct):
#計(jì)算得到輸出output_cells
self.predict(case)
output_deltas = [0.0]*self.output_n
error = 0.0
#計(jì)算誤差 = 期望輸出-實(shí)際輸出
for o in range(self.output_n):
error = label[o] - self.output_cells[o] #正確結(jié)果和預(yù)測(cè)結(jié)果的誤差:0,1,-1
output_deltas[o]= sigmoid_derivate(self.output_cells[o])*error#誤差穩(wěn)定在0~1內(nèi)
hidden_deltas = [0.0] * self.hidden_n
for j in range(self.hidden_n):
error = 0.0
for k in range(self.output_n):
error+= output_deltas[k]*self.output_weights[j][k]
hidden_deltas[j] = sigmoid_derivate(self.hidden_cells[j])*error
for h in range(self.hidden_n):
for o in range(self.output_n):
change = output_deltas[o]*self.hidden_cells[h]
#調(diào)整權(quán)重:上一層每個(gè)節(jié)點(diǎn)的權(quán)重學(xué)習(xí)*變化+矯正率
self.output_weights[h][o] += learn*change
#更新輸入->隱藏層的權(quán)重
for i in range(self.input_n):
for h in range(self.hidden_n):
change = hidden_deltas[h]*self.input_cells[i]
self.input_weights[i][h] += learn*change
error = 0
for o in range(len(label)):
for k in range(self.output_n):
error+= 0.5*(label[o] - self.output_cells[k])**2
return error
def train(self,cases,labels, limit, learn,correct=0.1):
for i in range(limit):
error = 0.0
# learn = le.arn_speed_start /float(i+1)
for j in range(len(cases)):
case = cases[j]
label = labels[j]
error+= self.back_propagate(case, label, learn,correct)
if((i+1)%500==0):
print("error:",error)
def test(self): #學(xué)習(xí)異或
N = 200
d = -4
r = 10
width = 6
data_source = moon_data_class(N, d, r, width)
data = data_source.dbmoon()
# x0 = [1 for x in range(1,401)]
input_cells = np.array([np.reshape(data[0:2*N, 0], len(data)), np.reshape(data[0:2*N, 1], len(data))]).transpose()
labels_pre = [[1.0] for y in range(1, 201)]
labels_pos = [[0.0] for y in range(1, 201)]
labels=labels_pre+labels_pos
self.setup(2,5,1) #初始化神經(jīng)網(wǎng)絡(luò):輸入層,隱藏層,輸出層元素個(gè)數(shù)
self.train(input_cells,labels,2000,0.05,0.1) #可以更改
test_x = []
test_y = []
test_p = []
y_p_old = 0
for x in np.arange(-15.,25.,0.1):
for y in np.arange(-10.,10.,0.1):
y_p =self.predict(np.array([x, y]))
if(y_p_old <0.5 and y_p[0] > 0.5):
test_x.append(x)
test_y.append(y)
test_p.append([y_p_old,y_p[0]])
y_p_old = y_p[0]
#畫決策邊界
plt.plot( test_x, test_y, 'g--')
plt.plot(data[0:N, 0], data[0:N, 1], 'r*', data[N:2*N, 0], data[N:2*N, 1], 'b*')
plt.show()
if __name__ == '__main__':
nn = BP_NET()
nn.test()
4、運(yùn)行結(jié)果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python?Pandas輕松實(shí)現(xiàn)數(shù)據(jù)清理
在當(dāng)今的數(shù)據(jù)驅(qū)動(dòng)時(shí)代,數(shù)據(jù)清理是數(shù)據(jù)分析、機(jī)器學(xué)習(xí)項(xiàng)目中至關(guān)重要的一步,本文將帶大家輕松上手使用Python和Pandas進(jìn)行數(shù)據(jù)清理,希望對(duì)大家有所幫助2024-12-12
Python計(jì)算兩個(gè)矩形重合面積代碼實(shí)例
這篇文章主要介紹了Python 實(shí)現(xiàn)兩個(gè)矩形重合面積代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
python環(huán)境路徑配置以及命令行運(yùn)行腳本
這篇文章主要為大家詳細(xì)介紹了python環(huán)境路徑配置以及命令行運(yùn)行腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
跟老齊學(xué)Python之關(guān)于循環(huán)的小伎倆
不管是while還是for,所發(fā)起的循環(huán),在python編程中是經(jīng)常被用到的。特別是for,一般認(rèn)為,它要比while快,而且也容易寫(是否容易,可能因人而異,但是,執(zhí)行時(shí)間快,是的確的),因此在實(shí)踐中,for用的比較多點(diǎn)。2014-10-10
關(guān)于python爬蟲模塊urllib庫(kù)詳解
這篇文章主要介紹了關(guān)于python爬蟲模塊urllib庫(kù)詳解,學(xué)習(xí)爬蟲,最初的操作便是模擬瀏覽器向服務(wù)端發(fā)出請(qǐng)求,這里我們就學(xué)習(xí)使用urlib庫(kù)的用法,需要的朋友可以參考下2023-07-07
使用 PyTorch 實(shí)現(xiàn) MLP 并在 MNIST 數(shù)據(jù)集上驗(yàn)證方式
今天小編就為大家分享一篇使用 PyTorch 實(shí)現(xiàn) MLP 并在 MNIST 數(shù)據(jù)集上驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python爬蟲請(qǐng)求模塊Urllib及Requests庫(kù)安裝使用教程
requests和urllib都是Python中常用的HTTP請(qǐng)求庫(kù),使用時(shí)需要根據(jù)實(shí)際情況選擇,如果要求使用簡(jiǎn)單、功能完善、性能高的HTTP請(qǐng)求庫(kù),可以選擇requests,如果需要兼容性更好、功能更加靈活的HTTP請(qǐng)求庫(kù),可以選擇urllib2023-11-11

