经典机器学习算法解析与MATLAB实现
·
机器学习作为人工智能的核心领域,正在深刻改变我们的世界。本文将深入解析几种经典机器学习算法的原理,并使用MATLAB实现。
1.线性回归算法
原理解析:
线性回归是机器学习中最简单的监督学习算法,旨在找到一条最佳拟合直线(或超平面)来描述自变量与因变量之间的关系。
数学模型:y = w₀ + w₁x₁ + w₂x₂ + ... + wₙxₙ
其中y是因变量,x₁到xₙ是自变量,w₀是截距,w₁到wₙ是系数。
MATLAB实现
% 生成示例数据
rng(42); % 设置随机种子保证可重复性
X = 2.5 * randn(100, 1) + 1.5;
res = 0.5 * randn(100, 1);
y = 2 + 0.3 * X + res;
% 线性回归拟合
X_with_intercept = [ones(length(X), 1), X];
weights = X_with_intercept \ y;
% 预测
y_pred = X_with_intercept * weights;
% 可视化结果
figure('Position', [100, 100, 1200, 400]);
subplot(1, 2, 1);
scatter(X, y, 50, 'filled', 'MarkerFaceAlpha', 0.6);
hold on;
plot(X, y_pred, 'r-', 'LineWidth', 2);
xlabel('自变量 X');
ylabel('因变量 Y');
title('线性回归拟合结果');
legend('原始数据', '回归直线', 'Location', 'northwest');
grid on;
% 残差分析
subplot(1, 2, 2);
residuals = y - y_pred;
scatter(y_pred, residuals, 50, 'filled', 'MarkerFaceAlpha', 0.6);
hold on;
plot([min(y_pred), max(y_pred)], [0, 0], 'k--', 'LineWidth', 1.5);
xlabel('预测值');
ylabel('残差');
title('残差分析图');
grid on;
% 计算评估指标
mse = mean(residuals.^2);
rmse = sqrt(mse);
r_squared = 1 - sum(residuals.^2) / sum((y - mean(y)).^2);
fprintf('线性回归结果:\n');
fprintf('截距: %.4f\n', weights(1));
fprintf('系数: %.4f\n', weights(2));
fprintf('均方根误差(RMSE): %.4f\n', rmse);
fprintf('R²决定系数: %.4f\n', r_squared);

2.K均值聚类算法
原理解析:
K均值聚类是一种经典的无监督学习算法,通过迭代将数据划分为K个簇,使得同一簇内的数据点尽可能相似,不同簇的数据点尽可能不同。
算法步骤:
-
随机选择K个初始聚类中心
-
将每个数据点分配到最近的聚类中心
-
重新计算每个簇的聚类中心
-
重复步骤2-3直到收敛
MATLAB实现
% 生成聚类数据
rng(123);
data1 = mvnrnd([2, 2], [0.5, 0.3; 0.3, 0.5], 100);
data2 = mvnrnd([-1, -1], [0.4, 0.2; 0.2, 0.4], 100);
data3 = mvnrnd([3, -2], [0.6, 0.1; 0.1, 0.6], 100);
X = [data1; data2; data3];
% K均值聚类
k = 3;
[cluster_idx, centroids] = kmeans(X, k);
% 可视化聚类结果
figure('Position', [100, 100, 1000, 500]);
% 原始数据
subplot(1, 2, 1);
scatter(X(:, 1), X(:, 2), 50, 'b', 'filled', 'MarkerFaceAlpha', 0.6);
xlabel('特征 1');
ylabel('特征 2');
title('原始数据分布');
grid on;
axis equal;
% 聚类结果
subplot(1, 2, 2);
colors = ['r', 'g', 'b', 'c', 'm', 'y'];
for i = 1:k
cluster_points = X(cluster_idx == i, :);
scatter(cluster_points(:, 1), cluster_points(:, 2), 50, colors(i), ...
'filled', 'MarkerFaceAlpha', 0.6);
hold on;
plot(centroids(i, 1), centroids(i, 2), 'kx', 'MarkerSize', 15, ...
'LineWidth', 3, 'MarkerSize', 10);
end
xlabel('特征 1');
ylabel('特征 2');
title('K均值聚类结果');
legend('簇 1', '中心 1', '簇 2', '中心 2', '簇 3', '中心 3', 'Location', 'best');
grid on;
axis equal;
% 计算聚类质量指标
silhouette_scores = silhouette(X, cluster_idx);
avg_silhouette = mean(silhouette_scores);
fprintf('\nK均值聚类结果:\n');
fprintf('聚类中心:\n');
disp(centroids);
fprintf('平均轮廓系数: %.4f\n', avg_silhouette);

