你好,游客 登录
背景:
阅读新闻

大数据处理之道(MATLAB 篇(二))

[日期:2014-12-17] 来源:CSDN博客  作者:瞭望天空 [字体: ]

一:起因

(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)

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. clc 
  2. clear all 
  3. close all 
  4. X = load('G:\zyp_thanks\multi regression\交通流预测数据\DLdatajia1.csv'); 
  5. Y = load('G:\zyp_thanks\multi regression\交通流预测数据\DLlabel.csv'); 
  6. xlabel('test x轴'); 
  7. ylabel('test y轴'); 
  8. title('回归分析表') 
  9. [b,bint,r,rint,stats]=regress( Y, X ,0.9); 
  10. %returns a p-by-1 vector b of coefficient estimates for a multilinear 
  11. %regression of the responses in y on the predictors in X. X is an n-by-p 
  12. %matrix of p predictors at each of n observations. y is an n-by-1 vector of 
  13. %observed responses.uses a 100*(1-alpha)% confidence level   
  14. Y_Predict = X*b; 
  15. %两个曲线 
  16. plot(Y,'r'); 
  17. hold on   
  18. plot(Y_Predict,'b'); 
  19. ERROR = abs(Y_Predict - Y); 
  20. %平均绝对误差 
  21. 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

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. clear all 
  2. close all 
  3. X = load('G:\zyp_thanks\multi regression\交通流预测数据\DLdata.csv'); 
  4. Y = load('G:\zyp_thanks\multi regression\交通流预测数据\DLlabel.csv'); 
  5. %PCA   
  6. [coef,score1,latent,t2] = princomp(X); 
  7. %return …… the scores are the data formed by transforming the origtinal 
  8. %data into the space of the principal components …… 
  9. X =X*coef';  % 原来的 
  10. X_Model = X(1:600,1:10);%读取前600行 前 10列 
  11. Y_Model = Y(1:600);%读取前600行 
  12. X_Test = X(601:1052,1:10); 
  13. Y_Test = Y(601:1052); 
  14. b=regress( Y_Model, X_Model ); 
  15. %训练集 
  16. Y_Predict = X_Model*b; 
  17. %两个曲线 
  18. plot(Y_Model,'r'); 
  19. hold on   
  20. plot(Y_Predict,'b'); 
  21. ERROR = abs(Y_Predict - Y_Model); 
  22. %平均绝对误差 
  23. mean(ERROR) 
  24. %测试集 
  25. % 修饰图形 
  26. xlabel('时间间隔(10min)');% x轴的注释 
  27. ylabel('速度值(km/h)'); 
  28. title('MultiLinear_Testpca');%图形标题 
  29. legend('训练集-真实值', '训练集-预测值'); % 图形注释 
  30. grid on; %显示格线 
  31. Y_Predict = X_Test*b; 
  32. %两个曲线 
  33. figure,plot(Y_Test,'r'); 
  34. hold on   
  35. plot(Y_Predict,'b'); 
  36. ERROR = abs(Y_Predict - Y_Test); 
  37. %平均绝对误差 
  38. mean(ERROR) 
  39. % 修饰图形 
  40. xlabel('时间间隔(10min)');% x轴的注释 
  41. ylabel('速度值(km/h)'); 
  42. title('MultiLinear_Testpca');%图形标题 
  43. legend('测试集-真实值', '测试集-预测值'); % 图形注释 
  44. 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列,行取全部。

原文链接:http://blog.csdn.net/u010700335/article/details/41927471





收藏 推荐 打印 | 录入: | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款