- 积分
- 26288
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-11-7
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 山水美不美 于 2011-12-3 12:38 编辑
文献:关于线性判别分析方面的论文
程序代码:完成到验证St=Sb+Sk的关系这一步,可是无论按照哪个文献提供的方法,始终得不到St=Sb+Sk成立的结论!请大家来“捉虫”!
如果懂vb大虾可参与
http://bbs.06climate.com/forum.php?mod=viewthread&tid=4830&extra=page%3D1讨论。
附测试数据、代码
%%%%% 线形判别 %%%%%
%%%%%CSLDA%%%%%%%%%%%%
%%每行为一个样本,有M+1维;共有n个样本。
% %
clc;clear;format long;
g=3; %<---总分类数;根据训练集的分类情况需要人工修改(参数修改第1处)
xyFile=['D:\测试\LDAVB\UU3.TXT'];%%% 测试数据,按实际路径修改
xy=load(xyFile); %行存放1--->m个因子,最后列存放类别值
[n,c]=size(xy); %n=总样本数;c=因子数+1列分类值
% %--step1--:对原始数据归类整理,使同一类数据集中到一块
p=0;Xg=zeros(1,g);
for i=1:g %筛选第i类数据,row为列向量,存放符合条件的数据在原始数据的行序列
[row,col]=find(xy(:,c)==i); %col为列向量,存放第i类的分类值
Xg(i)=length(row); %计算第i类数据的总样本数
for k=1:Xg(i) %从原始数据中提取出第i类数据
p=p+1;
if p==1
xdat=xy(row(k),:) ;%row(k)指向在原始数据的第i类数据所在行号位置
else
xdat=[xdat;xy(row(k),:)];%取出行数据
end
end
end
m=c-1; %样本维数单用一个变量
ys=xdat(:,c);
% %--step2--:将原始数据映射到核空间zdat
%待补充部分
% %--step3--:计算xdat总体样本均值向量
xx=xdat(:,1:m);%%用原始数据,但不包含第c列
AllXavg=mean(xx,1);%AllXavg为行向量 1*m 维,但不包含第c列
% %--step4--:计算各个分类的样本均值向量Xgmean为 g*m 维 行向量
Pdrs=0;
for i=1:g
if i==1
n1=1;n2=Xg(i); %找到第i类样本的起始行、终止行 行序号,方便操作第i类数据
Pdrs=n2;
else
n1=Pdrs+1;n2=Pdrs+Xg(i);Pdrs=n2;
end
%%ys(n1:n2)=i;%由于样本数据按同类集中处理,那么分类号必须同步处理。
xtmp=xx(n1:n2,:); %取出第i类数据,借用临时变量xtmp,用后清除
if i==1
Xgmean=mean(xtmp,1);%按列计算平均值,因为每行是1个观测样本,但不包含第c列
else
Xgmean=[Xgmean;mean(xtmp,1)];%按行进行矩阵合并,因为行是第i类的样本均值向量
end
end
clear xtmp;
% %--step5--:计算总体散布矩阵St(1 To m, 1 To m)
St=zeros(m,m);%%生成 m*m 维矩阵
for i=1:n
xk=xx(i,:)-AllXavg(1,:);
St=St+xk'*xk;
end
%St=St/n;
% %--step6--:计算类间散布矩阵Sb(1 To m, 1 To m)
Sb=zeros(m,m);%%生成 m*m 维矩阵
for i=1:g
xtmp =Xgmean(i,:)-AllXavg(1,:);%xtmp为 1*m 维行向量
Sb=Sb+Xg(i)*xtmp'*xtmp; %Sb为 m*m 维矩阵
%Sb=Sb+xtmp'*xtmp; %Sb为 m*m 维矩阵
end
%Sb=Sb/n;
% %--step7--:计算类内散布矩阵Sk(1 To m, 1 To m); tSk(1 To m, 1 To m)
tSk=zeros(m,m);%不属于第k类样本的类内散布矩阵tSk
Sw=zeros(m,m);%总的类内散布矩阵
Pdrs=0;
for i=1:g
Sk=zeros(m,m);%临时变量,存放第i类样本的类内散布矩阵
if i==1
n1=1;n2=Xg(i);%取得第i类样本的起始行、终止行,方便正确操作第i类数据
Pdrs=n2;
else
n1=Pdrs+1;n2=Pdrs+Xg(i);Pdrs=n2;
end
for k=n1:n2 %计算第i类所有样本的类内散布矩阵Sk(1 To m, 1 To m)
xk=xx(k,:)-Xgmean(i,:);
Sk=Sk+xk'*xk;%
end
Sw=Sw+bxs*Sk;
end
Sw=Sw/g;%
ss=St-Sb-Sw; %这里是为了检验St=Sb+Sw之间的关系是否成立? 如果成立,则ss=零矩阵,可是实际上为非零矩阵
clear xtmp;
不能上传附件!先贴上内容再试一试。
|
|