顯示具有 吳子青 標籤的文章。 顯示所有文章
顯示具有 吳子青 標籤的文章。 顯示所有文章

1/12/2007

吳子青: Radial Basis Function ANN 輻狀基底類神經網路

Radial Basis Function ANN 輻狀基底類神經網路

前言:
利用RBF ANN 作簡短的介紹類神經網路的原理,並以老師上課的例子以類神經網路作簡單的應用,在這裡利用ANN 作 “ 函數模擬 ” 。

類神經網路介紹:
類神經網路(Artificial Neural Networks, ANNs)或譯為人工神經網路,其主要的基本概念是嘗試著模仿人類的神經系統。

它是由很多非線性的運算單元(即:神經元 neuron)和位於這些運算單元間的眾多連結(links)所組成,而這些運算單元通常是以平行且分散的方式來進行運算以電腦的軟硬體來模擬生物神經網路的資訊處理系統。

整個ANN的聚集形式就如同人類的大腦一般,可透過樣本或資料的訓練來展現出學習(learn)、回想(recall)、歸納推演(generalize)的能力。

類神經網路在處理複雜的工作時
(1)不需要針對問題定義複雜的數學模式,
(2)不用去解任何微分方程、積分方程或其他的數學方程式,
(3)藉由學習來面對複雜的問題與不確定性的環境。































輻狀基底函數類神經網路介紹(RBF ANN)
或稱為半徑式類神經網路,特質主要在於摩擬大腦皮質軸突的局部調整功能
為基本前饋式類神經網路
其可視為在解決高維度空間的曲線調適問題

RBFANN 架構


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;

12/15/2006

吳子青:資料的前處理

吳子青:資料的前處理

前言:
這週開始應該會進入統計的課程,我想對統計大家都有一定的認識,從分佈、主成份分析和變方分析等,都是常用的方法。而且就算所研究的主題和統計一點關係都沒有,在論文和期刊上也是會要求利用討統計方法驗證結果的可靠度。

其實撇開統計上的理論方法,統計上最重要的是資料的品質,有好的資料品質分析出來的假設檢定才會具有意義。所以在進入統計前我們先要思考的問題是,我的資料夠好嗎?要如何改善?

我的問題是:
如果遇到資料有遺漏的處理方法




內容與方法
我寫了兩個小程式解決遇到資料有遺漏的處理方法,因為要分析的資料通常是千筆以上,不太可能手動自己算或用Excel慢慢拉,在分析數據上遇到資料有遺漏是常常有的狀況,但程式也只會回給你一個Error ,甚麼都不會和你說。

假設今天所要處理的資料有n 筆,每一筆資料共有p個變數,所以資料矩陣就是一個 n x p的矩陣。

處理方法一:
將有遺漏資料的那一筆刪除,因為不同資料長度或是不同的樣本作統計分析是無意義的,例如想知道一天之內日溫的變化,資料取禮拜一到禮拜日 (n=7),變數為每小時的日溫(p=12),假如溫度計禮拜三的中午忘記紀錄,這樣把禮拜三的11筆資料和禮拜四的12筆資料作比較是無意義的,所以處理方法一就是把禮拜三刪除。

處理方法二:
如果資料本身並不夠多,如果用處理方法一去處理就如同落井下石,所以在熟悉資料的特定或是合理的假設下(重要),可以對資料進行補遺的動作,在這裡使用的是最基本的內插法,前提是資料變動性不大或者變動是線性的。
以上面的例子解釋就是把禮拜三11點的日溫和13點的日溫作內插,估計12點的日溫。



程式流程:
在這裡要處理的資料設定為從Excel載入到Matlab的數據,所以當資料有遺漏處會顯示 “ NaN “ ,所以在這裡以指令 “isnan”來找出數據遺漏的地方,在進行處理。
Isnan(A) 的結果為和原矩陣同樣維度的矩陣,而A裡面NaN的元素對應到a是1,而其他的地方為0

處理方法一:
Step 1:資料矩陣為 A,a= isnan(A) 為判斷矩陣
Step2 : 從第一筆資料開始跑迴圈,然後慢慢的累加結果,而當遇到a矩陣裏出現1時直接跳過
Step3: 所以最後加總的結果就是刪除缺失資料的處理後數據

