MATLAB数据可视化与聚类分析实践

内容分享1天前发布
2 0 0

table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}

1、使用

rand

函数生成n = 100个一维均匀随机变量。使用

hist

函数构建直方图。现在对数据取对数(使用

log

函数)进行变换。构建这些变换后值的直方图。分布的形状是否发生了变化?对结果进行评论。

以下是将给定文本内容转换为 Markdown 格式的结果:


需按步骤编写 MATLAB 代码实现操作,先使用

rand

函数生成 100 个一维均匀随机变量,用

hist

函数绘制初始直方图;再对数据取对数,用

hist

函数绘制变换后的直方图。对比两个直方图,若形状明显不同则分布形状改变,均匀分布取对数后通常会变成偏态分布。具体变化和结果需根据实际绘制的直方图判断。

以下是示例代码:


% 生成100个一维均匀随机变量
uniform_data = rand(100, 1);

% 构建初始直方图
figure;
hist(uniform_data);
title('初始均匀分布直方图');

% 对数据取对数变换
log_transformed_data = log(uniform_data);

% 构建变换后值的直方图
figure;
hist(log_transformed_data);
title('对数变换后分布直方图');

2、对S曲线数据应用等距映射(ISOMAP)方法,构建数据散点图并与局部线性嵌入(LLE)的结果进行比较。

以下是对S曲线数据应用ISOMAP方法,构建散点图并与LLE结果比较的步骤:

加载S曲线数据,该数据已保存于

scurve.mat

文件中。

对LLE设置参数,

K = 12


d = 2

,运行LLE并绘制结果散点图。

对ISOMAP,将数据矩阵转置为

n x p

形式,计算距离矩阵。

运行ISOMAP,代码如下:

matlab
load scurve;
X = X';
dists = squareform(pdist(X));
options.dims = 1:10;
options.display = 0;
[Yiso, Riso, Eiso] = isomap(dists, 'k', 7, options);

构建ISOMAP结果的散点图,代码为:

matlab
scatter(Yiso(1,:), Yiso(2,:), 12, [angle angle], '+', 'filled');

比较LLE和ISOMAP结果:

LLE结果中,从颜色可看出流形上相邻点映射到二维嵌入中仍相邻。可通过对比两个散点图,分析点分布、聚类等特征来确定两种方法优劣。若散点图中点分布更紧凑、保留更多原始数据局部结构,则该方法在处理S曲线数据时效果更好。

3、簇的大小和体积没有直接关系。解释它们有何不同。在有限混合模型中,哪个参数与簇的大小相关?


簇大小

指簇中包含的数据点数量。


簇体积

侧重于簇在空间中占据的范围大小。

在有限混合模型里,

权重参数

与簇大小相关,权重反映了每个簇在总体中所占比例,比例大意味着该簇包含的数据点可能多,即簇大小较大。

4、编写一个 MATLAB 函数,用于返回单变量情况下的正态概率密度函数($f(x;mu,sigma)=frac{1}{sigmasqrt{2pi}}expleft(-frac{(x – mu)^2}{2sigma^2}
ight)$)。并使用这个函数绘制两个单变量正态分布的有限混合概率密度函数图像,其中两个正态分布的参数可自行假设。

以下为实现该功能的 MATLAB 代码:


function y = my_normpdf(x, mu, sigma)
    y = (1/(sigma*sqrt(2*pi))).*exp(-((x - mu).^2)/(2*sigma^2));
end

x = linspace(-6, 6);
mu1 = -2;     % 假设值
sigma1 = 1;   % 假设值
mu2 = 2;      % 假设值
sigma2 = 1;   % 假设值
pie1 = 0.5;   % 假设值
pie2 = 0.5;   % 假设值

y1 = my_normpdf(x, mu1, sigma1);
y2 = my_normpdf(x, mu2, sigma2);
y = pie1*y1 + pie2*y2;

plot(x,y)
xlabel('x'), ylabel('Probability Density Function')
title('Univariate Finite Mixture - Two Terms')

在上述代码里,

my_normpdf

函数实现了单变量正态概率密度函数。之后使用该函数绘制两个单变量正态分布的有限混合概率密度函数图像。需要注意的是,

mu1


sigma1


mu2


sigma2


pie1


pie2

这些值是假设的,你可以依据实际情况进行修改。

5、对以下数据集应用基于模型的凝聚式聚类,用树状图展示结果。若需要,先进行数据降维处理。数据集包括:a. 头骨数据集;b. 麻雀数据集;c. 奥伦赛数据集(两种分类);d. BPM 数据集;e. 基因表达数据集。

