一:起因
(1)最近一直在处理大数据,从MB ----> GB的变化,是一次质的飞跃,相应的工具也在变 从widows到linux,从单机单核 到 hadoop多节点的计算
(2)问题来了,面对海量的数据,如何从中挖掘实用的信息或者发现潜在的现象,可视化工具可能是必不可少的 ;
(3)可视化工具可以说百度一大篇,可是作为研究者的我们,程序猿的我们可能更希望能够抽象出一种数学模型,对现实的现象进行非常好的描述和刻画
(4)Python(数据清洗和处理) + MATLAB(模型分析) 或 c++/java/hadoop(数据清洗和处理) + MATLAB(模型分析)
(5)先前的一篇博文可以参考 c++ fstream + string 处理大数据 以及 大数据处理之道
(MATLAB 篇(二))
(6)程序猿鄙视学习MATLAB的人,是因为对MATLAB的理解不够深入,MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室);说起处理矩阵(其实就是数值型的数组嘛)计算问题那是首屈一指的快,简便。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等。
二:MATLAB学习(遍历文件夹,矩阵的重新组合,pca)
(1) save(tofilename, ‘ANS‘, ‘-ASCII‘) 保存结果ANS矩阵到制定路径tofilename中
(2)num2str(num) 将数字转化为string型;
(3)strcat(rootpath,num2str(i),‘\*.csv‘) 字符串拼接函数 用于绝对路径的生成
(4)[coef,score,latent,t2] = princomp(data); 主要成分分析法,latent是贡献率排序的(从大到小),score是生成的新数据,根据贡献率排序的
三:PCA讲解
(1)特征抽取是指将高纬度的特征经过某个函数映射至低纬度作为新的特征。常用的特征抽取方法就是PCA
(2)当贡献率累加至95%(当要求不是特别严格时,85%以上也可以),以后的维数会不再显示;所以根据贡献率(例如前两位已经到达95%),那么最后可以降至2维,即可以只选取SCORE的前两列来表示原始数据。
(3)PCA算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵C=\frac{1}{m}XX^\mathsf{T}
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据
四:程序(注释比较详细)
clc; clear all; close all; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for i=1:7 %源文件夹路径 rootpath = 'G:\zyp_thanks\metro_test\resultMergeODByDay_6\'; %输出路径 torootpath = 'G:\zyp_thanks\metro_test\resultMergeODByDay_6_zhengyu\'; %源文件夹路径(获取指定类型的文件) path = strcat(rootpath,num2str(i),'\*.csv'); %输出路径 topath = strcat(torootpath,num2str(i),'\'); %创建输出文件夹 mkdir(topath); dirs=dir(path); % 替换成你想要的路径。读取某个目录的指定类型文件列表,返回结构数组。 dataDir=strcat(rootpath,num2str(i),'\');%数据目录 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dircell=struct2cell(dirs)'; % 结构体(struct)转换成元胞类型(cell),转置一下是让文件名按列排列。 filenames=dircell(:,1); % 第一列是文件名 [m n] = size(filenames); for i=1:m strfilename = [dataDir filenames{i}]; tofilename = [topath filenames{i}]; %fprintf('文件%d:%s\n',i,strfilename); X = load(strfilename); %A,B是获取的不需要改变的数据,下面作为合并用的 A = X(:,1:2); B = X(:,6:7); %获取三维向量,用作pca变换 data = X(:,3:5); %pca [coef,score,latent,t2] = princomp(data); newdata = score(:,1:2);%前 2列 ANS = [A newdata B]; save(tofilename, 'ANS', '-ASCII') end end