程式內容:


function [out]=de(A);
a=isnan(A(:,5));
[mm,nn]=size(A);
B=zeros(1,nn);
for i=1:mm
if a(i)==0
B=[B;A(i,:)];
end
end
out=B(2:end,:);



處理方法二
Step 1:資料矩陣為 A,a= isnan(A) 為判斷矩陣
Step2:搜尋每一筆資料中從0到1的位置,代表開始數具有缺失,之後利用while指令找出1總共延伸有幾個,代表中間有幾個數據要作內插。
Step3:將中間需補遺的地方用前一個和後一個資料進行內插的計算在矩陣B
Step4:跳過已搜尋的位置對全部的資料筆數進行補遺的動作
Step5:將原矩陣有資料的地方填補在矩陣B上面,完成處理
Step6:決定外插處理的方式

程式內容:

function [out]=inc(N12);

[mm,nn]=size(N12);
a=isnan(N12);
out=zeros(mm,nn);

for k=5:nn
switch sum(a(:,k))
case mm
otherwise
m=1;
s=1;
while a(s,k)==1
s=s+1;
end

for i=s:mm
if i>m
if a(i,k)==1
n=i;
w=n+1;
while a(w,k)==1
if w"<"mm
w=w+1;
else
m=w;
A(n:m-1,1)=0; %(data尾內插修正)
break;
end
end
m=w;
if m~=mm
for q=n:m-1
out(q,k)=N12(n-1,k)+(N12(m,k)-N12(n-1,k))/(m-n+1)*(q-n+1);
end
end
end
end
end
clear i w;
end
end
for i=1:mm
for j=1:nn
if a(i,j)==0
out(i,j)=out(i,j)+N12(i,j);
end
end
end


實際案例:

圖一 原始資料為Excel格式 中間有很多遺漏的資料
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBq50IiJDdqRdSucYkKME6gY8MpoJ1wNVsi0TFdZrwYi5ZHYwkBjRYU5f_gM99GRgPcL11kQyKeoI_m4xfOXbVVd6GiWM-944mjs4V5WORr4iYr8wxl45RwoxbUEPSr9uh76Ox9pvhwzY/s1600-h/11.JPG

圖二 用Matlab把資料載入 遺漏的資料會顯示NaN
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzzVZR6OmV7OJRGy_4qHHuswfY1JJ9K_uQ00a_XCaN7oqiAvrIOaNVfHgCnr1OczAdaJvO6p4XJbgzn7QbhvrfwEWE6wqJYuIEeb66QXN8GhkZd_9bREe84mFoxeyaPY63QHX0oSdHxSo/s1600-h/12.JPG

圖三 用處理方法一處理 (合併資料) 注意看年份的排序 而且從第五行開始處理
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwesaPRU24mIoEXEKMeNQamu9Uj4vpHnAzh1DAAOIzTUOHxn67lXQpXshQ0yrAYHQ56nig1ZfKZfFjxBy7fUiwLDSIyWlKMjNjLQbVOhLkB2DZWXuKXnaf6S82X2SEUFUTa-tuG97PD9M/s1600-h/13.JPG

圖四 用處理方法二處理 (內插補遺) 從第五行開始處理
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZhCmxWC0zKIs_vfZHDdYuxyz72N1FyHtRuWTpB3C1AyWuGQpRUd5om6fDCdWuOfSrHIjMqgwvoTi50JvuRmZ5MRo0nKGV4sX3Ja9S0ZY_YoTQ3ioxmp9uO5fH9F5Vifhws3FxeanpZM8/s1600-h/14.JPG

12/12/2006

吳子青:熱流分析之通用情況推廣

前言:
上禮拜上課老師講解了10-2 範例五:簡易之熱流分析
並探討了2x2 和 3x3 的範例
我就想寫一個n x m 維通用Case的程式
因為探討在Steady state穩態熱流情況基本原理並不難

除了把探討的維度改成n x m 外,在這裡也改成可以自由選擇熱流輸入
和輸出的位置,也可以多點的輸入輸出。

注意的地方是Control Volume 控制體積仍然維持正方形,原因在上課講解的時候有解釋過了,而且這裡探討的是Steady state。


