Create a 3X3X2 matrix A which contains a matrix of magic(3) and another rand(3,3)*10.
題旨:創造一個多維矩陣,在這裡先宣告 A為 3x3x2矩陣,之後再填入兩個3x3矩陣,分別是 magic(3) 和 rand(3)*10 。
程式內容:
>> A=zeros(3,3,2);
>> A(:,:,1)=magic(3);
>> A(:,:,2)=rands(3,3)*10;
>> A
A(:,:,1) =
8 1 6
3 5 7
4 9 2
A(:,:,2) =
-0.2804 -0.8706 -1.1059
7.8260 -9.6299 2.3086
5.2419 6.4281 5.8387
結果與討論:
結果如上所示,在這裡順便測試一下,當輸入 A(4) 顯示的是 1 ,而
A(12)=5.2419;可以觀察到A(4)=A(1 ,2 ,1), A(12)= A( 3, 1, 2) 。在多維矩陣裡也可以直接用數列直接呼叫矩陣各個位置,順序為先從 A (: , : , 1)的 第一行、第二行、第三行、A( : , : , 2)的第一行、第二行、第三行。
Assume that matrices A=[45 89 99; 12 34 55], B=[15 25 45; 65 50 30]. Find matrices that join A & B both in vertical and horizontal directions. Also, find a two-page matrix with A & B stored in separate pages. Use commands horizcat and verticat to check the results with those from above.
題旨:
A, B 兩個2x3 矩陣利用 cat 指令作合併的動作,cat(dim ,A ,B)中dim=1
代表兩個矩陣垂直合併,dim=2 代表兩個矩陣平行合併,而dim=3為分頁。
在這裡用dim=1,2,3 分別做出矩陣 C1,C2,C3 ,接著利用 horzcat 指令和vertcat指令檢查,horzcat(A,B) 為平行合併,vertcat(A,B) 為垂直合併。
程式內容
>> A=[45 89 99;12 34 55];
>> B=[15 25 45;65 50 30];
>> C1=cat(1,A,B);
>> C2=cat(2,A,B);
>> C3=cat(3,A,B);
>> C1
C1 =
45 89 99
12 34 55
15 25 45
65 50 30
>> C2
C2 =
45 89 99 15 25 45
12 34 55 65 50 30
>> C3
C3(:,:,1) =
45 89 99
12 34 55
C3(:,:,2) =
15 25 45
65 50 30
>> Ch=horzcat(A,B)
Ch =
45 89 99 15 25 45
12 34 55 65 50 30
>> Cv=vertcat(A,B)
Cv =
45 89 99
12 34 55
15 25 45
65 50 30
>> isequal(Cv,C1)
ans =
1
>> isequal(Ch,C2)
ans =
1
結果與分析
先利用cat(1,A,B) cat(2,A,B) cat(3,A,B) 分別創造平行合併矩陣,垂直合併矩陣,和三維矩陣..C1,C2,C3,可以由程式碼看出結果。而之後用horzcat 和vertcat兩個指令作同樣的動作,為 Ch 和Cv 矩陣,在這裡老師的題目給的指令似乎有筆誤。最後在利用isequal 指令檢查 C1和 Ch是否是相同的矩陣,C2和Cv是否是相同的矩陣,最後結果都是邏輯值 1 ,所以 cat( 1, A, B) = horzcat( A,B)、cat( 2, A, B )=vertcat( A, B) 。
Find a matrix M which contains A as the first and third pages and B the second and fourth pages.
題旨:
已知矩陣 A, B 求M矩陣的第一頁和第三頁是矩陣A,M矩陣的第二頁和第四頁是矩陣B,在這裡可以利用cat指令或是直接宣告 M(: , : , 1)、M(: , : , 2)、M(: , : , 3)、M(: , : , 4)都可以,在這裡採用 cat指令寫成指令檔。
程式內容
/matrix.m/ %matrix的指令檔
function output=matrix(input1,input2)
output=cat(3,input1,input2,input1,input2);
/command windows/ %在command windows執行
舉例來說
>> A=[1 2;3 4];
>> B=[5 6;7 8];
>> M=matrix(A,B);
>> M
M(:,:,1) =
1 2
3 4
M(:,:,2) =
5 6
7 8
M(:,:,3) =
1 2
3 4
M(:,:,4) =
5 6
7 8
結果與分析
在本題試過兩種作法,結果都一樣,一種是用cat(3,A,B) 一種是一頁一頁宣告
Construct a 2X2 cell array that contains 'Eric' [90 100]; 'Peter' [35 60]; 'Jan' [77 67].
題旨:
宣告一個2x3細胞矩陣A包含題目所題到的六個元素,用A(1,1)={}形式設定每個元素的值,再用celldisp把細胞矩陣A的詳細內容展示出來。
程式內容
>> A(1,1)={'Eric'};
>> A(2,1)={'Peter'};
>> A(3,1)={'Jan'};
>> A(1,2)={[90 100]};
>> A(2,2)={[35 60]};
>> A(3,2)={[77 67]};
>> A
A =
'Eric' [1x2 double]
'Peter' [1x2 double]
'Jan' [1x2 double]
>> celldisp(A)
A{1,1} =
Eric
A{2,1} =
Peter
A{3,1} =
Jan
A{1,2} =
90 100
A{2,2} =
35 60
A{3,2} =
77 67
結果與分析
在這裡選用了最基本的指定位置填入內容
Construct a structural Array that contains the following data:Name: 'Philip', 'Peter','Roberts', 'Roe'Age: 35, 45, 55, 60Salary: 50,000 40,000 80,000 120,000
題旨:
宣告一個 結構矩陣,有Name, Age, Salary共三類各4項,在這裡使用指令struct直接宣告內容。
程式內容
>> clear
>> B=struct('Name',{'Philip','Peter','Roberts','Roe'},'Age',{35,45,55,60},'Salary',{'50,000','40,000','80,000','120,000'});
>> B(1)
ans =
Name: 'Philip'
Age: 35
Salary: '50,000'
>> B(2)
ans =
Name: 'Peter'
Age: 45
Salary: '40,000'
>> B(3)
ans =
Name: 'Roberts'
Age: 55
Salary: '80,000'
>> B(4)
ans =
Name: 'Roe'
Age: 60
Salary: '120,000'
結果與分析
使用struct指令可以方便的宣告結構矩陣的內容,免除了一項一項宣告的麻煩,
在struct裡面中括號和大括號的用法需特別注意,如 {35,45,55,60}、[35 45 55 60]、{[35 45 55 60]} 都是不同的結果。
顯示具有 Matlab 標籤的文章。 顯示所有文章
Matlab: 影像處理及後製
前言:
常常在攝影的人都知道
用單眼數位拍出來的照片通常需要 “後製”
也就是對照片作修改
因為常常用到像photoimpact或photoshop等的編輯軟體
突然想到可不可以利用
Matlab的強大功能作類似的處理
經過摸索之後找到可以把照片載入matlab的方法
並進行幾項簡單的修改
介紹:
在這裡我選擇了幾項簡單的功能並製作了一個選單
基本的功能包括
1. 觀看原圖 View photo
2. 顏色濾鏡功能 RGB filter
3. 反白 Counter image
4. 彩色照片轉黑白照 Color ro B/W
功能說明:
1. View photo
觀看指定的照片 並有放大縮小的功能
2. RGB filter
就像photoshop的濾鏡功能,分成R、G、B 濾鏡
點選之後會輸入三個數值,r、g、b 分別是0~1的數值
1 代表顏色原始呈現 0 代表完全被遮住。
3. Counter image
也就是反白功能,能將明暗對調
4. Color ro B/W
把彩色照片轉換成黑白照片
使用方法:
把想處理的照片 xxx.xxx (如 w.jpg) 放在matlab的 Current Directory。
輸入指令 : Photo
打入 xxx. xx (記得打副檔名)
就進入選單模式
範例:
選這張照片進行處理 “ w.jpg “
5. (1) View photo
會顯示原照片
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/963015/w.jpg
6. (2) RGB filter
R=1
G=0
B=0
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/36517/r.jpg
R=0
G=1
B=0
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/388570/g.jpg
R=0.5
G=0.5
B=0.5
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/500246/05.jpg
R=0
G=1
B=1
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/859043/bg.jpg
7. Counter image
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/872523/count.jpg
8. Color ro B/W
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/673361/gra.jpg
結語:
目前只是最基本的修改功能
未來計畫要加入的包括進接的修改功能及目前富士最新的 臉部辨識功能
程式碼
file=input('select your photo (xxx.xxx)\n:','s');
w=imread(file);
k=menu(' Matphoto v.1 by Ching','View photo','RGB filter','Counter image','Color ro B/W');
switch k
case 1
imview(w);
case 2
r=input('Input your R value(0~1)\n:');
g=input('Input your G value(0~1)\n:');
b=input('Input your B value(0~1)\n:');
w2(:,:,1)=w(:,:,1)*r;
w2(:,:,2)=w(:,:,2)*g;
w2(:,:,3)=w(:,:,3)*b;
imshow(w2);
case 3
w2=256-w;
imshow(w2);
case 4
w2=(w(:,:,1)+w(:,:,2)+w(:,:,3))/3;
imshow(w2);
end
常常在攝影的人都知道
用單眼數位拍出來的照片通常需要 “後製”
也就是對照片作修改
因為常常用到像photoimpact或photoshop等的編輯軟體
突然想到可不可以利用
Matlab的強大功能作類似的處理
經過摸索之後找到可以把照片載入matlab的方法
並進行幾項簡單的修改
介紹:
在這裡我選擇了幾項簡單的功能並製作了一個選單
基本的功能包括
1. 觀看原圖 View photo
2. 顏色濾鏡功能 RGB filter
3. 反白 Counter image
4. 彩色照片轉黑白照 Color ro B/W
功能說明:
1. View photo
觀看指定的照片 並有放大縮小的功能
2. RGB filter
就像photoshop的濾鏡功能,分成R、G、B 濾鏡
點選之後會輸入三個數值,r、g、b 分別是0~1的數值
1 代表顏色原始呈現 0 代表完全被遮住。
3. Counter image
也就是反白功能,能將明暗對調
4. Color ro B/W
把彩色照片轉換成黑白照片
使用方法:
把想處理的照片 xxx.xxx (如 w.jpg) 放在matlab的 Current Directory。
輸入指令 : Photo
打入 xxx. xx (記得打副檔名)
就進入選單模式
範例:
選這張照片進行處理 “ w.jpg “
5. (1) View photo
會顯示原照片
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/963015/w.jpg
6. (2) RGB filter
R=1
G=0
B=0
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/36517/r.jpg
R=0
G=1
B=0
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/388570/g.jpg
R=0.5
G=0.5
B=0.5
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/500246/05.jpg
R=0
G=1
B=1
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/859043/bg.jpg
7. Counter image
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/872523/count.jpg
8. Color ro B/W
http://photos1.blogger.com/x/blogger2/2907/859880749988154/1600/673361/gra.jpg
結語:
目前只是最基本的修改功能
未來計畫要加入的包括進接的修改功能及目前富士最新的 臉部辨識功能
程式碼
file=input('select your photo (xxx.xxx)\n:','s');
w=imread(file);
k=menu(' Matphoto v.1 by Ching','View photo','RGB filter','Counter image','Color ro B/W');
switch k
case 1
imview(w);
case 2
r=input('Input your R value(0~1)\n:');
g=input('Input your G value(0~1)\n:');
b=input('Input your B value(0~1)\n:');
w2(:,:,1)=w(:,:,1)*r;
w2(:,:,2)=w(:,:,2)*g;
w2(:,:,3)=w(:,:,3)*b;
imshow(w2);
case 3
w2=256-w;
imshow(w2);
case 4
w2=(w(:,:,1)+w(:,:,2)+w(:,:,3))/3;
imshow(w2);
end
Matlab: 熱流分析之通用情況推廣 程式碼
function [T]=heat_platen(n,m,ti,to)
% Prog calculating heat transfer through a plate by 3x3.
% Inputs:
% ti,to : input & output temperature, C
% n,m : n x m mesh (Heat flow region)
% input : Heat flow input location [x,y] x=1~n,y=1~m
% output: Heat flow output location [x,y] x=1~n,y=1~m
% Outputs:
% temp:temperatures at each layer,C
% Example:
% T=heat_platen(20,-10)
inx=1;
iny=1;
outx=n;
outy=m;
A=zeros(n,m);
B=zeros(n,m);
C=zeros(n*m,1);
C((inx-1)*m+iny,1)=ti;
C((outx-1)*m+outy,1)=to;
for i=1:n
for j=1:m
if i==1i==n
A(i,j)=3;
elseif j==1j==m
A(i,j)=3;
else
A(i,j)=4;
end
if (i==1i==n)&(j==1j==m)
A(i,j)=2;
end
end
end
B(inx,iny)=1;
B(outx,outy)=1;
A=A+B;
TT=zeros(m*n,m*n);
for k=1:n*m
for i=1:n
for j=1:m
if k==(i-1)*m+j
TT(k,k)=A(i,j);
end
if i==1
TT((i-1)*m+j,i*m+j)=-1;
elseif i==n
TT((i-1)*m+j,(i-2)*m+j)=-1;
else
TT((i-1)*m+j,i*m+j)=-1;
TT((i-1)*m+j,(i-2)*m+j)=-1;
end
if j==1
TT((i-1)*m+j,(i-1)*m+j+1)=-1;
elseif j==m
TT((i-1)*m+j,(i-1)*m+j-1)=-1;
else
TT((i-1)*m+j,(i-1)*m+j+1)=-1;
TT((i-1)*m+j,(i-1)*m+j-1)=-1;
end
end
end
end
T=reshape(inv(TT)*C,n,m);
mesh (T); figure(gcf)
% Prog calculating heat transfer through a plate by 3x3.
% Inputs:
% ti,to : input & output temperature, C
% n,m : n x m mesh (Heat flow region)
% input : Heat flow input location [x,y] x=1~n,y=1~m
% output: Heat flow output location [x,y] x=1~n,y=1~m
% Outputs:
% temp:temperatures at each layer,C
% Example:
% T=heat_platen(20,-10)
inx=1;
iny=1;
outx=n;
outy=m;
A=zeros(n,m);
B=zeros(n,m);
C=zeros(n*m,1);
C((inx-1)*m+iny,1)=ti;
C((outx-1)*m+outy,1)=to;
for i=1:n
for j=1:m
if i==1i==n
A(i,j)=3;
elseif j==1j==m
A(i,j)=3;
else
A(i,j)=4;
end
if (i==1i==n)&(j==1j==m)
A(i,j)=2;
end
end
end
B(inx,iny)=1;
B(outx,outy)=1;
A=A+B;
TT=zeros(m*n,m*n);
for k=1:n*m
for i=1:n
for j=1:m
if k==(i-1)*m+j
TT(k,k)=A(i,j);
end
if i==1
TT((i-1)*m+j,i*m+j)=-1;
elseif i==n
TT((i-1)*m+j,(i-2)*m+j)=-1;
else
TT((i-1)*m+j,i*m+j)=-1;
TT((i-1)*m+j,(i-2)*m+j)=-1;
end
if j==1
TT((i-1)*m+j,(i-1)*m+j+1)=-1;
elseif j==m
TT((i-1)*m+j,(i-1)*m+j-1)=-1;
else
TT((i-1)*m+j,(i-1)*m+j+1)=-1;
TT((i-1)*m+j,(i-1)*m+j-1)=-1;
end
end
end
end
T=reshape(inv(TT)*C,n,m);
mesh (T); figure(gcf)
Matlab: Radial Basis Function ANN 輻狀基底類神經網路
前言:利用RBF ANN 作簡短的介紹類神經網路的原理,並以老師上課的例子以類神經網路作簡單的應用,在這裡利用ANN 作 “ 函數模擬 ” 。
類神經網路介紹:類神經網路(Artificial Neural Networks, ANNs)或譯為人工神經網路,其主要的基本概念是嘗試著模仿人類的神經系統。
它是由很多非線性的運算單元(即:神經元 neuron)和位於這些運算單元間的眾多連結(links)所組成,而這些運算單元通常是以平行且分散的方式來進行運算以電腦的軟硬體來模擬生物神經網路的資訊處理系統。
整個ANN的聚集形式就如同人類的大腦一般,可透過樣本或資料的訓練來展現出學習(learn)、回想(recall)、歸納推演(generalize)的能力。
類神經網路在處理複雜的工作時
(1)不需要針對問題定義複雜的數學模式,
(2)不用去解任何微分方程、積分方程或其他的數學方程式,
(3)藉由學習來面對複雜的問題與不確定性的環境。
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7-5Po6bjRqFrDgTXgevlRCmVyc1X_CzuHvAKJ7H3mFrcwIoP5aso_Yckbw4u4ytoPULCvXHwv9dNBLjSpGV1HSmRgC66au85g23TUrKZXflkMoI_uTobbjqy-d4uDr4xSMN6_bSu9QD0/s1600-h/圖片4.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr4wv46Ljem8U3sBdWaZ6nSOlzM-C9qLO6N_io-U49xNCj3mDhzHxBJilUFFfQvMgfSUCH6P3QnP7gGgjSGysLdrYvmBt8d8Q7wtVF6_TSwvmQcCnhS8AnGCpjTi-ejHwE__6ihH-1VfA/s1600-h/圖片1.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCQ3yCvE4zjY-W2RIDZRofHuoJojLyFArIrvfkz22bWJj1X7Se1eIKZaj8-6fzxxcesNLed-YviesIrdYArrYPP46ERwXHUJq9zz60eD8CQW6U_vjDtbLgs0B7DbXvbro6H5w-z71E6k8/s1600-h/圖片2.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqa_Wv-tO3lpWaQtQ2JKIhC3YjN-ne_1GsFYFIzNaGPsXcxpkhINo7Kpve3BNL8yempKIRz8_W2rarACM9ei-OIcqRYt1FXJfFtlmXTmCw4pEUfP24QlvSoPKa50lkR5qv47sdpL8esMk/s1600-h/圖片3.jpg
輻狀基底函數類神經網路介紹(RBF ANN)
或稱為半徑式類神經網路,特質主要在於摩擬大腦皮質軸突的局部調整功能
為基本前饋式類神經網路
其可視為在解決高維度空間的曲線調適問題
RBFANN 架構
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFPRMTpP4Q_WRvW6Hnf8sGyt6Yv_RGG7DbO_lLof_APX6ZN5FpgdfxMU6vdtfydZ9gOU7Ten4fSqnuyvR4TxNUByWt_lLps2h5ZgPTi_YDJ9F0TAgSRaFp4n5JWQK9tzTxKTGcLD-pLUc/s1600-h/圖片5.jpg
RBFANN演算流程
1. 處理資料 (輸入項與目標輸出項)
2. 決定類神經網路架構
3. 決定初始中心點位置 (類神經元)
4. 利用RBFANN學習演算法修正(1)中心點位置 (2)連結權重 (3)福狀基底半徑
5. 驗證與測試階段
程式流程Step 1 :
想要利用RBF ANN模擬 matlab裡面z=peaks(X,Y)的函數
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2)
可以看出 Peaks(X,Y) 這是一個非線性的方程式
正好用來測試類神經網路處理非線性的能力
取X,Y都介於-2和2間距0.2 共產生400筆資料各包含(X,Y, f(X,Y ))
Step 2
架構RBFANN 這裡選取輸入維度2, 中心點個數 100
以高斯函數為輻狀基底函數 演算次數 200次 學習速率0.01
Step3
將400筆資料依序丟入網路中進行訓練,並修正中心點位置 連結權重 福狀基底半徑 等資訊
Step4
製作演算流程動畫, 以3D圖上的黑點表示 input data , 以mesh 網格表示ANN模擬函數的結果, 若資料點和mesh網格重合則表示模擬效果優良
Step 5
達到停止條件或最大演算步數則停止, 結果為rmse 越小表示越好
Step 6
製作GUI介面
程式內容
clear all;
iter=100;
nc=100;
goal=0.01;
lr_w=0.01;
lr_c=0.01;
lr_s=0.01;
% p 為輸入資料點,N×K矩陣,N是輸入資料維度,K是資料點數
% t 為目標輸出值,1×K矩陣
% newcenter已選定的中心點,N×nc矩陣
% iter為指定演算代數
% goal為指定之網路誤差
% lr_w為調整權重之學習速率
% lr_c為調整中心點之學習速率
% lr_s為調整標準偏差? (sigma)之學習速率
% W為輸出層權重,nc×1矩陣
% yh為網路輸出值,1×K矩陣
% rmse為目標輸出值與網路輸出值之RMSE
%輸入函數
[X,Y] = meshgrid(-2:0.2:2);
Z = 3*peaks(X,Y);
[mm,nn]=size(Z);
PA=zeros(3,mm*nn);
for i=1:mm
for j=1:nn
PA(1,(i-1)*nn+j)=X(i,j);
PA(2,(i-1)*nn+j)=Y(i,j);
PA(3,(i-1)*nn+j)=Z(i,j);
end
end
clear i j ;
p=PA(1:2,:);
t=PA(3,:);
[nd,np]=size(p);
k=randperm(np);
newcenter=p(:,k(1:nc));
clear nd np nc k ;
nc=size(newcenter,2);
[nd,np]=size(p);
phii=zeros(1,nc);
Dic=[];
phi=[];
itimetemp=1;
for i=1:nc
for j=1:nc
Dic(j,i)=norm(newcenter(:,i)-newcenter(:,j));%計算center的距離
end
end
sigma=(max(max(Dic))/sqrt(nc));%計算基底函數的標準偏差σ(sigma)
for i=1:nc
for j=1:np
phi(j,i)=exp(-(norm(newcenter(:,i)-p(:,j))/sigma)^2);%計算center與input各點的距離
end
end
W=pinv(phi)*t';%初始權重W
newsigma=sigma*ones(nc,1);
for itime=1:iter
for j=1:np
for i=1:nc
Dip(i)=norm(p(:,j)-newcenter(:,i));%計算center與input各點的距離
phii(i)=exp((-1/(newsigma(i)^2))*(Dip(i)^2));
end
if(itime==iter)
finalphii(j,:)=phii;
end
yh(j)=phii*W;
e(j)=yh(j)-t(j);
for k=1:nc
newcenter(:,k)=newcenter(:,k)-lr_c*(e(j)*W(k)/(newsigma(k)^2))*phii(k)*(p(:,j)-newcenter(:,k));%更新基底函數的中心值c
newsigma(k)=newsigma(k)-lr_s*(e(j)*W(k)/(newsigma(k)^3))*...
phii(k)*(norm(p(:,j)-newcenter(:,k)))^2;%更新基底函數的標準偏差σ
end
W=W-lr_w*e(j)*phii';%更新權重向量W
end
err1=sqrt(mse(yh-t));
err2(itime)=mse(yh-t);
if(itime/100-itimetemp==0)
itimetemp=itimetemp+1;
itime
end
if(err1<=goal)
break;
end
for i=1:np
for m=1:nc
phii(m)=exp(-(norm(p(:,i)-newcenter(:,m))/newsigma(m))^2);
end
yh(i)=phii*W;
end
for i=1:mm
for j=1:nn
ZZ(i,j)=yh((i-1)*nn+j);
end
end
rmse=sqrt(mse(yh-t));
clear yh;
%figure1
figure(1)
plot3(PA(1,:),PA(2,:),PA(3,:),'.','markersize',5);
grid on
hold on
mesh(X,Y,ZZ);
hold off
M(itime)=getframe;
RMSE(itime)=rmse;
end %time end
movie(M,1,2);
figure(2)
plot(RMSE);
title('rmse value');
xlabel('epoch step');
ylabel('rmse')
clear Dic Dip W ans e err1 err2 finalphii goal itime itimetemp;
clear j k lr_c lr_s lr_w m nc nd newsigma np p phi phii sigma itime m n mm nn;
clear PA X Y Z ZZ newcenter;
clear itre i M iter t RMSE;
結果
跑50次的結果
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigW1ruwjmSPRn0ItvBVv3TCk__yr8PqeqdumWW_168HAmjB0YFM7PbBbbw7fTh0PB_9wFQJM14yhUGqe6TMygmIgF5EglYiLWtA3PsjYO69XIx5d3G6snao2fXlwViUMRzQb_K-vAShZ8/s1600-h/a100.jpg
rmse 圖
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSTxwtDGo406DBQnfR_HNpk04U8hnmXza81daTL_hTg3Y5i1nWGfq8QosQUhggYqJqasVY2almcXui5z7f8WTKUTqF1NT7kC1Aedir5VExIrJ-81Hrhs6QZ83ajFPmY5ytu0L8WryJHck/s1600-h/rmse50.jpg
跑200次的結果
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4iBklA6sCdwaBDJXxY4HNaAHX1-XXIjskRaKLpiNMO6h5JeGNZPvgK-gCn46Ucx7zD5gpsHYkl_InoUcgwxSpKpA3vAOwa2g0VNShF0OpqI77sTvZce05YBgwU8RGNmXSY4cxhQgOLS4/s1600-h/a50.jpg
rmse圖
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4iBklA6sCdwaBDJXxY4HNaAHX1-XXIjskRaKLpiNMO6h5JeGNZPvgK-gCn46Ucx7zD5gpsHYkl_InoUcgwxSpKpA3vAOwa2g0VNShF0OpqI77sTvZce05YBgwU8RGNmXSY4cxhQgOLS4/s1600-h/a50.jpg
GUI介面
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4eqCkKDwp8Nt-RRXLZy9e2cx1vvzHi7tBSQa4NoPhVexcNtzaUEwbna-BvV14HTVjSIte3Wnq3DBEQHGkIUD8HqAoIR0MkU3eBW53i3B5vFBDpzDgh0OyKmYxhsielLuY6PCLYVosx5w/s1600-h/gui.JPG
類神經網路介紹:類神經網路(Artificial Neural Networks, ANNs)或譯為人工神經網路,其主要的基本概念是嘗試著模仿人類的神經系統。
它是由很多非線性的運算單元(即:神經元 neuron)和位於這些運算單元間的眾多連結(links)所組成,而這些運算單元通常是以平行且分散的方式來進行運算以電腦的軟硬體來模擬生物神經網路的資訊處理系統。
整個ANN的聚集形式就如同人類的大腦一般,可透過樣本或資料的訓練來展現出學習(learn)、回想(recall)、歸納推演(generalize)的能力。
類神經網路在處理複雜的工作時
(1)不需要針對問題定義複雜的數學模式,
(2)不用去解任何微分方程、積分方程或其他的數學方程式,
(3)藉由學習來面對複雜的問題與不確定性的環境。
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7-5Po6bjRqFrDgTXgevlRCmVyc1X_CzuHvAKJ7H3mFrcwIoP5aso_Yckbw4u4ytoPULCvXHwv9dNBLjSpGV1HSmRgC66au85g23TUrKZXflkMoI_uTobbjqy-d4uDr4xSMN6_bSu9QD0/s1600-h/圖片4.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr4wv46Ljem8U3sBdWaZ6nSOlzM-C9qLO6N_io-U49xNCj3mDhzHxBJilUFFfQvMgfSUCH6P3QnP7gGgjSGysLdrYvmBt8d8Q7wtVF6_TSwvmQcCnhS8AnGCpjTi-ejHwE__6ihH-1VfA/s1600-h/圖片1.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCQ3yCvE4zjY-W2RIDZRofHuoJojLyFArIrvfkz22bWJj1X7Se1eIKZaj8-6fzxxcesNLed-YviesIrdYArrYPP46ERwXHUJq9zz60eD8CQW6U_vjDtbLgs0B7DbXvbro6H5w-z71E6k8/s1600-h/圖片2.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqa_Wv-tO3lpWaQtQ2JKIhC3YjN-ne_1GsFYFIzNaGPsXcxpkhINo7Kpve3BNL8yempKIRz8_W2rarACM9ei-OIcqRYt1FXJfFtlmXTmCw4pEUfP24QlvSoPKa50lkR5qv47sdpL8esMk/s1600-h/圖片3.jpg
輻狀基底函數類神經網路介紹(RBF ANN)
或稱為半徑式類神經網路,特質主要在於摩擬大腦皮質軸突的局部調整功能
為基本前饋式類神經網路
其可視為在解決高維度空間的曲線調適問題
RBFANN 架構
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFPRMTpP4Q_WRvW6Hnf8sGyt6Yv_RGG7DbO_lLof_APX6ZN5FpgdfxMU6vdtfydZ9gOU7Ten4fSqnuyvR4TxNUByWt_lLps2h5ZgPTi_YDJ9F0TAgSRaFp4n5JWQK9tzTxKTGcLD-pLUc/s1600-h/圖片5.jpg
RBFANN演算流程
1. 處理資料 (輸入項與目標輸出項)
2. 決定類神經網路架構
3. 決定初始中心點位置 (類神經元)
4. 利用RBFANN學習演算法修正(1)中心點位置 (2)連結權重 (3)福狀基底半徑
5. 驗證與測試階段
程式流程Step 1 :
想要利用RBF ANN模擬 matlab裡面z=peaks(X,Y)的函數
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2)
可以看出 Peaks(X,Y) 這是一個非線性的方程式
正好用來測試類神經網路處理非線性的能力
取X,Y都介於-2和2間距0.2 共產生400筆資料各包含(X,Y, f(X,Y ))
Step 2
架構RBFANN 這裡選取輸入維度2, 中心點個數 100
以高斯函數為輻狀基底函數 演算次數 200次 學習速率0.01
Step3
將400筆資料依序丟入網路中進行訓練,並修正中心點位置 連結權重 福狀基底半徑 等資訊
Step4
製作演算流程動畫, 以3D圖上的黑點表示 input data , 以mesh 網格表示ANN模擬函數的結果, 若資料點和mesh網格重合則表示模擬效果優良
Step 5
達到停止條件或最大演算步數則停止, 結果為rmse 越小表示越好
Step 6
製作GUI介面
程式內容
clear all;
iter=100;
nc=100;
goal=0.01;
lr_w=0.01;
lr_c=0.01;
lr_s=0.01;
% p 為輸入資料點,N×K矩陣,N是輸入資料維度,K是資料點數
% t 為目標輸出值,1×K矩陣
% newcenter已選定的中心點,N×nc矩陣
% iter為指定演算代數
% goal為指定之網路誤差
% lr_w為調整權重之學習速率
% lr_c為調整中心點之學習速率
% lr_s為調整標準偏差? (sigma)之學習速率
% W為輸出層權重,nc×1矩陣
% yh為網路輸出值,1×K矩陣
% rmse為目標輸出值與網路輸出值之RMSE
%輸入函數
[X,Y] = meshgrid(-2:0.2:2);
Z = 3*peaks(X,Y);
[mm,nn]=size(Z);
PA=zeros(3,mm*nn);
for i=1:mm
for j=1:nn
PA(1,(i-1)*nn+j)=X(i,j);
PA(2,(i-1)*nn+j)=Y(i,j);
PA(3,(i-1)*nn+j)=Z(i,j);
end
end
clear i j ;
p=PA(1:2,:);
t=PA(3,:);
[nd,np]=size(p);
k=randperm(np);
newcenter=p(:,k(1:nc));
clear nd np nc k ;
nc=size(newcenter,2);
[nd,np]=size(p);
phii=zeros(1,nc);
Dic=[];
phi=[];
itimetemp=1;
for i=1:nc
for j=1:nc
Dic(j,i)=norm(newcenter(:,i)-newcenter(:,j));%計算center的距離
end
end
sigma=(max(max(Dic))/sqrt(nc));%計算基底函數的標準偏差σ(sigma)
for i=1:nc
for j=1:np
phi(j,i)=exp(-(norm(newcenter(:,i)-p(:,j))/sigma)^2);%計算center與input各點的距離
end
end
W=pinv(phi)*t';%初始權重W
newsigma=sigma*ones(nc,1);
for itime=1:iter
for j=1:np
for i=1:nc
Dip(i)=norm(p(:,j)-newcenter(:,i));%計算center與input各點的距離
phii(i)=exp((-1/(newsigma(i)^2))*(Dip(i)^2));
end
if(itime==iter)
finalphii(j,:)=phii;
end
yh(j)=phii*W;
e(j)=yh(j)-t(j);
for k=1:nc
newcenter(:,k)=newcenter(:,k)-lr_c*(e(j)*W(k)/(newsigma(k)^2))*phii(k)*(p(:,j)-newcenter(:,k));%更新基底函數的中心值c
newsigma(k)=newsigma(k)-lr_s*(e(j)*W(k)/(newsigma(k)^3))*...
phii(k)*(norm(p(:,j)-newcenter(:,k)))^2;%更新基底函數的標準偏差σ
end
W=W-lr_w*e(j)*phii';%更新權重向量W
end
err1=sqrt(mse(yh-t));
err2(itime)=mse(yh-t);
if(itime/100-itimetemp==0)
itimetemp=itimetemp+1;
itime
end
if(err1<=goal)
break;
end
for i=1:np
for m=1:nc
phii(m)=exp(-(norm(p(:,i)-newcenter(:,m))/newsigma(m))^2);
end
yh(i)=phii*W;
end
for i=1:mm
for j=1:nn
ZZ(i,j)=yh((i-1)*nn+j);
end
end
rmse=sqrt(mse(yh-t));
clear yh;
%figure1
figure(1)
plot3(PA(1,:),PA(2,:),PA(3,:),'.','markersize',5);
grid on
hold on
mesh(X,Y,ZZ);
hold off
M(itime)=getframe;
RMSE(itime)=rmse;
end %time end
movie(M,1,2);
figure(2)
plot(RMSE);
title('rmse value');
xlabel('epoch step');
ylabel('rmse')
clear Dic Dip W ans e err1 err2 finalphii goal itime itimetemp;
clear j k lr_c lr_s lr_w m nc nd newsigma np p phi phii sigma itime m n mm nn;
clear PA X Y Z ZZ newcenter;
clear itre i M iter t RMSE;
結果
跑50次的結果
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigW1ruwjmSPRn0ItvBVv3TCk__yr8PqeqdumWW_168HAmjB0YFM7PbBbbw7fTh0PB_9wFQJM14yhUGqe6TMygmIgF5EglYiLWtA3PsjYO69XIx5d3G6snao2fXlwViUMRzQb_K-vAShZ8/s1600-h/a100.jpg
rmse 圖
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSTxwtDGo406DBQnfR_HNpk04U8hnmXza81daTL_hTg3Y5i1nWGfq8QosQUhggYqJqasVY2almcXui5z7f8WTKUTqF1NT7kC1Aedir5VExIrJ-81Hrhs6QZ83ajFPmY5ytu0L8WryJHck/s1600-h/rmse50.jpg
跑200次的結果
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4iBklA6sCdwaBDJXxY4HNaAHX1-XXIjskRaKLpiNMO6h5JeGNZPvgK-gCn46Ucx7zD5gpsHYkl_InoUcgwxSpKpA3vAOwa2g0VNShF0OpqI77sTvZce05YBgwU8RGNmXSY4cxhQgOLS4/s1600-h/a50.jpg
rmse圖
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4iBklA6sCdwaBDJXxY4HNaAHX1-XXIjskRaKLpiNMO6h5JeGNZPvgK-gCn46Ucx7zD5gpsHYkl_InoUcgwxSpKpA3vAOwa2g0VNShF0OpqI77sTvZce05YBgwU8RGNmXSY4cxhQgOLS4/s1600-h/a50.jpg
GUI介面
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4eqCkKDwp8Nt-RRXLZy9e2cx1vvzHi7tBSQa4NoPhVexcNtzaUEwbna-BvV14HTVjSIte3Wnq3DBEQHGkIUD8HqAoIR0MkU3eBW53i3B5vFBDpzDgh0OyKmYxhsielLuY6PCLYVosx5w/s1600-h/gui.JPG
訂閱:
文章 (Atom)
Follow Us
Were this world an endless plain, and by sailing eastward we could for ever reach new distances