大資料處理之道 (MATLAB 篇(二))

來源:互聯網
上載者:User

標籤:matlab   大資料   regress   

一:起因

(0)開始個人非常抵觸MATLAB程式設計語言的,肯能是部分編程人員的通病 —— 學會c/c++或者java,就會鄙視其他的語言,懶得嘗試其他語言。直到有一天……他發現,他或者她發現自己精通的這門語言實在是解決不了這個問題時,才做出改變。

(1)最近一直在處理大資料,從MB ----> GB的變化,是一次質的飛躍,相應的工具也在變 從widows到linux,從單機單核 到 hadoop多節點的計算

(2)問題來了,面對海量的資料,如何從中挖掘實用的資訊或者發現潛在的現象,視覺化檢視可能是必不可少的 ;

(3)視覺化檢視可以說百度一大篇,可是作為研究者的我們,程式猿的我們可能更希望能夠抽象出一種數學模型,對現實的現象進行非常好的描述和刻畫

(4)Python(資料清洗和處理) + MATLAB(模型分析) 或 c++/java/hadoop(資料清洗和處理) + MATLAB(模型分析

(5)先前的一篇博文可以參考   c++ fstream + string 處理大資料 

二:MATLAB函數講解

(1)MATLAB函數的學習,個人認為help + 百度 已經足夠 了,這也是比較迅速的學習和應用的方法

(2)有其他語言做基礎,MATLAB上手是非常容易的

(3)多元線性迴歸(regress)

clcclear allclose allX = load('G:\zyp_thanks\multi regression\交通流預測資料\DLdatajia1.csv');Y = load('G:\zyp_thanks\multi regression\交通流預測資料\DLlabel.csv');xlabel('test x軸');ylabel('test y軸');title('迴歸分析表')[b,bint,r,rint,stats]=regress( Y, X ,0.9);%returns a p-by-1 vector b of coefficient estimates for a multilinear%regression of the responses in y on the predictors in X. X is an n-by-p%matrix of p predictors at each of n observations. y is an n-by-1 vector of%observed responses.uses a 100*(1-alpha)% confidence level Y_Predict = X*b;%兩個曲線plot(Y,'r');hold on plot(Y_Predict,'b');ERROR = abs(Y_Predict - Y);%平均絕對誤差mean(ERROR)

(4)函數說明:

進行線性迴歸時,有4個基本假定:① 因變數與自變數之間存線上性關係;② 殘差是獨立的;③ 殘差滿足方差奇性;④ 殘差滿足常態分佈。
  在Matlab軟體包中有一個做一般多元迴歸分析的命令regeress,調用格式如下: [b, bint, r, rint, stats] = regress(y,X,alpha)  或者 [b, bint, r, rint, stats] = regress(y,X)  此時,預設alpha = 0.05.這裡,y是一個 的列向量,X是一個 的矩陣,其中第一列是全1向量(這一點對於迴歸來說很重要,這一個全1列向量對應迴歸方程的常數項),一般情況下,需要人工造一個全1列向量。
在返回項[b,bint,r,rint,stats]中,
  ① 是迴歸方程的係數; ② 是一個 矩陣,它的第 行表示 的(1-alpha)信賴區間; ③ 是 的殘差列向量; ④ 是矩陣,它的第 行表示第 個殘差 的(1-alpha)信賴區間;
注釋:bint是迴歸係數的區間估計,r是殘差,rint是信賴區間,stats是用於檢驗迴歸模型的統計量,stats:第一項:相關係數;第二項:F統計(一般說來,F_檢驗值越大越好);第三項:是與統計量F對應的機率P;第四項:估計誤差方差。alpha是顯著性水平(預設的時候為0.05)。相關係數r^2越大,說明迴歸方程越顯著;與F對應的機率P<alpha時候拒絕H0,迴歸模型成立。

hold on 和hold off,是相對使用的
前者的意思是,你在當前圖的軸(座標系)中畫了一幅圖,再畫另一幅圖時,原來的圖還在,與新圖共存,都看得到
後者表達的是,你在當前圖的軸(座標系)中畫了一幅圖,此時,狀態是hold off,則再畫另一幅圖時,原來的圖就看不到了,在軸上繪製的是新圖,原圖被替換了


(5) pca + regress

clear allclose allX = load('G:\zyp_thanks\multi regression\交通流預測資料\DLdata.csv');Y = load('G:\zyp_thanks\multi regression\交通流預測資料\DLlabel.csv');%PCA  [coef,score1,latent,t2] = princomp(X);%return …… the scores are the data formed by transforming the origtinal%data into the space of the principal components ……X =X*coef';  % 原來的X_Model = X(1:600,1:10);%讀取前600行 前 10列Y_Model = Y(1:600);%讀取前600行X_Test = X(601:1052,1:10);Y_Test = Y(601:1052);b=regress( Y_Model, X_Model );%訓練集Y_Predict = X_Model*b;%兩個曲線plot(Y_Model,'r');hold on plot(Y_Predict,'b');ERROR = abs(Y_Predict - Y_Model);%平均絕對誤差mean(ERROR)%測試集% 修飾圖形xlabel('時間間隔(10min)');% x軸的注釋ylabel('速度值(km/h)');title('MultiLinear_Testpca');%圖形標題legend('訓練集-真實值', '訓練集-預測值'); % 圖形注釋grid on; %顯示格線Y_Predict = X_Test*b;%兩個曲線figure,plot(Y_Test,'r');hold on plot(Y_Predict,'b');ERROR = abs(Y_Predict - Y_Test);%平均絕對誤差mean(ERROR)% 修飾圖形xlabel('時間間隔(10min)');% x軸的注釋ylabel('速度值(km/h)');title('MultiLinear_Testpca');%圖形標題legend('測試集-真實值', '測試集-預測值'); % 圖形注釋grid on; %顯示格線

(6)函數解釋說明  princomp函數

貢獻率:每一維資料對於區分整個資料的貢獻,貢獻率最大的顯然是主成分,第二大的是次主成分...[coef,score,latent,t2] = princomp(x);(個人觀點):
x:為要輸入的n維未經處理資料。帶入這個matlab內建函數,將會產生新的n維加工後的資料(即score)。此資料與之前的n維未經處理資料一一對應。
score:產生的n維加工後的資料存在score裡。它是對未經處理資料進行的分析,進而在新的座標系下獲得的資料。他將這n維資料按貢獻率由大到小排列。(即在改變座標系的情況下,又對n維資料排序)
latent:是一維列向量,每一個資料是對應score裡相應維的貢獻率,因為資料有n維所以列向量有n個資料。由大到小排列(因為score也是按貢獻率由大到小排列)。
coef:是係數矩陣。通過cofe可以知道x是怎樣轉換成score的。
則模型為從未經處理資料出發:
score= bsxfun(@minus,x,mean(x,1))*coef;(作用:可以把測試資料通過此方法轉變為新的座標系)
逆變換:
x= bsxfun(@plus,score*inv(coef),mean(x,1))
之前的錯誤認識:
1.認為主成分分析中latent顯示的貢獻值是未經處理資料的,其實是加工後的資料的。解釋:對未經處理資料既然選擇PCA方法,那麼電腦認為未經處理資料每維之間可能存在關聯,你想去掉關聯、降低維數。所以採用這種方法的。所以電腦並不關心未經處理資料的貢獻值,因為你不會去用了,用的是加工後的資料(這也是為什麼當把輸入資料每一維的順序改變後,score、latent不受影響的原因)。
2.認為PCA分析後自動降維,不對。PCA後會有貢獻值,是輸入者根據自己想要的貢獻值進行維數的改變,進而產生資料。(一般大家會取貢獻值在85%以上,要求高一點95%)。用你的原矩陣x*coeff(:,1:n)才是你要的的新資料,其中的n是你想降到多少維。
3.PCA分析,只根據輸入資料的特徵進行主成分分析,與輸出有多少類型,每個資料對應哪個類型無關。如果樣本已經分好類型,那PCA後勢必對結果的準確性有一定影響,我認為對於此類資料的PCA,就是在降維與準確性間找一個平衡點的問題,讓資料即不會維數多而使運算複雜,又有較高的解析度。
(7)對矩陣資料的讀取
假如有一個4X3的矩陣,選出前三行構成一個新矩陣,再選出前兩列構成另外一個矩陣。
a=[1 2 3;4 5 6;7 8 9;10 11 12];
b=a(1:3,:)
b=[1 2 3;4 5 6;7 8 9]
c=a(:,1:2)
c=[1 2;4 5;7 8; 10 11]
說明 ‘:‘代表取全部,‘,’前面代表行,後面代表列。如果‘,’前面為‘:’則行取全部,如果‘,’後面為‘:‘,則列取全部。
b=a(1:3,:)中1:3代表取1至3行,列取全部。
c=a(:,1:2)中1:2代表取1至2列,行取全部。

大資料處理之道 (MATLAB 篇(二))

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.