1. MATLAB数据分析入门:从散点图到回归分析

第一次用MATLAB做数据分析时,我被它简洁的语法震撼到了。记得当时处理一组销售数据,只需要三行代码就生成了带趋势线的散点图,比Excel手动操作快得多。先来看个基础例子:

% 生成随机销售数据
month = 1:12;
sales = [120 150 180 210 230 245 260 275 290 310 330 350];

% 绘制散点图
scatter(month, sales, 'filled')
hold on

% 添加趋势线
p = polyfit(month, sales, 1);
yfit = polyval(p, month);
plot(month, yfit, 'r-')
xlabel('月份')
ylabel('销售额(万元)')

这个例子展示了MATLAB处理数据的典型流程:数据准备→可视化→建模分析。实际工作中,我经常用scatter配合polyfit快速判断数据趋势,比直接上复杂模型更直观。有个实用技巧:按住图形窗口的"Data Cursor"按钮,可以直接点击查看数据点的精确值。

线性回归是数据分析的标配工具。有次处理传感器数据时,发现原始代码计算R²需要手动实现,其实MATLAB的fitlm函数已经封装好了完整统计量:

% 使用内置回归模型
mdl = fitlm(month', sales');
disp(mdl)

% 预测下个月销售额
next_month = 13;
pred_sales = predict(mdl, next_month);

fitlm输出的模型摘要包含系数显著性、R²、调整R²等关键指标。有个坑要注意:输入数据如果是行向量,记得转置成列向量,这是新手常犯的错误。

2. 层次分析法实战:用MATLAB做决策评估

去年帮朋友选办公地点时,用层次分析法(AHP)量化比较了三个备选方案。AHP的核心是构造判断矩阵,MATLAB的矩阵运算让这个过程变得简单:

% 准则层判断矩阵
criteria = [1    3    5;
            1/3  1    3;
            1/5 1/3   1];

% 计算特征向量
[V, D] = eig(criteria);
weights = V(:,1)/sum(V(:,1));

% 一致性检验
lambda_max = max(diag(D));
CI = (lambda_max - size(criteria,1)) / (size(criteria,1)-1);
RI = 0.58; % 3阶矩阵的随机一致性指标
CR = CI/RI;

实际应用中发现,当CR>0.1时需要调整判断矩阵。有个偷懒技巧:用consistency函数自动修正不一致矩阵:

[corrected_matrix, improvement] = consistency(criteria);

处理方案层时,我通常会把所有判断矩阵存成三维数组。比如对3个准则下的4个方案:

alternatives = zeros(4,4,3);
alternatives(:,:,1) = [1 2 3 4; 1/2 1 2 3; 1/3 1/2 1 2; 1/4 1/3 1/2 1];
% 其他两个准则的判断矩阵...

最终用pagemtimes函数做张量乘法计算全局权重,比逐层计算更高效。

3. 时间序列预测:灰色系统建模详解

灰色预测模型GM(1,1)在数据量少时特别有用。去年预测季度营收时,传统方法需要至少24个月数据,而灰色模型用8个月数据就达到了85%的准确率。核心代码如下:

function [pred, rel_err] = grey_model(data, pred_steps)
    % 累加生成
    cum_data = cumsum(data);
    
    % 构造背景值
    n = length(data);
    Z = (cum_data(1:n-1) + cum_data(2:n)) / 2;
    
    % 最小二乘估计
    Y = data(2:end)';
    B = [-Z', ones(n-1,1)];
    a_b = pinv(B'*B)*B'*Y;
    a = a_b(1); b = a_b(2);
    
    % 预测
    pred = zeros(1, n + pred_steps);
    pred(1) = data(1);
    for i = 2:(n + pred_steps)
        pred(i) = (data(1) - b/a)*exp(-a*(i-1)) + b/a;
    end
    pred = diff([0 pred]);
    
    % 计算相对误差
    rel_err = abs(pred(1:n) - data)./data;
end

使用时发现几个关键点:

  1. 原始数据波动不能太大,建议先做平滑处理
  2. 预测步数pred_steps建议不超过数据长度的1/3
  3. 长期预测时,用exp(-a)判断模型稳定性(小于0.3效果较好)

4. 高级算法实现:从聚类到神经网络

MATLAB的机器学习工具箱让复杂算法实现变得简单。分享两个实战案例:

K-means聚类分析商品特征

% 加载商品数据(价格、销量、评分)
data = readtable('products.csv');
X = [data.Price, data.Sales, data.Rating];

% 数据标准化
X_norm = normalize(X);

% 确定最佳聚类数
eva = evalclusters(X_norm, 'kmeans', 'CalinskiHarabasz', 'KList', 1:6);

% 聚类分析
[idx, C] = kmeans(X_norm, eva.OptimalK, 'Replicates', 10);

% 可视化
figure
gscatter(X_norm(:,1), X_norm(:,2), idx)
hold on
plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 15)

BP神经网络预测

% 数据准备
load housing_dataset.mat
inputs = housingInputs;
targets = housingTargets;

% 创建网络
net = fitnet([10 5]);  % 两个隐藏层(10节点和5节点)

% 划分训练/测试集
net.divideParam.trainRatio = 0.7;
net.divideParam.valRatio = 0.15;
net.divideParam.testRatio = 0.15;

% 训练网络
[net, tr] = train(net, inputs, targets);

% 测试性能
testX = inputs(:, tr.testInd);
testY = targets(tr.testInd);
predY = net(testX);

% 计算R²
R2 = 1 - sum((testY - predY).^2)/sum((testY - mean(testY)).^2);

在神经网络调参时,我发现这些经验值比较靠谱:

  • 学习率:0.01-0.1
  • 迭代次数:1000-5000
  • 隐藏层节点数:输入输出的平均值±20%

5. 优化算法实战:遗传算法与整数规划

MATLAB的优化工具箱支持多种算法。分享一个生产排程的案例,需要用整数规划确定最佳生产批次:

% 定义问题
f = [3.2 2.8 4.1 3.5]; % 单位成本
intcon = 1:4;          % 整数变量
A = [2 1 3 2;          % 资源消耗
     1 2 1 3];
b = [100; 80];         % 资源上限
lb = zeros(4,1);       % 下限
ub = [30 25 20 15]';   % 上限

% 求解
options = optimoptions('intlinprog', 'Display', 'iter');
[x, fval] = intlinprog(f, intcon, A, b, [], [], lb, ub, options);

遗传算法解决TSP问题时,这个模板很实用:

% 城市坐标
cities = [0.6683 0.2536; 0.6195 0.2634; 0.4 0.4439; 0.2439 0.1463];

% 适应度函数
function dist = tsp_fitness(path)
    global cities
    dist = 0;
    for i = 1:length(path)-1
        dist = dist + norm(cities(path(i),:) - cities(path(i+1),:));
    end
    dist = dist + norm(cities(path(end),:) - cities(path(1),:)); % 返回起点
end

% 遗传算法配置
options = optimoptions('ga', 'PopulationSize', 50, ...
                      'MaxGenerations', 100, ...
                      'Display', 'iter');
[x, fval] = ga(@tsp_fitness, size(cities,1), [], [], [], [], ...
               ones(size(cities,1),1), size(cities,1)*ones(size(cities,1),1), ...
               [], 1:size(cities,1), options);

实际项目中,遗传算法的参数设置很关键:

  • 种群大小:问题规模的2-5倍
  • 交叉概率:0.7-0.9
  • 变异概率:1/问题规模
  • 精英保留:种群大小的5-10%

6. 综合评价方法:熵权法与灰色关联分析

多指标评价时,我常用熵权法自动确定权重。这个实现避免了手动赋权的主观性:

function [weights, scores] = entropy_weight(data)
    % 数据标准化
    data_norm = (data - min(data)) ./ (max(data) - min(data));
    
    % 计算比重
    P = data_norm ./ sum(data_norm);
    
    % 计算熵值
    k = 1 / log(size(data,1));
    E = -k * sum(P .* log(P + eps)); % 加eps避免log(0)
    
    % 计算权重
    d = 1 - E;
    weights = d / sum(d);
    
    % 计算综合得分
    scores = data_norm * weights';
end

灰色关联分析比较不同方案时,这个模板可以直接套用:

function [corr, ranking] = grey_relation(ref, data)
    % 数据标准化
    ref_norm = ref / mean(ref);
    data_norm = data ./ mean(data, 2);
    
    % 计算差值
    delta = abs(data_norm - ref_norm);
    
    % 计算关联系数
    rho = 0.5;
    gamma = (min(delta(:)) + rho * max(delta(:))) ./ (delta + rho * max(delta(:)));
    
    % 综合关联度
    corr = mean(gamma, 2);
    
    % 排序
    [~, ranking] = sort(corr, 'descend');
end

应用中发现几个经验:

  1. 参考序列的选择直接影响结果,通常选理想最优值
  2. 分辨系数ρ取0.5时区分度较好
  3. 数据量纲差异大时,建议先做标准化

7. 实用技巧与性能优化

代码加速技巧

  • 向量化运算:用arrayfun替代循环
% 慢速循环
for i = 1:10000
    y(i) = sin(x(i)) + cos(x(i)^2);
end

% 快速向量化
y = sin(x) + cos(x.^2);
  • 预分配内存:大幅提升大数组处理速度
% 不好的做法
result = [];
for i = 1:10000
    result = [result; compute(i)];
end

% 优化做法
result = zeros(10000,1);
for i = 1:10000
    result(i) = compute(i);
end

调试技巧

  • 用dbstop if error设置错误断点
  • tic/toc计时关键代码段
  • profile viewer分析性能瓶颈

数据可视化进阶

% 双坐标轴图表
yyaxis left
plot(x, y1)
ylabel('温度(℃)')

yyaxis right
plot(x, y2)
ylabel('湿度(%)')

% 交互式图表
fig = uifigure;
ax = uiaxes(fig);
plot(ax, x, y)

8. 工程应用案例:从数据到部署

去年开发的质量预测系统,完整流程如下:

  1. 数据预处理
raw_data = readtable('sensor_data.csv');
clean_data = rmmissing(raw_data);  % 删除缺失值
norm_data = normalize(clean_data, 'zscore');  % Z-score标准化
  1. 特征工程
% 时域特征
features.mean = mean(norm_data);
features.std = std(norm_data);
features.rms = rms(norm_data);

% 频域特征
Fs = 1000; % 采样频率
[pxx, f] = pwelch(norm_data, [], [], [], Fs);
features.peak_freq = f(pxx == max(pxx));
  1. 模型训练与验证
% 集成学习
ens = fitcensemble(features, labels, 'Method', 'Bag', ...
                  'Learners', 'tree', 'CrossVal', 'on');

% 模型评估
[kfold_loss, kfold_acc] = kfoldLoss(ens);
conf_mat = confusionmat(labels, predict(ens, features));
  1. 部署为Web应用
% 生成MATLAB Compiler SDK组件
args = {'-W', 'web:QualityPredictor', ...
        '-T', 'link:lib', ...
        '-d', 'deploy_folder'};
mcc('-m', 'predictor_main.m', args{:});

% 打包为Docker容器
system('docker build -t quality-predictor .');

这套系统在实际产线运行稳定,预测准确率达到92%。关键收获是:MATLAB的Production Server让模型部署变得简单,支持Java/Python/C#等多种语言调用。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