3.支持向量机(SVM)
原理解析:
支持向量机是一种强大的分类算法,其核心思想是找到一个最优超平面,使得两类数据之间的间隔最大化。
对于线性可分情况,SVM寻找满足以下条件的超平面:wᵀx + b = 0
其中w是法向量,b是偏置项,使得所有数据点满足:yᵢ(wᵀxᵢ + b) ≥ 1
MATLAB实现
% 生成分类数据
rng(456);
class1 = mvnrnd([1, 1], [0.3, 0.2; 0.2, 0.3], 50);
class2 = mvnrnd([3, 3], [0.4, 0.1; 0.1, 0.4], 50);
X = [class1; class2];
y = [ones(50, 1); -ones(50, 1)];
% 训练SVM模型
SVMModel = fitcsvm(X, y, 'KernelFunction', 'linear', 'BoxConstraint', 1);
% 预测
[labels, scores] = predict(SVMModel, X);
% 可视化SVM结果
figure('Position', [100, 100, 1200, 500]);
% 原始数据分布
subplot(1, 2, 1);
gscatter(X(:, 1), X(:, 2), y, 'rb', 'o*', 8);
xlabel('特征 1');
ylabel('特征 2');
title('原始数据分布');
legend('类别 1', '类别 2', 'Location', 'northwest');
grid on;
% SVM分类结果
subplot(1, 2, 2);
% 创建网格用于绘制决策边界
d = 0.02;
[x1Grid, x2Grid] = meshgrid(min(X(:, 1)):d:max(X(:, 1)), ...
min(X(:, 2)):d:max(X(:, 2)));
xGrid = [x1Grid(:), x2Grid(:)];
[~, scoresGrid] = predict(SVMModel, xGrid);
% 绘制决策边界和间隔
contour(x1Grid, x2Grid, reshape(scoresGrid(:, 2), size(x1Grid)), [0, 0], 'k-', 'LineWidth', 2);
hold on;
contour(x1Grid, x2Grid, reshape(scoresGrid(:, 2), size(x1Grid)), [-1, 1], 'k--', 'LineWidth', 1);
% 绘制支持向量
sv = X(SVMModel.IsSupportVector, :);
gscatter(X(:, 1), X(:, 2), y, 'rb', 'o*', 8);
plot(sv(:, 1), sv(:, 2), 'ko', 'MarkerSize', 10, 'LineWidth', 1.5);
xlabel('特征 1');
ylabel('特征 2');
title('SVM分类结果');
legend('决策边界', '间隔边界', '类别 1', '类别 2', '支持向量', 'Location', 'northwest');
grid on;
% 计算分类准确率
accuracy = sum(labels == y) / length(y) * 100;
fprintf('\nSVM分类结果:\n');
fprintf('分类准确率: %.2f%%\n', accuracy);
fprintf('支持向量数量: %d\n', sum(SVMModel.IsSupportVector));

4.主成分分析(PCA)
原理解析:
PCA是一种常用的降维技术,通过正交变换将可能存在相关性的变量转换为一组线性不相关的主成分,按方差大小排序。
数学原理:
-
计算数据的协方差矩阵
-
计算协方差矩阵的特征值和特征向量
-
按特征值大小排序特征向量
-
选择前k个特征向量作为主成分
MATLAB实现
% 生成高维数据
rng(789);
n_samples = 200;
n_features = 3;
X = mvnrnd([0, 0, 0], [3, 2, 1.5; 2, 2, 1; 1.5, 1, 1], n_samples);
% 数据标准化
X_normalized = zscore(X);
% PCA降维
[coeff, score, latent, ~, explained] = pca(X_normalized);
% 可视化PCA结果
figure('Position', [100, 100, 1500, 500]);
% 原始3D数据
subplot(1, 3, 1);
scatter3(X_normalized(:, 1), X_normalized(:, 2), X_normalized(:, 3), ...
50, 'filled', 'MarkerFaceAlpha', 0.6);
xlabel('特征 1');
ylabel('特征 2');
zlabel('特征 3');
title('原始三维数据');
grid on;
% 二维投影
subplot(1, 3, 2);
scatter(score(:, 1), score(:, 2), 50, 'filled', 'MarkerFaceAlpha', 0.6);
xlabel('第一主成分');
ylabel('第二主成分');
title('PCA二维投影');
grid on;
axis equal;
% 方差解释比例
subplot(1, 3, 3);
pareto(explained);
xlabel('主成分');
ylabel('方差解释比例 (%)');
title('主成分方差解释比例');
% 计算累计方差解释比例
cumulative_variance = cumsum(explained);
fprintf('\nPCA分析结果:\n');
fprintf('各主成分方差解释比例: %.2f%%, %.2f%%, %.2f%%\n', explained);
fprintf('前两个主成分累计方差解释比例: %.2f%%\n', cumulative_variance(2));
fprintf('主成分系数矩阵:\n');
disp(coeff);

算法对比与总结
-
线性回归:简单直观,适合连续值预测
-
K均值聚类:无监督学习,适合数据分组
-
支持向量机:分类性能优秀,适合小样本数据
-
主成分分析:降维利器,适合数据可视化和特征提取
更多推荐



所有评论(0)