分析與流程:
這個問題是示範反矩陣解聯立的方法
所以重要的就是在於係數矩陣 (也就是聯立的係數) 怎麼寫
而C矩陣只和輸入輸出熱流項有關

首先介紹函式的用法
function [T]=heat_platen(n,m,ti,to,input,output)
輸入項 n 和m 代表熱流場的維度
Ti: 輸入溫度
To: 輸出溫度
Input: 熱流輸入的位置座標,以矩陣表示並可以多選。
Output:熱流輸出的位置座標

輸出項: T 溫度矩陣
並在輸入項加入了預設值的設計
也就是如果輸入沒有填熱流流出和流入的位置
程式將會預設成從( 1, 1 ) 傳入而傳到 ( n , m ) 熱流流出,也就是範例五的樣式

接下來簡略的說明想法
把2x2的係數矩陣和3x3的係數矩陣列出來

2x2 case :

3 -1 -1 0
-1 2 0 -1
-1 0 2 -1
-1 -1 0 3

3x3 case

3 -1 0 -1 0 0 0 0 0

-1 3 0 -1 -1 0 0 0 0

0 -1 2 0 0 -1 0 0 0

-1 0 0 3 -1 0 -1 0 0

0 -1 0 -1 4 -1 0 -1 0

0 0 -1 0 -1 3 0 0 -1

0 0 0 -1 0 0 2 -1 0

0 0 0 0 -1 0 -1 3 -1

0 0 0 0 0 -1 0 -1 3

可以觀察到有一定的規則性
在這裡分成矩陣的對角線元素的探討 A 和其餘部份的探討 B
然後最後再組合起來,最後在加上輸入輸出項

(1) 對角線元素為相鄰的區塊數目,如果是在四個角落為2,在矩形的四個邊
為3,而其他的區域為4,由這樣的規則成矩陣A
(程式 line 27 到 line 46 )

(2) 如果探討的控制體積是第k塊且是位在中間區域 (即不是四角及邊線),
則在k+1、k-1、k+m、k-m的位置都要填 -1,而在邊線部份或四個角就只要填部份三個或兩的位置為 -1 ,並要特別注意i= 1 or n 或 j= 1 or m 的情況
由這樣的規則形成矩陣B
(程式 line 51 到 line 77)

(3) 加上輸入和輸出的部份,在輸入和輸出位置對應的對角線位置分別 +1 ,而在矩陣C 填上輸入溫度Ti 和輸出溫度To

(4) 最後利用反矩陣計算聯立方程式的解 T= inv(A)*C T為溫度矩陣
也是最終 Steady state 的溫度分佈 ,並繪製成3D圖


程式內容


function [T]=heat_platen(n,m,ti,to,input,output)
% 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,20,20,[1 1],[20 20])

if nargin==5
outx=n;outy=m;
inx=input(:,1);
iny=input(:,2);
elseif nargin==4
outx=n;outy=m;
inx=1;iny=1;
else
inx=input(:,1);
iny=input(:,2);
outx=output(:,1);
outy=output(:,2);
end

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==1|i==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)



結果

Case 1 改變熱流場Size
圖一5x5 Case
圖二10x10 Case
圖三50x50 Case

(輸入溫度 Ti = 20度 在 (1,1)
輸出溫度 To = -10 度在 (n,m))

























Case2 熱流入流出位置的改變
圖四 Input = [ 1 1] Output = [1 20]
圖五 Input = [ 1 1] Output = [10 10]
圖六 Input = [ 10 10] Output = [1 1]

(輸入溫度 Ti = 20度 輸出溫度 To = -10 度
Size= 20 x 20 )
























Case3 多個熱流出入口的改變
圖七 Input = [ 1 1; 20 1] Output = [1 20]
圖八 Input = [ 1 1; 20 20] Output = [1 20 ; 20 1]
圖九 Input = [ 1 1 ; 1 20 ; 20 1 ; 20 20] Output = [10 10]
圖十 Input = [ 10 10] Output = [ 1 1 ; 1 20 ; 20 1 ; 20 20]

















12/01/2006

吳子青: 影像處理及後製

