㈠ 有沒有用python實現的遺傳演算法優化BP神經網路的代碼
下面是函數實現的代碼部分:
clc
clear all
close all
%% 載入神經網路的訓練樣本 測試樣本每列一個樣本 輸入P 輸出T,T是標簽
%樣本數據就是前面問題描述中列出的數據
%epochs是計算時根據輸出誤差返回調整神經元權值和閥值的次數
load data
% 初始隱層神經元個數
hiddennum=31;
% 輸入向量的最大值和最小值
threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
inputnum=size(P,1); % 輸入層神經元個數
outputnum=size(T,1); % 輸出層神經元個數
w1num=inputnum*hiddennum; % 輸入層到隱層的權值個數
w2num=outputnum*hiddennum;% 隱層到輸出層的權值個數
N=w1num+hiddennum+w2num+outputnum; %待優化的變數的個數
%% 定義遺傳演算法參數
NIND=40; %個體數目
MAXGEN=50; %最大遺傳代數
PRECI=10; %變數的二進制位數
GGAP=0.95; %代溝
px=0.7; %交叉概率
pm=0.01; %變異概率
trace=zeros(N+1,MAXGEN); %尋優結果的初始值
FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)]; %區域描述器
Chrom=crtbp(NIND,PRECI*N); %初始種群
%% 優化
gen=0; %代計數器
X=bs2rv(Chrom,FieldD); %計算初始種群的十進制轉換
ObjV=Objfun(X,P,T,hiddennum,P_test,T_test); %計算目標函數值
while gen
㈡ python可以改寫MBR嗎
肯定是可以的,你可以嘗試使用python的c擴展
一, 實驗內容
改寫bootsect.s和setup.s, 完成如下主要功能:
1, bootsect.s能夠在屏幕上列印一段提示信息"XXX is booting...", 其中XXX是你給自己的操作系統起的名字,例如LZJos、Sunix等.
2, bootsect.s能夠完成setup.s的載入, 並跳轉到setup.s開始地址執行.
3, setup.s能夠像屏幕輸出一行信息 "Now we are in SETUP"
4, setup.s能獲取至少一個基本的硬體參數(如內存參數、顯卡參數、硬碟參數等),將其存放在內存的特定地址,並輸出到屏幕上。
setup.s不再載入linux內核, 保持上述信息顯示到屏幕上即可
二, 實驗步驟
1, 完成bootsect的屏幕輸出功能
由於不需要載入linux內核,所以就不需要原始的linux代碼那麼復雜,比如: 將bootsect自身移動到0x90000處等操作,可以忽略的。
要顯示字元串,那麼字元串顯示到屏幕的哪裡呢?當然是當前游標的位置了!所以第一步就要先讀取游標的位置,這可以利用10號中斷的3號子程序來完成。要顯示字元串,可以利用10號功能的13號子程序來完成,需要注意的是一定要邊顯示字元邊移動游標,最終的游標要移動到字元串的末尾處。最後要注意用0xAA55來標記引導扇區。代碼如下:
! 文件:bootsect.s
entry _start
_start:
! 首先利用10號中斷的3號功能來讀取游標位置
mov ah,#0x03
xor bh,bh
int 0x10
! 再利用10號中斷的13號功能顯示字元串
mov cx,#50 ! 加上回車和換行,字元串一共包含50個字元,所以設置cx為50
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax ! es:bp=顯示字元串的地址
mov ax,#0x1301
int 0x10
Inf_loop:
jmp Inf_loop ! 無限循環
! msg1處放置要顯示的字元串
msg1:
.byte 13,10 ! 換行+回車
.ascii "AXF OS is booting, my name is Aixiangfei ..."
.byte 13,10,13,10 ! 兩對換行+回車
! 下面是啟動盤具有有效引導扇區的標志. 僅供BIOS中的程序載入扇區時識別使用。
! 它必須位於引導扇區的最後兩個位元組中.
.org 510
boot_flag:
.word 0xAA55 ! 引導扇區的標記就是0XAA55
編譯和運行: 進入~/oslab/linux-0.11/boot/目錄,編譯並連接:
as86 -0 -a -o bootsect.o bootsect.s
ld86 -0 -s -o bootsect bootsect.o
參數說明:-0(注意:這是數字0,不是字母O)表示生成8086的16位目標程序,-a表示生成與GNU as和ld部分兼容的代碼,-s告訴鏈接器ld86去除最後生成的可執行文件中的符號信息。
如果這兩個命令沒有任何輸出,說明編譯與鏈接都通過了。需要留意的生成的bootsect的大小是544位元組,而引導程序必須要正好佔用一個磁碟扇區,即512個位元組。造成多了32個位元組的原因是ld86產生的是Minix可執行文件格式,這樣的可執行文件處理文本段、數據段等部分以外,還包括一個Minix可執行文件頭部。所以最後必須要把這多餘的32個位元組刪掉,可以用linux自帶的工具dd來完成:
dd bs=1 if=bootsect of=Image skip=32
去掉這32個位元組後,將生成的文件拷貝到linux-0.11目錄下,並一定要命名為「Image」(注意大小寫)。然後就可以run了
程序有可能需要不斷地修改調試,為了方便,可以將上述的一系列操作寫道一個shell腳本文件 cbootsect.sh 中:
#!/bin/sh
as86 -0 -a -o bootsect.o bootsect.s
ld86 -0 -s -o bootsect bootsect.o
dd bs=1 if=bootsect of=Image skip=32
cp Image ../
../../run
運行結果:
2, setup的載入
首先要確定setup是在磁碟的0磁軌2扇區,linux 0.11中的setup佔了4個扇區,而我們最後要寫的setup顯然沒有那麼復雜,所以可以只用1個扇區就可以了。另外,由於bootsect位於0x7c00處,佔用512個位元組,所以可以將setup載入到0x7e00處。要想從磁碟中載入數據到內存,可以利用BIOS提供的13號中斷輕松完成。最後就直接用jumi指令跳轉到0x7e00處即可。對前面的bootsect.s擴展之後的完整代碼如下:
! 文件:bootsect.s
SETUPLEN = 1
SETUPSEG = 0x07e0
entry _start
_start:
! 首先利用10號中斷的3號功能來讀取游標位置
mov ah,#0x03
xor bh,bh
int 0x10
! 再利用10號中斷的13號功能顯示字元串
mov cx,#50 ! 加上回車和換行,字元串一共包含50個字元,所以設置cx為50
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax ! es:bp=顯示字元串的地址
mov ax,#0x1301
int 0x10
load_setup:
mov dx,#0x0000 ! 設置驅動器和磁頭(drive 0, head 0): 軟盤0磁頭
mov cx,#0x0002 ! 設置扇區號和磁軌(sector 2, track 0):0磁頭、0磁軌、2扇區
mov bx,#0x0200 ! 設置讀入的內存地址:BOOTSEG+address = 512,偏移512位元組
mov ax,#0x0200+SETUPLEN ! 設置讀入的扇區個數(service 2, nr of sectors),
! SETUPLEN是讀入的扇區個數,Linux 0.11設置的是4,
! 我們不需要那麼多,我們設置為1
int 0x13 ! 應用0x13號BIOS中斷讀入1個setup.s扇區
jnc ok_load_setup ! 讀入成功,跳轉到ok_load_setup: ok - continue
mov dx,#0x0000 ! 軟碟機、軟盤有問題才會執行到這里
mov ax,#0x0000 ! 否則復位軟碟機
int 0x13
j load_setup ! 重新循環,再次嘗試讀取
ok_load_setup:
jmpi 0,SETUPSEG
! msg1處放置要顯示的字元串
msg1:
.byte 13,10 ! 換行+回車
.ascii "AXF OS is booting, my name is Aixiangfei ..."
.byte 13,10,13,10 ! 兩對換行+回車
! 下面是啟動盤具有有效引導扇區的標志. 僅供BIOS中的程序載入扇區時識別使用。
! 它必須位於引導扇區的最後兩個位元組中.
.org 510
boot_flag:
.word 0xAA55 ! 引導扇區的標記就是0XAA55
3, 完成setup的屏幕輸出功能
這個很簡單,跟bootsect是一樣的。代碼如下:
! 文件:setup.s
entry _start
_start:
! 首先利用10號中斷的3號功能來讀取游標位置
mov ah,#0x03
xor bh,bh
int 0x10
! 再利用10號中斷的13號功能顯示字元串
mov cx,#26
mov bx,#0x0007
mov bp,#msg
mov ax,cs
mov es,ax
mov ax,#0x1301
int 0x10
Inf_loop:
jmp Inf_loop ! 無限循環
msg:
.byte 13,10
.ascii "Now we are in SETUP."
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
編譯和與運行:現在有兩個文件都要編譯、鏈接。一個個手工編譯,效率低下,所以藉助Makefile是最佳方式。linux 0.11中Makefile文件已經幫我們把這件事做好了。進入liux-0.11目錄後,使用命令:
$ make BootImage
但是我們發現竟然出現了錯誤:
原因:這是因為make根據Makefile的指引執行了tools/build.c,它是為生成整個內核的鏡像文件而設計的,沒考慮我們只需要bootsect.s和setup.s的情況。build.c從命令行參數得到bootsect、setup和system內核的文件名,將三者做簡單的整理後一起寫入Image。其中system是第三個參數(argv[3])。當「make all」或者「makeall」的時候,這個參數傳過來的是正確的文件名,build.c會打開它,將內容寫入Image。而「make BootImage」時,傳過來的是字元串"none"。所以,修改build.c的思路就是當argv[3]是"none"的時候,只寫bootsect和setup,忽略所有與system有關的工作,或者在該寫system的位置都寫上「0」。
修改build.c文件很簡單,只需要把第178到183這幾行代碼刪除即可!
// if ((id=open(argv[3],O_RDONLY,0))<0)
// die("Unable to open 'system'");
// if (read(id,buf,GCC_HEADER) != GCC_HEADER)
// die("Unable to read header of 'system'");
// if (((long *) buf)[5] != 0)
// die("Non-GCC header of 'system'");
run
4, 讀取硬體參數
這個部分是最復雜的了。需要列印的硬體信息有:游標位置,內存大小,磁碟的柱面數,磁頭數,每磁軌的扇區數。在這個實驗中,這些參數的信息可以保存在內存中的任意位置,在linux 0.11中,這些參數信息是被保存到了0x90000處,所以不妨跟linux 0.11一樣。
(1)獲取硬體參數
獲得游標位置信息,這個很簡單,只需要調用13號中斷的3號子程序就可以得到,前面已經用過了的。
獲得內存大小,可以調用用15號中斷的88號子程序得到,也很簡單。
與磁碟相關的信息稍微復雜一點,這些信息被保存在0x0000:0x0104地址處的16個位元組的中,這16個位元組的信息叫做「磁碟參數表」。所以獲得磁碟信息的方法就是復制數據。
(2)數字轉字元
現在已經將這些硬體參數取出來放在了0x90000處,接下來的工作是將這些參數顯示在屏幕上。這些參數都是一些無符號整數,所以需要做的主要工作是用匯編程序在屏幕上將這些整數用16進制的形式顯示出來。
因為十六進制與二進制有很好的對應關系(每4位二進制數和1位十六進制數存在一一對應關系),顯示時只需將原二進制數每4位劃成一組,按組求對應的ASCII碼送顯示器即可。ASCII碼與十六進制數字的對應關系為:0x30~0x39對應數字0~9,0x41~0x46對應數字a~f。從數字9到a,其ASCII碼間隔了7h,這一點在轉換時要特別注意。為使一個十六進制數能按高位到低位依次顯示,實際編程中,需對bx中的數每次循環左移一組(4位二進制),然後屏蔽掉當前高12位,對當前餘下的4位(即1位十六進制數)求其ASCII碼,要判斷它是0~9還是a~f,是前者則加0x30得對應的ASCII碼,後者則要加0x37才行,最後送顯示器輸出。以上步驟重復4次,就可以完成bx中數以4位十六進制的形式顯示出來。
因為在輸出的時候需要調用多次,所以最好把這個功能寫成一個函數print_bx,方便使用。既然要用到函數,故一定要先設置好棧。為了方便,還可以寫一個函數print_nl實現換行的功能。
INITSEG = 0x9000
entry _start
_start:
! 在顯示字元串之前必須先獲取當前游標的位置,這樣就可以把字元串顯示到當前游標處了
mov ah,#0x03
xor bh,bh
int 0x10
! 利用10號中斷的13號功能列印字元串"Now we are in SETUP."
mov cx,#26
mov bx,#0x0007
mov bp,#msg1
mov ax,cs
mov es,ax
mov ax,#0x1301
int 0x10
! 下面開始讀取一些硬體參數
! 讀入游標位置信息,保存到0x90000處
mov ax,#INITSEG
mov ds,ax
mov ah,#0x03
xor bh,bh
int 0x10
mov [0],ds
! 讀入內存大小位置信息,保存到0x90002處
mov ah,#0x88
int 0x15
mov [2],ax
! 從0x41處拷貝16個位元組(磁碟參數表)到0x90004處
mov ax,#0x0000
mov ds,ax
lds si,[4*0x41]
mov ax,#INITSEG
mov es,ax
mov di,#0x0004
mov cx,#0x10
rep ! 重復16次
movsb
! 先列印游標位置
! 列印字元串之前要先讀取游標位置,將字元串列印到當前游標處
mov ah,#0x03
xor bh,bh
int 0x10
! 列印字元串 "Cursor POS:"
mov cx,#11
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg2
mov ax,#0x1301
int 0x10
! 調用列印函數,列印游標位置
mov ax,#0x9000
mov ds,ax
mov dx,0x0
call print_hex
call print_nl
! 列印內存大小
! 列印字元串"Memory SIZE:"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#12
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg3
mov ax,#0x1301
int 0x10
! 調用列印函數,列印內存大小信息
mov ax,#0x9000
mov ds,ax
mov dx,0x2
call print_hex
! 列印字元串"KB"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#2
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg4
mov ax,#0x1301
int 0x10
call print_nl
!列印柱面數
! 列印字元串"Cyls"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#5
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg5
mov ax,#0x1301
int 0x10
! 調用列印函數列印磁碟柱面數
mov ax,#0x9000
mov ds,ax
mov dx,0x4
call print_hex
call print_nl
! 列印磁頭數
! 列印字元串"Heads:"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#6
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg6
mov ax,#0x1301
int 0x10
! 調用列印函數列印磁碟磁頭數
mov ax,#0x9000
mov ds,ax
mov dx,0x6
call print_hex
call print_nl
! 列印每磁軌扇區數
! 列印字元串"sectors"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#8
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg7
mov ax,#0x1301
int 0x10
! 調用列印函數列印扇區數
mov ax,#0x9000
mov ds,ax
mov dx,0x12
call print_hex
call print_nl
Inf_loop:
jmp Inf_loop ! 無限循環
! print_hex函數:將一個數字轉換為ascii碼字元,並列印到屏幕上
! 參數值:dx
! 返回值:無
print_hex:
mov cx,#4 ! 要列印4個十六進制數字,故循環4次
print_digit:
rol dx,#4 ! 循環以使低4比特用上 !! 取dx的高4比特移到低4比特處
mov ax,#0xe0f ! ah = 請求的功能值,al = 半位元組(4個比特)掩碼
and al,dl ! 取dl的低4比特值
add al,#0x30 ! 給al數字加上十六進制0x30
cmp al,#0x3a
jl outp ! 如果是一個不大於十的數字
add al,#0x07 ! 如果是a~f,要多加7
outp:
int 0x10
loop print_digit ! 用loop重復4次
ret
! 列印回車換行
print_nl:
mov ax,#0xe0d
int 0x10
mov al,#0xa
int 0x10
ret
msg1:
.byte 13,10
.ascii "Now we are in SETUP."
.byte 13,10,13,10
msg2:
.ascii "Cursor POS:"
msg3:
.ascii "Memory SIZE:"
msg4:
.ascii "KB"
msg5:
.ascii "Cyls:"
msg6:
.ascii "Heads:"
msg7:
.ascii "Sectors:"
.org 510
boot_flag:
.word 0xAA55
運行結果:
㈢ r做bp好還是python做bp好
a=sim(net,x) 說實話我也菜鳥級別,你看一下最後這個函數能不能用: 其中「a」自己隨便可以設的,其實就是個代表返回值 「net」換成你訓練好的函數, 「x」換成你的輸入矩陣
㈣ 關於Python的BP神經網路的一個代碼
這個神經網路只能處理分兩類的的情況,這是由這個神經網路的結構決定了的。
如果想應付分多類的情況,必須對輸出層作softmax處理。
具體代碼可參看這里:
http://www.cnblogs.com/hhh5460/p/5434531.html
㈤ python,多層嵌套。bp=([0,[ 1,~~~ ,[99]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])
請貼出代碼及報錯信息,
print_lol(name,list) 又是個啥?
稀里糊塗的,你想叫人怎麼回答?
㈥ python做BP神經網路,進行數據預測,訓練的輸入和輸出值都存在負數,為什麼預測值永遠為正數
因為sigmoid就是預測0到1之間的連續值。通常當二分類預測使用,你的問題是否復合二分類如果可以就把類別換成0和1就可以了,如果是做回歸那就不行了,要換其他損失函數
㈦ python sigmoid函數屬於哪個庫
Sigmoid函數,即f(x)=1/(1+e-x).神經元的非線性作用函數. 人工神經網路的學習演算法-BP演算法 神經網路的學習是基於一組樣本進行的,它包括輸入和輸出(這里用期望輸出表示),輸入和輸出有多少個分量就有多少個輸入和輸出神經元與之對應.最初神經網路
㈧ python基礎都有哪些內容呢
階段一:Python開發基礎
Python全棧開發與人工智慧之Python開發基礎知識學習內容包括:Python基礎語法、數據類型、字元編碼、文件操作、函數、裝飾器、迭代器、內置方法、常用模塊等。
階段二:Python高級編程和資料庫開發
Python全棧開發與人工智慧之Python高級編程和資料庫開發知識學習內容包括:面向對象開發、Socket網路編程、線程、進程、隊列、IO多路模型、Mysql資料庫開發等。
階段三:前端開發
Python全棧開發與人工智慧之前端開發知識學習內容包括:Html、CSS、JavaScript開發、Jquery&bootstrap開發、前端框架VUE開發等。
階段四:WEB框架開發
Python全棧開發與人工智慧之WEB框架開發學習內容包括:Django框架基礎、Django框架進階、BBS+Blog實戰項目開發、緩存和隊列中間件、Flask框架學習、Tornado框架學習、Restful API等。
階段五:爬蟲開發
Python全棧開發與人工智慧之爬蟲開發學習內容包括:爬蟲開發實戰。
階段六:全棧項目實戰
Python全棧開發與人工智慧之全棧項目實戰學習內容包括:企業應用工具學習、CRM客戶關系管理系統開發、路飛學城在線教育平台開發等。
階段七:數據分析
Python全棧開發與人工智慧之數據分析學習內容包括:金融量化分析。
階段八:人工智慧
Python全棧開發與人工智慧之人工智慧學習內容包括:機器學習、圖形識別、無人機開發、無人駕駛等。
階段九:自動化運維&開發
Python全棧開發與人工智慧之自動化運維&開發學習內容包括:CMDB資產管理系統開發、IT審計+主機管理系統開發、分布式主機監控系統開發等。
階段十:高並發語言GO開發
Python全棧開發與人工智慧之高並發語言GO開發學習內容包括:GO語言基礎、數據類型與文件IO操作、函數和面向對象、並發編程等。
這是我校課程大綱,不妨試試!