聚类分析任务描述

对以下数据集应用基于模型的凝聚式聚类:

头骨

麻雀

奥伦赛(两种分类)

BPM

基因表达数据集

如需要,对数据进行

降维处理

最终结果使用

树状图

展示聚类结果。

6、对于以下数据集:a. 头骨数据集 b. 麻雀数据集 c. 奥伦赛数据集(两种分类) d. BPM 数据集 e. 基因表达数据集,使用 k – 均值或基于模型的聚类方法进行聚类,然后使用 ReClus 方法进行可视化,并对可视化结果进行分析。

聚类分析与 ReClus 可视化方法

针对这些数据集,首先选择

k-均值



基于模型的聚类方法

进行聚类。

随后使用

ReClus 方法

对聚类结果进行可视化。该方法会:

将整个显示区域作为父矩形;

再分割成若干子矩形;

子矩形的面积与所属聚类的观测数量成正比;

可按观测编号或类别标签绘制观测值。

可视化设置


对于基于模型的聚类输出

使用字体颜色显示观测属于某一聚类的概率;

可设置阈值,使高概率值以

粗体黑色

显示。


对于 k-均值等其他聚类方法

可使用

轮廓值

实现类似的功能。

最终步骤

最后对可视化结果进行分析,以深入了解数据的聚类特征和结构。

7、在MATLAB中,已知数据矩阵x,以及x第一列和第二列数据划分的区间数量分别为nb1和nb2,还有各个区间的高度Z。请使用surf绘图函数绘制对应的曲面图。代码如下:% 绘制成曲面图。% 获取合理的坐标轴。[XX,YY]=… meshgrid(linspace(min(x(:,1)),max(x(:,1)),nb1),… linspace(min(x(:,2)),max(x(:,2)),nb2)); % Z是各个区间的高度。surf(XX,YY,Z)

以下是调整为 Markdown 格式的文本内容:

可将提供的代码复制到 MATLAB 环境中,确保变量

x


nb1


nb2


Z

已正确定义和赋值,然后运行代码即可用

surf

绘图函数绘制对应的曲面图。这里

x

是数据矩阵,

nb1


nb2

分别是

x

第一列和第二列数据划分的区间数量,

Z

是各个区间的高度。

8、生成样本量分别为n = 30、n = 50和n = 100的标准正态分布数据。使用boxp函数先绘制一组普通箱线图,再绘制可变宽度的箱线图。

以下是按照要求生成数据并绘制箱线图的MATLAB代码:


X{1} = randn(30,1);
X{2} = randn(50,1);
X{3} = randn(100,1);
boxp(X);
boxp(X,'vw');

此代码将生成样本量分别为30、50和100的标准正态分布数据,先绘制普通箱线图,再绘制可变宽度的箱线图。

9、证明密度直方图中条形图所代表的面积总和为 1。

要证明密度直方图中条形图所代表的面积总和为 1,可按以下思路:

设密度直方图中第 $ k $ 个区间为 $ B_k $,该区间的频数为 $ u_k $,区间宽度为 $ h $,密度估计值为

f^(x)=uknhf^(x)=uknh

(其中 $ x in B_k $,$ n $ 为数据点总数)。

每个条形图的面积为该区间的密度估计值乘以区间宽度,即:

Ak=f^(x)×h=uknh×h=uknAk=f^(x)×h=uknh×h=ukn

对所有区间的条形图面积求和:

∑kAk=∑kukn∑kAk=∑kukn

由于

∑kuk=n∑kuk=n

(所有区间的频数之和等于数据点总数),所以

∑kukn=∑kukn=nn=1∑kukn=∑kukn=nn=1

即密度直方图中条形图所代表的面积总和为 1。

10、在MATLAB中,加载名为example96的数据文件。对加载后数据中的矩阵X的各列构建直方图(使用12个区间),并与箱线图和箱百分位数图进行比较。

可按以下步骤操作:


加载数据

:在MATLAB命令行输入

load example96


构建直方图

:使用

histogram

函数对矩阵

X

的各列构建直方图,指定区间数为12;


构建箱线图和箱百分位数图

:使用

boxplot

函数构建箱线图,使用相关函数构建箱百分位数图;


比较

:观察直方图、箱线图和箱百分位数图,比较数据的分布、中心趋势、离散程度等特征。

