加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 02:53:09 所属栏目:大数据 来源:网络整理
导读:一:起因 (0)开始个人非常抵触MATLAB编程语言的,肯能是部分编程人员的通病 —— 学会c/c++或者java,就会鄙视其他的语言,懒得尝试其他语言。直到有一天……他发现,他或者她发现自己精通的这门语言实在是解决不了这个问题时,才做出改变。 (1)最近一直

一:起因

(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_thanksmulti regression交通流预测数据DLdatajia1.csv');
Y = load('G:zyp_thanksmulti 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,stats] = regress(y,alpha) ?或者 [b,X) ?此时,默认alpha = 0.05.这里,y是一个 的列向量,X是一个 的矩阵,其中第一列是全1向量(这一点对于回归来说很重要,这一个全1列向量对应回归方程的常数项),一般情况下,需要人工造一个全1列向量。
在返回项[b,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_thanksmulti regression交通流预测数据DLdata.csv');
Y = load('G:zyp_thanksmulti 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,'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,'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,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),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列,行取全部。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读