统计机器学习导论第十二章极大似然估计——用FDA进行多分类

clear all
load digit.mat X T
[d,m,c]=size(T); c=3;

S=zeros(d,d);
for y=1:c
  mu(:,y)=mean(X(:,:,y),2);
  S=S+cov(X(:,:,y)')/c;
end
h=inv(S)*mu;
for y=1:c
  p(:,:,y)=h'*T(:,:,y)-repmat(sum(mu.*h)',[1,m])/2;
end
[pmax P]=max(p);
P=squeeze(P);
for y=1:c
  C(:,y)=sum(P==y);
end
C

这段代码的功能是对加载的数字数据集进行处理,并计算每个数字类别的数量。

下面是每行代码的解释:

1. `clear all`: 清除当前工作空间中的所有变量。

2. `load digit.mat X T`: 从名为 "digit.mat" 的文件中加载变量 X 和 T。X 是包含数字图像数据的三维矩阵,T 是包含数字类别信息的三维矩阵。

3. `[d,m,c]=size(T); c=3;`: 获取 T 的大小,并将其维度分别赋值给变量 d、m 和 c。然后将 c 的值设为 3。这表明数字类别的数量为 34. `S=zeros(d,d);`: 创建一个大小为 d×d 的零矩阵 S。

5. `for y=1:c`: 开始一个循环,循环变量 y 从 1 到 c。

6. `mu(:,y)=mean(X(:,:,y),2);`: 计算 X(:,:,y) 的列均值,并将结果存储在 mu 的第 y 列中。这表示计算每个数字类别 y 的平均图像。

7. `S=S+cov(X(:,:,y)')/c;`: 计算 X(:,:,y)'X(:,:,y) 的转置)的协方差矩阵,然后将其除以 c 并累加到 S 中。这样做是为了计算所有数字类别的协方差的平均值。

8. `end`: 结束循环。

9. `h=inv(S)*mu;`: 计算 S 的逆矩阵乘以 mu,将结果存储在 h 中。

10. `for y=1:c`: 开始一个循环,循环变量 y 从 1 到 c。

11. `p(:,:,y)=h'*T(:,:,y)-repmat(sum(mu.*h)',[1,m])/2;`: 计算 h'(h 的转置)乘以 T(:,:,y) 的结果,并减去 sum(mu.*h)' 的每个元素的一半。将计算结果存储在 p 的第 y 个切片中。

12. `end`: 结束循环。

13. `[pmax P]=max(p);`: 对 p 进行逐列比较,找到每一列中的最大值及其索引,并将最大值存储在 pmax 中,将索引存储在 P 中。

14. `P=squeeze(P);`: 将 P 中的单维维度去除,使其变为一维向量。

15. `for y=1:c`: 开始一个循环,循环变量 y 从 1 到 c。

16. `C(:,y)=sum(P==y);`: 统计 P 中等于 y 的元素的数量,并将结果存储在 C 的第 y 列中。

17. `end`: 结束循环。

18.

 `C`: 显示 C,即每个数字类别的数量。
这段代码是一个简化的 Fisher 判别分析(Fisher Discriminant Analysis,FDA)的实现示例。让我来解释一下代码如何体现FDA思想:

1. 数据准备:代码中使用了一个名为 "digit.mat" 的数据集,其中包含了样本特征数据 X 和对应的标签数据 T。X 是一个三维数组,每个维度表示不同的特征维度;T 是一个三维数组,每个维度表示不同的类别。首先,代码中通过加载数据集,获取了样本特征数据 X 和标签数据 T。

2. 类别内散度和类别间差异计算:在代码中,使用循环遍历每个类别,分别计算每个类别内部的协方差矩阵,然后将它们加权求和得到总的类别内散度矩阵 S。同时,计算每个类别内样本的均值向量 mu。

3. Fisher判别准则的计算:根据FDA思想,需要计算投影向量 h,使得类别间差异最大化。在代码中,通过求解线性方程组 (S * h = mu) 来计算投影向量 h。这里使用了矩阵的逆(inv)来求解投影向量。

4. 投影和分类决策:在代码中,对于每个类别,首先通过投影向量 h 对样本特征进行投影计算得到 p 值。然后,根据 p 值确定每个样本的类别。最后,通过计算每个类别的样本数量,得到分类结果 C。

这段代码体现了FDA思想的关键步骤。通过计算类别内散度和类别间差异,并利用投影向量进行特征投影和分类决策,实现了对多类别数据的判别分析。该代码在一个简化的情境下展示了FDA的实现流程,实际应用中可能还需要考虑其他因素和优化策略。
p(:,:,y)=h'*T(:,:,y)-repmat(sum(mu.*h)',[1,m])/2;

这行代码的作用是计算在给定投影向量 h 下,每个类别 y 中样本的投影值 p。

让我们逐步解释这行代码的具体作用:

1. `h'*T(:,:,y)`: 这部分代码表示将投影向量 h 与类别 y 中的样本特征数据进行矩阵乘法运算。这样做的目的是将样本特征数据投影到由向量 h 定义的低维空间中,得到每个样本在该投影方向上的投影值。

2. `sum(mu.*h)'`: 这部分代码计算了特征均值向量 mu 和投影向量 h 的点积。这个点积的目的是为了后续的均值修正。它将特征均值向量与投影向量在每个维度上的乘积相加,得到一个标量值。

3. `repmat(sum(mu.*h)',[1,m])/2`: 这部分代码将上一步计算得到的标量值复制成一个大小为 [1, m] 的矩阵,其中 m 是样本的数量。然后,将矩阵除以2,这是为了进行均值修正。

4. `p(:,:,y) = h'*T(:,:,y) - repmat(sum(mu.*h)',[1,m])/2`: 这部分代码将投影值的计算结果减去均值修正项,并将结果存储在 p 中。最终的 p 是一个大小为 [1, m] 的矩阵,表示每个样本在给定投影向量 h 下的投影值。

总结起来,这行代码的作用是计算在给定投影向量 h 下,每个类别 y 中样本的投影值 p。这些投影值可以用于后续的分类决策或其他分析任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值