http://r95622024.blogspot.com/2006/11/blog-post_2921.htm

前言:
常常在攝影的人都知道
用單眼數位拍出來的照片通常需要 “後製”
也就是對照片作修改

因為常常用到像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

11/03/2006

吳子青: 試作搜尋引擎( I )

前言:
本來構想是希望作一個可以將老師部落格上面
關於Matlab程式碼斷行問題解決的程式

利用copy指令將部落格的程式碼複製下來
會發現變成一整行 老師在上課的時候也不太方便
構想:
因為學到cell() 本來希望將整個文件按照字元存成
cell, 再去對矩陣作處理, 把斷行點找出來之後
重新輸出成正確的文件
但是...
找不到可以斷行的依據

所以轉換方向作一個網頁或是文件的搜尋器 (google..??)
目前進度緩慢,所以分階段進行

問題
如何將字元讀出並進行搜尋動作?

----------------------------------------------------------
答案:
題旨與分析
將文件讀入 並將文件裡面的每個字元存入記憶體宣告成矩陣
(或者文件太大以動態搜尋方式不先將整個文件全部存入記憶體)
對矩陣作搜尋動作, 找出關鍵字 對應的位置
將搜尋到的字元或位置進行後置處理
(列出一整行,或者標示不同顏色?)
作出使用者介面

程式流程
因為尚未完成所以先簡述如下

/tra.m/
[fid,message]=fopen('test2.txt','r');
mydata=fread(fid);
if fid==-1
disp(message);
end
fclose all;

%如此就將文件文字全部以二進位儲存方式
%儲存成矩陣mydata

