基于MATLAB实现无监督数据建模

一、数据准备与预处理

1. 数据加载与标准化
matlab 复制代码
%% 加载示例数据(以Iris数据集为例)
load fisheriris
X = meas(:,1:2); % 使用前两个特征

%% 数据标准化
mu = mean(X);
sigma = std(X);
X_norm = (X - mu) ./ sigma; % Z-score标准化
2. 缺失值处理
matlab 复制代码
% 检测缺失值
missing = isnan(X);

% 删除含缺失值的样本
X_clean = X(~any(missing,2),:);

二、聚类分析实现

1. K-means聚类
matlab 复制代码
% 参数设置
K = 3; % 簇数量
max_iters = 100;

% 执行K-means
[idx, centroids] = kmeans(X_norm, K, 'MaxIter', max_iters);

% 可视化结果
figure;
gscatter(X_norm(:,1), X_norm(:,2), idx);
hold on;
plot(centroids(:,1), centroids(:,2), 'kx', 'MarkerSize', 15);
title('K-means聚类结果');
2. 层次聚类
matlab 复制代码
% 计算距离矩阵
Z = linkage(X_norm, 'ward');

% 生成聚类树
figure;
dendrogram(Z);
title('层次聚类树状图');

% 划分簇
T = cluster(Z, 'maxclust', 3);
3. DBSCAN密度聚类
matlab 复制代码
% 参数设置
eps = 0.5; % 邻域半径
minPts = 5; % 最小点数

% 执行DBSCAN
labels = dbscan(X_norm, eps, minPts);

% 可视化
figure;
gscatter(X_norm(:,1), X_norm(:,2), labels);
title('DBSCAN聚类结果');

三、降维与特征提取

1. 主成分分析(PCA)
matlab 复制代码
% 执行PCA
[coeff, score, latent] = pca(X_norm);

% 可视化主成分贡献率
figure;
pareto(latent/sum(latent));
xlabel('主成分序号');
ylabel('方差贡献率(%)');
title('PCA方差解释率');

% 降维可视化
figure;
scatter(score(:,1), score(:,2));
title('PCA降维结果');
2. t-SNE非线性降维
matlab 复制代码
% 执行t-SNE
Y = tsne(X_norm, 'NumDimensions', 2, 'Perplexity', 30);

% 可视化
figure;
scatter(Y(:,1), Y(:,2));
title('t-SNE降维结果');
3. 自编码器(Autoencoder)
matlab 复制代码
%% 构建自编码器结构
hiddenSize = 2; % 隐藏层神经元数
autoenc = trainAutoencoder(X_norm', hiddenSize, ...
    'MaxEpochs', 100, ...
    'L2WeightRegularization', 0.001);

% 提取特征
X_ae = encode(autoenc, X_norm');

% 可视化
figure;
scatter(X_ae(:,1), X_ae(:,2));
title('自编码器降维结果');

四、异常检测实现

1. 孤立森林(Isolation Forest)
matlab 复制代码
% 加载异常检测工具箱
addpath(genpath('libsvm')); % 需安装LIBSVM工具箱

% 训练模型
model = isolationForest(X_norm, 'numTrees', 100);

% 预测异常分数
scores = predict(model, X_norm);

% 可视化异常检测结果
figure;
scatter(X_norm(:,1), X_norm(:,2), 50, scores, 'filled');
colorbar;
title('孤立森林异常检测');
2. 高斯混合模型(GMM)
matlab 复制代码
% 训练GMM模型
GMModel = fitgmdist(X_norm, 3);

% 计算后验概率
posterior = posterior(GMModel, X_norm);

% 异常检测(概率密度阈值法)
threshold = prctile(posterior(:,1), 5);
anomalies = find(posterior(:,1) < threshold);

五、特征选择与模式发现

1. 主成分特征选择
matlab 复制代码
% 选择前两个主成分
X_pca = X_norm * coeff(:,1:2);

% 可视化特征贡献
figure;
bar(coeff(:,1:2));
set(gca, 'XTickLabel', {'PC1', 'PC2'});
title('主成分特征权重');
2. 自动编码器特征提取
matlab 复制代码
%% 构建深度自编码器
layers = [
    imageInputLayer([1 2])
    fullyConnectedLayer(4)
    reluLayer
    fullyConnectedLayer(2)
    regressionLayer];

% 训练网络
options = trainingOptions('adam', 'MaxEpochs', 200);
net = trainNetwork(X_norm', X_norm', layers, options);

% 提取特征
X_deep = predict(net, X_norm');

六、应用案例:客户分群分析

1. 数据准备
matlab 复制代码
% 加载商业数据集
load('customer_data.mat');
X = data(:,2:end); % 去除ID列
2. 分析流程
matlab 复制代码
%% 数据预处理
[X_norm, mu, sigma] = zscore(X);

%% 聚类分析
[idx, ~] = kmeans(X_norm, 4);

%% 特征分析
coeff = pca(X_norm);
X_pca = X_norm * coeff(:,1:2);

%% 可视化
figure;
gscatter(X_pca(:,1), X_pca(:,2), idx);
title('客户分群结果(PCA降维)');

七、可视化工具

1. 降维可视化对比
matlab 复制代码
%% 对比不同降维方法
figure;
subplot(2,2,1);
scatter(X_norm(:,1), X_norm(:,2));
title('原始数据');

subplot(2,2,2);
scatter(score(:,1), score(:,2));
title('PCA');

subplot(2,2,3);
scatter(Y(:,1), Y(:,2));
title('t-SNE');

subplot(2,2,4);
scatter(X_ae(:,1), X_ae(:,2));
title('自编码器');
2. 聚类评估可视化
matlab 复制代码
%% 轮廓系数分析
silhouette(X_norm, idx);
title('轮廓系数分析');

参考代码 基于matlab下的无监督数据的实现 www.youwenfan.com/contentcso/96097.html

八、工具箱推荐

  1. Statistics and Machine Learning Toolbox 支持K-means、层次聚类、PCA等算法
  2. Deep Learning Toolbox 提供自编码器、深度聚类等高级功能
  3. Statistics and Machine Learning Toolbox 支持t-SNE、UMAP等降维方法
相关推荐
源代码•宸1 小时前
Leetcode—1266. 访问所有点的最小时间【简单】
开发语言·后端·算法·leetcode·职场和发展·golang
遇见~未来1 小时前
JavaScript数组全解析:从本质到高级技巧
开发语言·前端·javascript
南屿欣风1 小时前
Sentinel 熔断规则 - 异常比例(order & product 示例)笔记
java·开发语言
u0104058362 小时前
使用Java实现高性能的异步编程:CompletableFuture与Reactive Streams
java·开发语言
朔北之忘 Clancy2 小时前
2020 年 6 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·尺取法
消失的旧时光-19432 小时前
C++ 中的 auto 与 nullptr:不是语法糖,而是类型系统升级
开发语言·c++
专注VB编程开发20年2 小时前
c#Type数组转成字符串的名称
java·开发语言
编程饭碗2 小时前
【多线程编程】
java·开发语言
vyuvyucd2 小时前
Python虚拟环境终极指南:venv到uv进阶
开发语言·python·uv
Tim_102 小时前
【C++入门】05、复合类型-数组
开发语言·c++·算法