Re: [問題] 矩陣求histogram已回收
※ 引述《kuroroTW (kuroro...)》之銘言:
恕刪
: 我有一個 matrix 裡面的元素都介於 -180~180
: matrix 大小是 400*500
: 所以有 200000 個 元素 且元素值介於 -180~180
: 我現在要畫 histogram
: 橫坐標是 -180~180 (代表元素的值)
: 縱座標是 0~1 (每個元素出現的機率(出現的次數/200000)) 縱座標就是機率密度
: 簡單的說話出來的曲線或者直方圖下所包圍的面積為1
恕刪
:
雖然這可能不是一個很困難的問題
以長條圖來表示出現機率(次數)應是一個常見的應用
如何將histogram畫的清楚適當亦是一個重要的課題
首先根據原po敘述 原始資料為一400x500之矩陣
其中各值皆介於-180~180之間
為求測試結果較為明顯 在此使用常態隨機變數
因此可能測試資料會超過範圍
取常態之平均值為0且標準差為60
正負三倍標準差±180以內約佔全部資料之99.7%
mua=0;stda=60;
A=normrnd(mua,stda,400,500); %原始資料
接著需要決定次數圖之基底
這關係到長條圖之解析度
亦可直接使用原始資料之基底 例如都是整數
在此以每1為一間隔取-180~180
xmin=-180;xmax=180;xacc=1;
xx=xmin:xacc:xmax; % eq1
再來即可以此基底利用hist計算各基底之次數
原po要求需以機率表示 因此除以總次數
yy=hist(A(:),xx)/length(A(:)); % eq2
其中A(:)即為reshape(A,[],1)
因使用常態隨機為測試資料 會有超過正負180之值
所以將測試過程作一些調整
xx1=xmin-1:xacc:xmax+1; % eq1'
yy1=hist(A(:),xx1)/length(A(:)); % eq2'
xx=xx1(2:length(xx1)-1);
yy=yy1(2:length(yy1)-1);
如此即可繪製長條圖
bar(xx,yy);
xlabel('XXX'); %自行填入
ylabel('YYY');
調整X軸之範圍 在規定範圍內再多半格
xlim([xmin-0.5*xacc xmax+0.5*xacc]);
如此即可繪成原po所需之histogram
繪製常態分佈機率密度曲線
hold on;
plot(xx,normpdf(xx,mua,stda),'r'); % i'm not sure if it is correct
hold off;
長條圖之分佈與紅色曲線很接近
與本測試資料預期為常態分佈相符
測試長條圖底下之面積
sum(yy) % eq3
結果稍小於1 其因為此有小部份超過預設之範圍
sum(yy1)
此結果即為1
試計算原始資料未超過範圍之資料數量(比率)
length(find(abs(A(:))<=180))/length(A(:))
length(find(abs(A(:))<181))/length(A(:))
此二結果皆與eq3之結果稍有不同
length(find(abs(A(:))<180.5))/length(A(:))
此結果即與eq3相同 亦與正負三倍標準差約佔總數量之99.7%很接近
normcdf(xmax,mua,stda)-normcdf(xmin,mua,stda)
最後 儲存畫好的長條圖
pring('-depsc', 'hist1.eps');
或是儲存長條圖資料(依各人需求不同自行調整)
tmp=[xx' yy'];
save('hist1.eps', 'tmp', '-ascii');
總結:原po可參考hist bar length sum reshape等document
如本篇內容有錯誤煩請不吝賜教 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.165.163
※ 編輯: iccfish 來自: 140.117.165.163 (10/09 16:33)
推
10/09 19:40, , 1F
10/09 19:40, 1F
→
10/09 23:31, , 2F
10/09 23:31, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):