/dis.m/
disp(char(mydata'))

/run.m/
[m,n]=find(mydata==keyword);
%找出矩陣中的keyword的二進位元,在mydata中作搜尋
找出對應的位置
A={mydata(m,n-2) mydata(m,n-1) mydata(m,n) mydata(m,n+1) mydata(m,n+2) };
disp(char(A));
%將關鍵字元的二進位碼轉換, 並顯示前兩字後兩字

執行結果
test2.txt 內容 ghuodjgpobinhindpohinjestpohdbvuisneptogindbuodb
關鍵字p
結果 :
jgpob , ndpoh , stpoh , nepto

討論
這目前只是初步的概念 ,只是針對字串中的字母搜尋關鍵字母並作處理
未來要克服的包括 關鍵字串的設定, 文件檔案讀取更general, 及加入
if 等規則 等等等

10/25/2006

吳子青: 民意調查真的公正嗎

前言:
最近又到了選舉期了 在電視媒體或報章雜誌常常可以看到
“ 某某參選人支持率多少”…
民意支持率各家都宣稱客觀公正,但其實是可以操作的
在這裡舉出一個以前碰過的問題讓大家思考一下 

問題:

若台北市某候選人的真實 “民意支持率”為15%,找出使調查樣本的
民意支持率超過0.18 的出現機率不大於 10% 的最小樣本數 N。

----------------------------------------------------------------------
答案:

題旨與分析
這問題的思考流程是這樣的
將全部台北市民當成一個族群,而調查的對象代表抽樣的樣本
“某候選人的真實民意支持率為15%” 這句話的意思就是代表族群的支持率
而調查樣本的民意支持率就是樣本的支持 率

將這問題視為一個二項式分佈的問題,也就是支持和不支持兩種情況
支持的機率 P=0.15 不支持的機率 Q=0.85
舉例說明
如果某一次的抽樣從台北市民隨機抽10個人 (Sample Size m=10)
10個人中支持候選的人有2個人,不支持的有8個人
這個事件出現的機率為

http://photos1.blogger.com/blogger2/2907/859880749988154/1600/formula1.jpg

所以如果問題是 ”找出使調查樣本的民意支持率超過0.18”
如果抽樣人數維持10人,支持人數大於1.8的都符合條件
也就是支持人數 2 到10人分別算出的機率加總。

題目所求是 “出現機率不大於 10% 的最小樣本數 N。”所以從n=1
開始算到符合出現機率不大於10%為止。

程式流程
Step 1 : 宣告function p1(m,n) 為抽樣m個人,有n個人支持的機率

Step 2 : 計算A為抽樣m個人,支持率超過0.18的機率總和

Step 3 : 從m=1 開始增加用For 跑迴圈,決定停止條件為A < >程式內容


/ p1.m / (* 這行代表m-files p1.n 開始 *)

function output=p1(m,n)

if n>0.5*m
a=m-n;
output=prod((m-a+1):m)/prod(1:a)*(0.15)^n*(0.85)^(m-n);

else
output=prod((m-n+1):m)/prod(1:n)*(0.15)^n*(0.85)^(m-n);
end


/ pp1.m / (* 這行代表m-files pp1.n 開始 *)
clear;
max=400;
ppp1=zeros(max,2);

for m=1:max
k=ceil(m*0.18);
A=0;


if A<=0.1 fprintf('最小樣本數%d\t出現機率%d',m,A);

break
end
fprintf('最小樣本數%d\t出現機率%d\n',m,A);
clc;
end
plot (ppp1(1:max,2), 'DisplayName', 'ppp1(1:max,2)', 'YDataSource', 'ppp1(1:max,2)');
figure(gcf)
xlabel('樣本數目');
ylabel('出現機率');
/ Command windows / (* 這行代表command windows輸入 *)
pp1


執行結果
最小樣本數217 出現機率9.559103e-002
這是最後跑出來的結果
N=217為民意支持率超過0.18 的出現機率不大於 10% 的最小樣本數 N

這是程式結果




http://photos1.blogger.com/blogger2/2907/859880749988154/1600/hy2.jpg

這是圖

http://photos1.blogger.com/blogger2/2907/859880749988154/1600/hydro.jpg

討論
(1)因為老師上週的上課內容剛交到For 和If的用法,所以在這裡練習一下

(2) 程式中碰到最大的問題在於 prod () 連乘函數括號內的矩陣不能太大
從1*2*3……..*171 =prod(1:171) 這樣結果會爆掉 ,可是在算二項式分佈
的機率時就一定會用到。

所以在這裡用了一個小技巧,在p1裡當 n > 0.5 m 時 令n=m-n
因為在排列組合裡 C10取2=C10取8,10!/8!2! =10!/2!8!
在這裡可以避免連乘太多項,可以有效 避免算到M=171時,
結果一定會出現NaN。但是當m 算到300多時
仍然會出現同樣的問題。或許會有更有效率的寫法。

10/01/2006

PROBLEM #2 吳子青

Matlab之工程應用 PROBLEM #2
data : 9/30/2006
student : 吳子青 R95622024

----------------------------------------------------------------------------
** Question 1 **

題旨: 將受試者的體溫矩陣B以攝氏38C為判斷依據
做出一體溫是否過高的邏輯矩陣

分析與程式流程:
Step1: 先將以華式為單位的B轉換為以攝氏為單位的A
轉換公式為

Step2: 要將矩陣A以攝氏38度為邏輯判斷準則,大於38為1
小於則為0, 在這裡使用的方法為先將A的每個元素減38
為矩陣C

Step3: 利用矩陣的max, sign運算將A38裡小於0的值化為0
大於0的值化為1, 而成為所求邏輯矩陣 D

程式內容:
>> % ** Question 1 **
>> clear
>> B=[98 100 102 104 98.4 98.2 98.5 101 102 99.5];
>> A=(B-32)*5/9

A =

36.6667 37.7778 38.8889 40.0000 36.8889 36.7778 36.9444 38.3333 38.8889 37.5000

>> A38=A-38

A38 =

-1.3333 -0.2222 0.8889 2.0000 -1.1111 -1.2222 -1.0556 0.3333 0.8889 -0.5000

>> D=sign(max(A38,0))

D =

0 0 1 1 0 0 0 1 1 0

執行結果:
執行結果結合在程式內容中, 如上A矩陣代表以攝氏為單位的體溫受測結果, D矩陣則為判斷結果, 0代表受測者體溫為正常體溫, 1代表體溫高於38度包括有受試者第3,4,8,9號

討論:
有很多作法可以得出相同的結論, 而且matlab直接對矩陣作運算可以免去很多作迴圈的麻煩



----------------------------------------------------------------------------
** Question 2 **

題旨: 在這裡為兩個矩陣的運作,包括(a) D= (A>B) 若A矩陣的元素i大於B矩陣的元素i,則A>B成立 D的元素i為1,反之為零。D矩陣為以1和0組成的邏輯矩陣。 (b) D= (A>5) 也是相同的當A的元素大於5,則為1。(c)D=A+B為矩陣基本加法

分析與程式流程:
Step1: 宣告 A=[ -10 8 6 4 -5 20]與 B=[2 8 5 10 -6 3]

Step2: 直接輸入 D= (A>B) 則矩陣D為是否符合A>B的邏輯矩陣 為(a)所求

Step3: 直接輸入D= (A>5) 則矩陣D為是否符合A>5的邏輯矩陣 為(b)所求

Step4: D=A+B 矩陣運算可直接以矩陣運算而不需利用迴圈

程式內容:
>> % ** Question 2 **
>> clear
>> A=[ -10 8 6 4 -5 20];
>> B=[2 8 5 10 -6 3];
>> D=(A>B)

D =

0 0 1 0 1 1

>> D= (A>5)

D =

0 1 1 0 0 1

>> D=A+B

D =

-8 16 11 14 -11 23

執行結果:
D=(A>B) 的結果 [0 0 1 0 1 1] 表示 在i =3 、5 、6時 Ai > Bi 相同的
在D=(A>5) D= [0 1 1 0 0 1] 表示在i= 2、3、6時 Ai>5 而最後 A+B=D=
[-8 16 11 14 -11 23]

討論:
在這裡也是直接對矩陣作運算,而不需要對矩陣內的元素用迴圈處理,無論是邏輯判斷與基本運算,這是matlab的優勢。



----------------------------------------------------------------------------
** Question 3 **

題旨: 矩陣的基本運算,包括下面五小題
a) A= 3x +y (b) B=5y/x (c) C=4x2y (d) D=sin(x)cos(y) (e)E= 5x sin(2y)

分析與程式流程:
Step1: 首先設定矩陣x=[10 20 30]、y=[1 4 6],之後的計算直接引用即可

Step2: 在矩陣運算裡注意的包括純量和矩陣的相乘用 * ,矩陣和矩陣的相乘
需注意矩陣的格式,和包括sin裡面角度單位

程式內容:
>> % ** Question3 **
>> clear
>> x=[10 20 30] ;
>> y=[1 4 6];
>>
>> A=3*x+y

A =

31 64 96

>> B=5*y/x

B =

0.9643

>> C=4*x'*2*y

C =

80 320 480
160 640 960
240 960 1440

>> D=sind(x)'*cosd(y)

D =

0.1736 0.1732 0.1727
0.3420 0.3412 0.3401
0.4999 0.4988 0.4973

>> E=5*x'* sind(2*y)

E =

1.7450 6.9587 10.3956
3.4899 13.9173 20.7912
5.2349 20.8760 31.1868

執行結果:
如上程式中矩陣A B C D E 分別是五小題(a) (b) (c) (d) (e)的答案

討論:
在矩陣的運算裡,純量乘矩陣為對矩陣裡每個元素作處理,而且用 * 代表相乘而因為x,y 都是1x3矩陣,所以作矩陣相乘時先將x 取為轉置矩陣x’ 在進行矩陣乘法,而關於sind() 是直接對 度 作運算 就不用在特別轉換單位,而且函數處理的對象是矩陣也同等於對裡面的每項元素作處理。



----------------------------------------------------------------------------
** Question 4 **

題旨: 練習對矩陣R=[ 10 30 200 400] 用sum 或prod指令對矩陣內的元素直接作運算,並且練習用M-file的方式撰寫

分析與程式流程:
Step1: 開啟一個新的M-file

Step2: 宣告 R=[ 10 30 200 400] (ohms)

Step3: (a) series form R1,總電阻R1為每一個電阻相加,可利用sum

Step4: (b) parallel form R2,總電阻R2為每一個電阻相乘/電阻總和,可利用
Sum , prod

Step5: 儲存位置並執行
程式內容:
>> % ** Question4 **
clear
R=[ 10 30 200 400];
R1=sum(R)
R2=prod(R)/sum(R)

執行結果:
R1=sum(R)=640 (ohms) 為series form 的總電阻
R2=prod(R)/sum(R) =37500 (ohms) 為parallel form的總電阻

討論:
寫成M-files 為較方便的作法,尤其是在程式處理的問題很複雜的時候,M-files也可以當成 subroutine 或子程式使用,在這裡利用sum或prod可以直接對矩陣內的元素作運算,也是一種方便的用法



----------------------------------------------------------------------------
** Question 5 **

題旨: 矩陣A是一個1x24的列矩陣,將矩陣A利用reshape指令分別變化成
矩陣B ( 3x8 ) 、矩陣C ( 6x4 )與矩陣D ( 2x12 )

分析與程式流程:
Step1: 宣告矩陣A=1:24 為一從1遞增到24的1x24矩陣

Step2: 利用reshape(A, x, y)將矩陣A變化成 有x列 有y行的 x*y 矩陣

程式內容:
>> % ** Question 5 **
>> clear
>> A=1:24;
>>
>> B=reshape(A,3,8)

B =

1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24

>> C=reshape(A,6,4)

C =

1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24

>> D=reshape(A,2,12)

D =

1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24


執行結果:
如程式所示,矩陣B為由矩陣A重新組成的 3x8 矩陣,矩陣C為由矩陣A
重新組成的6x4矩陣,而矩陣D為2x12矩陣

討論:
利用reshape指令可以有效的對矩陣作變形的動作,但限制在於總元素數目
必須固定,而且排序的順序依照矩陣的排列順序以同一行開始排,之後在排
列到下一行,所以按提議可能需搭配轉置矩陣等

9/28/2006

Problem #01:吳子青

>> % Matlab之工程應用 PROBLEM #1
>> % data : 9/21/2006
>> % student : 吳子青 R95622024
>>
>> % -------------------------------------------
>> % ** Question 1 **
>> clear
>> f=200; % f 拉力=200 (Kg)
>> d=20; % d 距離=20 (m)
>>
>> Power=f*d/60/0.101972 % Power 功率(kW)

Power =

653.7742

>> % A1: Power = 653.7742 (kW)

>> % --------------------------------------------
>> % ** Question 2 **
>> clear
>> res1=1; % resistors 1 = 1 (ohms)
>> res2=20; % resistors 2 = 20 (ohms)
>> res3=200; % resistors 3 = 200(ohms)
>> V=110; % voltage = 110 (V)
>>
>> I=V/(res1+res2+res3) % I : current (A)

I =

0.4977

>> w=I*V % w : power (w)

w =

54.7511

>> % A2: I= 0.4977(A) , power= 54.7511(w)

>> % --------------------------------------------
>> % ** Question 3 **
>> clear
>> a=650; %三角形第一邊 a=650(cm)
>> b=428; %三角形第二邊 b=428(cm)
>> c=282; %三角形第三邊 c=282(cm)
>>
>> s=(a+b+c)/2;
>> A=(s*(s-a)*(s-b)*(s-c))^(1/2) %A : 三角形面積 (cm^2)

A =

4.5233e+004

>> % A3: 三角形面積= 4.5233*10^4 (cm^2)

>> % --------------------------------------------
>> % ** Question 4 **
>> clear
>> heat_equ=25000; % heat dissipations from lighting & equipment
>> 25,000BTU/hr
>> hflux_wall=52000; % heat flux through wall & cellings 52,000BTU/hr
>> hflux_aera=84300; % heat flux through aerations 84,300BTU/hr
>>
>> n=(hflux_wall+hflux_aera-heat_equ)/600 % n=hog number

n =

185.5000

>> % A4: 在豬舍不致於過熱及最高飼養效率考量下 n=185 隻應該是最適合的情況

>> % --------------------------------------------
>> % ** Question 5 **
>> clear
>> L=4; % L: width of gate(ft)
>> H=0.9; % H: water head(ft)
>>
>> Q=3.33*(L-0.2*H)^(3/2) % Q: flow rate(cu. ft./s.)

Q =

24.8622

>> % A5: flow rate= 24.8622 (cu. ft./s.)
>>

9/22/2006

r95622024吳子青

學生姓名 : 吳子青
blog : Ching
Email: r95622024@ntu.edu.tw