11、在MATLAB命令行输入“help boxplot”以了解更多关于这个统计工具箱函数的信息。对奥朗赛(oronsay)数据集制作并排箱线图。箱线图中须的长度可以通过boxplot函数的可选输入参数轻松调整,尝试该选项的不同取值。


按照要求,首先在MATLAB命令行输入 `help boxplot` 获取函数帮助信息。接着加载奥朗赛数据集,使用 `boxplot` 函数制作并排箱线图,可通过调整可选输入参数改变须的长度,如尝试不同的须长参数值来观察图形变化。

12、探索箱线图函数的“notches”选项。生成双变量正态数据,使各列具有相同的均值,用该矩阵构建带缺口的箱线图。然后生成各列均值差异很大的双变量正态数据,再用该矩阵构建带缺口的箱线图,并讨论结果。

本题可按以下步骤操作:

生成各列均值相同的双变量正态数据,使用箱线图函数的

notches

选项构建带缺口的箱线图。

生成各列均值差异很大的双变量正态数据,同样使用

notches

选项构建带缺口的箱线图。

若缺口区间不重叠,表明中位数有显著差异;若缺口区间重叠,则中位数差异不显著。可据此结合生成的两个箱线图进行结果讨论。

13、生成两个数据集,每个数据集都来自具有不同位置和尺度参数的正态分布。构建一个分位数 – 分位数图并讨论结果。

可按以下步骤操作:

首先生成两个数据集:

第一个模拟数据集为标准正态分布

第二个数据集均值为1,标准差为0.75

代码如下:


% 生成样本 - 相同大小
x = randn(1,300);

% 使下一个数据集具有不同的均值和标准差
y = randn(1,300)*0.75 + 1;

接着对数据进行排序以找到顺序统计量:


% 对数据排序
xs = sort(x);
ys = sort(y);

然后构建分位数 – 分位数图:


% 构建分位数 - 分位数图 - 绘制散点图
plot(xs, ys, '.')
xlabel('标准正态 - 排序后的数据')
ylabel('正态 - 排序后的数据')
title('分位数 - 分位数图')

结果讨论:

若两个数据集来自同一分布族,分位数 – 分位数图上的数据关系近似呈线性。在本题中,由于两个数据集都来自正态分布,只是位置和尺度参数不同,所以分位数 – 分位数图上的数据关系应近似线性,这表明两个数据集虽然参数不同,但都属于正态分布族。

14、使用 MATLAB 的 boxplot 函数对以下数据集进行并排箱线图绘制,并讨论结果。分别绘制带缺口和不带缺口的箱线图。数据集有:头骨数据集、麻雀数据集、花粉数据集、BPM 数据集(使用 ISOMAP 后)、基因表达数据集、垃圾邮件数据集、鸢尾花数据集、软件数据集。

要完成此任务,可按以下步骤操作:

加载所需数据集;

使用 MATLAB 的

boxplot

函数绘制不带缺口的并排箱线图;

使用

boxplot

函数的

'notch'

选项绘制带缺口的并排箱线图;

观察和分析箱线图的特征,如中位数、四分位数范围、异常值等,讨论不同数据集的分布特征和差异。

以下是示例代码:


% 假设已经加载了所有数据集

% 不带缺口的箱线图
figure;
subplot(2,1,1);
boxplot({skulls, sparrow, pollen, BPM_ISOMAP, gene_expression, spam, iris, software});
title('不带缺口的并排箱线图');

% 带缺口的箱线图
subplot(2,1,2);
boxplot({skulls, sparrow, pollen, BPM_ISOMAP, gene_expression, spam, iris, software}, 'notch', 'on');
title('带缺口的并排箱线图');

绘制图形后,可根据箱线图的中位数、四分位数范围、异常值等特征讨论各数据集的分布情况,以及缺口是否重叠来判断中位数的差异是否显著。

15、对给定的数据,进行安德鲁斯曲线和并行坐标的排列游览。

可以使用函数

permtourparallel(X)

进行并行坐标排列游览,使用

permtourandrews(X)

进行安德鲁斯曲线的全排列游览,使用

permtourandrews(X, flag)

进行韦格曼最小排列游览,其中

X

为给定的数据,

flag

可以是任意值。

16、MATLAB统计工具箱有用于绘制安德鲁斯曲线和并行坐标图的函数,分别是parallelcoords和andrewsplot。请使用帮助命令获取关于如何使用这些函数以及可用选项的信息,并使用奥朗赛(oronsay)数据集探索它们的功能。

可在MATLAB中使用


help parallelcoords


help andrewsplot

命令获取函数使用方法和可用选项信息,然后加载

