首页 > 代码库 > 大数据处理之道 (MATLAB 篇(二))
大数据处理之道 (MATLAB 篇(二))
一:起因
(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)
clc clear all close all X = 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 all close all X = 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 篇(二))