oronsay

数据集,使用

parallelcoords


andrewsplot

函数对其进行绘图,以探索函数功能。

17、查看scatter函数的帮助信息。使用控制符号大小的参数绘制二维散点图,使圆圈更小。并讨论重叠绘图的问题。

要查看

scatter

函数的帮助信息,可在 MATLAB 命令窗口输入:


help scatter

构建二维散点图时,使用

scatter

函数的

S

参数来控制符号大小,可使圆圈变小,代码如下:


load oronsay
scatter(oronsay(:,8), oronsay(:,9), 5)
xlabel(labcol{8})
ylabel(labcol{9})

这里的

5


S

参数,可根据需求调整大小。

若存在重叠绘图问题,即大量点重叠在一起难以看清,那么缩小符号大小后,可能会更清晰展示点的分布和密度,减少重叠造成的信息损失,更准确传达数据点的分布情况。

18、为环境数据集、奥朗赛岛(oronsay)数据集、鸢尾花(iris)数据集、头骨(skulls)数据集和血压监测(BPM)数据集构建带有边缘直方图的二维散点图。使用合适的方法将数据维度降至二维。(提示:使用 scatterhist 函数绘图。)

可以使用合适的降维方法将以下数据集的维度降至二维,然后使用

scatterhist

函数为这些数据集构建带有边缘直方图的二维散点图:

环境数据集

奥朗赛岛数据集

鸢尾花数据集

头骨数据集

血压监测数据集

19、对球体数据使用主成分分析(PCA)和等距映射(ISOMAP)方法,并将结果与曲线成分分析(CCA)的输出进行比较。


PCA是线性降维方法,会对数据所代表的非线性子流形产生线性近似;ISOMAP是基于测地距离的非线性降维方法;CCA能展开球体并找到正确映射,可有效处理非线性数据。

将PCA和ISOMAP用于球体数据后,PCA可能无法很好地展现球体的非线性结构,ISOMAP能在一定程度上处理非线性,但与CCA相比,在保留局部拓扑和子流形形状方面可能存在差异。

具体比较需根据实际应用中各方法对球体数据处理的效果来判断。

20、对以下数据集(间歇泉数据集、歌手数据集、头骨数据集、垃圾邮件数据集、麻雀数据集、奥朗赛岛数据集、基因表达数据集)应用单链接层次聚类,判断是否会出现连锁现象,并探索其他一些距离/链接组合并比较结果。

一般来说,单链接聚类在簇分离不明显时可能出现

连锁现象

。若要探索其他距离/链接组合,可考虑

完全链接



平均链接

等方法。


完全链接

:使用每组中观测值间的最大距离作为簇间距离,不易出现连锁现象,但恢复非球形组有困难;


平均链接

:将一个簇中所有观测值到另一个簇中所有点的平均距离定义为簇间距离。

不同距离/链接组合会产生不同的聚类结构。

21、对于以下数据集:a. 间歇泉数据集 b. 歌手数据集 c. 头骨数据集 d. 麻雀数据集 e. 奥伦赛数据集 f. 基因表达数据集,使用合适的层次聚类方法,并进行可视化,然后分析结果。

一般步骤为,先根据数据集类型(连续、分类或混合)选择合适的距离度量方式和链接方法进行层次聚类,可使用凝聚式聚类。然后用树状图、树状图的空间填充版本(树图)、矩形图、ReClus方法、数据图像等进行可视化。最后根据可视化结果分析聚类结构、确定合适的簇数量等。

22、用以下数据集尝试scattergui函数。注意你需要降低数据维度或选择两个维度来使用。a. 头骨数据集 b. 麻雀数据集 c. 奥龙赛数据集(两种分类) d. BPM数据集 e. 垃圾邮件数据集 f. 基因表达数据集

要使用

scattergui

函数处理这些数据集,首先需要加载相应数据集。对于除 BPM 数据集外未提及加载方式的,需查找对应加载函数或命令加载。

加载后,可使用合适方法(如 Isomap)降低维度或直接选择两个维度。

以 BPM 数据集为例,加载数据集后用 Isomap 降维,代码如下:


load L1bpm;
options.dims = 1:10;
options.display = 0;
[Yiso, Riso, Eiso] = isomap(L1bpm, 'k', 7, options);
X = Yiso.coords{2}';
scattergui(X, classlab)

对于其他数据集,按此思路操作,加载数据集并降维或选二维后调用

scattergui

函数。

© 版权声明

相关文章

暂无评论

none
暂无评论...