判别
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
的MATLAB实现案例(
论文
政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载
资料)
%--------------------------------------------------------------------------
% 读取examp10_01.xls中数据,进行距离判别
%--------------------------------------------------------------------------
%********************************读取数据*********************************** % 读取文件examp10_01.xls的第1个工作表中C2:F51范围的数据,即全部样本数据,包括
未判企业
sample = xlsread('examp10_01.xls','','C2:F51'); % 读取文件examp10_01.xls的第1个工作表中C2:F47范围的数据,即已知组别的样本数据,
training = xlsread('examp10_01.xls','','C2:F47'); % 读取文件examp10_01.xls的第1个工作表中B2:B47范围的数据,即样本的分组信息数据,
group = xlsread('examp10_01.xls','','B2:B47'); obs = [1 : 50]'; % 企业的编号
%**********************************距离判别********************************* % 距离判别,判别函数类型为mahalanobis,返回判别结果向量C和误判概率err
[C,err] = classify(sample,training,group,'mahalanobis'); [obs, C] % 查看判别结果
err % 查看误判概率
%--------------------------------------------------------------------------
% 加载fisheriris.mat中数据,进行贝叶斯判别
%--------------------------------------------------------------------------
%********************************加载数据*********************************** load fisheriris % 把文件fisheriris.mat中数据导入MATLAB工作空间
%**********************************查看数据********************************* head0 = {'Obj', 'x1', 'x2', 'x3', 'x4', 'Class'}; % 设置表头
[head0; num2cell([[1:150]', meas]), species] % 以元胞数组形式查看数据
%*********************************贝叶斯判别******************************** % 用meas和species作为训练样本,创建一个朴素贝叶斯分类器对象ObjBayes
ObjBayes = NaiveBayes.fit(meas, species);
% 利用所创建的朴素贝叶斯分类器对象对训练样本进行判别,返回判别结果pre0,pre0也
是字符串元胞向量
pre0 = ObjBayes.predict(meas);
% 利用confusionmat函数,并根据species和pre0创建混淆矩阵(包含总的分类信息的矩阵)
[CLMat, order] = confusionmat(species, pre0); % 以元胞数组形式查看混淆矩阵
[[{'From/To'},order'];order, num2cell(CLMat)]
% 查看误判样品编号
gindex1 = grp2idx(pre0); % 根据分组变量pre0生成一个索引向量gindex1 gindex2 = grp2idx(species); % 根据分组变量species生成一个索引向量gindex2 errid = find(gindex1 ~= gindex2) % 通过对比两个索引向量,返回误判样品的观测序号向量
% 查看误判样品的误判情况
head1 = {'Obj', 'From', 'To'}; % 设置表头
% 用num2cell函数将误判样品的观测序号向量errid转为元胞向量,然后以元胞数组形式查看误判结果
[head1; num2cell(errid), species(errid), pre0(errid)]
% 对未知类别样品进行判别
% 定义未判样品观测值矩阵x
x = [5.8 2.7 1.8 0.73
5.6 3.1 3.8 1.8
6.1 2.5 4.7 1.1
6.1 2.6 5.7 1.9
5.1 3.1 6.5 0.62
5.8 3.7 3.9 0.13
5.7 2.7 1.1 0.12
6.4 3.2 2.4 1.6
6.7 3 1.9 1.1
6.8 3.5 7.9 1
];
% 利用所创建的朴素贝叶斯分类器对象对未判样品进行判别,返回判别结果pre1,pre1也是字符串元胞向量
pre1 = ObjBayes.predict(x)
%--------------------------------------------------------------------------
% 加载fisheriris.mat中数据,进行Fisher判别
%--------------------------------------------------------------------------
%********************************加载数据***********************************
load fisheriris % 把文件fisheriris.mat中数据导入MATLAB工作空间
%**********************************待判样品*********************************
% 定义待判样品观测值矩阵x
x = [5.8 2.7 1.8 0.73
5.6 3.1 3.8 1.8
6.1 2.5 4.7 1.1
6.1 2.6 5.7 1.9
5.1 3.1 6.5 0.62
5.8 3.7 3.9 0.13
5.7 2.7 1.1 0.12
6.4 3.2 2.4 1.6
6.7 3 1.9 1.1
6.8 3.5 7.9 1
];
%*********************************Fisher判别******************************** % 利用fisher函数进行判别,返回各种结果(见fisher函数的注释)
[outclass,TabCan,TabL,TabCon,TabM,TabG] = fisher(x,meas,species)
%************************绘制两个判别式得分的散点图************************** % 利用fisher函数进行判别,返回各种结果,其中ts为判别式得分
[outclass,TabCan,TabL,TabCon,TabM,TabG,ts] = fisher(x,meas,species);
% 提取各类的判别式得分
ts1 = ts(ts(:,1) == 1,:); % setosa类的判别式得分
ts2 = ts(ts(:,1) == 2,:); % versicolor类的判别式得分
ts3 = ts(ts(:,1) == 3,:); % virginica类的判别式得分
plot(ts1(:,2),ts1(:,3),'ko') % setosa类的判别式得分的散点图
hold on
plot(ts2(:,2),ts2(:,3),'k*') % versicolor类的判别式得分的散点图
plot(ts3(:,2),ts3(:,3),'kp') % virginica类的判别式得分的散点图
legend('setosa类','versicolor类','virginica类'); %加标注框
xlabel('第一判别式得分'); %给X轴加标签
ylabel('第二判别式得分'); %给Y轴加标签
%************************只用一个判别式进行Fisher判别************************ % 令fisher函数的第4个输入为0.5,就可以只用一个判别式进行判别
[outclass,TabCan,TabL,TabCon,TabM,TabG] = fisher(x,meas,species,0.5)
function [outclass,TabCan,TabL,TabCon,TabM,TabG,trainscore] = fisher(sampledata,training,group,contri)
%FISHER 判别分析.
% class = fisher(sampledata,training,group) 根据训练样本training构造判别式,
% 利用所有判别式对待判样品sampledata进行判别. sampledata和training是具有相同
% 列数的矩阵,它们的每一行对应一个观测,每一列对应一个变量. group是training对
% 应的分组变量,它的每一个元素定义了training中相应观测所属的类. group可以是一
% 个分类变量,数值向量,字符串数组或字符串元胞数组. training和group必须具有相
% 同的行数. fisher函数把group中的NaN或空字符串作为缺失数据,从而忽略training % 中相应的观测. class中的每个元素指定了sampledata中的相应观测所判归的类,它和
% group具有相同的数据类型.
%
% class = fisher(sampledata,training,group,contri) 根据累积贡献率不低于
% contri,确定需要使用的判别式个数,默认情况下,使用所有判别式进行判别. contri % 是一个在(0, 1]区间内取值的标量,用来指定累积贡献率的下限.
%
% [class, TabCan] = fisher(...)以
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
形式返回所用判别式的系数向量,若contri
% 取值为1,则返回所有判别式的系数向量. TabCan是一个元胞数组,形如
% 'Variable' 'can1' 'can2' % 'x1' [-0.2087] [ 0.0065] % 'x2' [-0.3862] [ 0.5866] % 'x3' [ 0.5540] [-0.2526] % 'x4' [ 0.7074] [ 0.7695]
% [class, TabCan, TabL] = fisher(...)以表格形式返回所有特征值,贡献率,累积
% 贡献率等. TabL是一个元胞数组,形如
% 'Eigenvalue' 'Difference' 'Proportion' 'Cumulative'
% [ 32.1919] [ 31.9065] [ 0.9912] [ 0.9912]
% [ 0.2854] [] [ 0.0088] [ 1]
%
% [class, TabCan, TabL, TabCon] = fisher(...)以表格形式返回混淆矩阵(包含总
% 的分类信息的矩阵). TabCon是一个元胞数组,形如
% 'From/To' 'setosa' 'versicolor' 'virginica' % 'setosa' [ 50] [ 0] [ 0] % 'versicolor' [ 0] [ 48] [ 2] % 'virginica' [ 0] [ 1] [ 49] %
% [class, TabCan, TabL, TabCon, TabM] = fisher(...)以表格形式返回误判矩阵.
% TabM是一个元胞数组,形如
% 'Obj' 'From' 'To' % [ 71] 'versicolor' 'virginica' % [ 84] 'versicolor' 'virginica' % [134] 'virginica' 'versicolor' %
% [class, TabCan, TabL, TabCon, TabM, TabG] = fisher(...)将所用判别式作用
% 在各组的组均值上,得到组均值投影矩阵,以表格形式返回这个矩阵. TabG是一个元
胞
% 数组,形如
% 'Group' 'can1' 'can2' % 'setosa' [-1.3849] [1.8636]
% 'versicolor' [ 0.9892] [1.6081] % 'virginica' [ 1.9852] [1.9443]
% [class, TabCan, TabL, TabCon, TabM, TabG, trainscore] = fisher(...)返回
% 训练样品所对应的判别式得分trainscore. trainscore的第一列为各训练样品原本所 % 属类的类序号,第i+1列为第i个判别式得分.
%
% Copyright 2009 xiezhh.
% $Revision: 1.0.0.0 $ $Date: 2009/10/03 10:40:34 $
if nargin < 3
error('错误:输入参数太少,至少需要3个输入.');
end
% 根据分组变量生成索引向量gindex,组名元胞向量groups,组水平向量glevels [gindex,groups,glevels] = grp2idx(group); % 忽略缺失数据
nans = find(isnan(gindex));
if ~isempty(nans)
training(nans,:) = [];
gindex(nans) = [];
end
ngroups = length(groups);
gsize = hist(gindex,1:ngroups);
nonemptygroups = find(gsize>0);
nusedgroups = length(nonemptygroups);
% 判断是否有空的组
if ngroups > nusedgroups
warning('警告: 有空的组.');
end
[n,d] = size(training);
if size(gindex,1) ~= n
error('错误: 输入参数大小不匹配,GROUP与TRAINING必须具有相同的行数.'); elseif isempty(sampledata)
sampledata = zeros(0,d,class(sampledata)); elseif size(sampledata,2) ~= d
error('错误: 输入参数大小不匹配,SAMPLEDATA与TRAINING必须具有相同的列数.'); end
% 设置contri的默认值为1,并限定contri在(0, 1]内取值
if nargin < 4 || isempty(contri)
contri = 1;
end
if ~isscalar(contri) || contri > 1 || contri <= 0
error('错误: contri 必须是一个在(0, 1]内取值的标量.'); end
if any(gsize == 1)
error('错误: TRAINING中的每个组至少应有两个观测.'); end
% 计算各组的组均值
gmeans = NaN(ngroups, d); for k = nonemptygroups
gmeans(k,:) = mean(training(gindex==k,:),1);
end
% 计算总均值
totalmean = mean(training,1);
% 计算组内离差平方和矩阵E和组间离差平方和矩阵B E = zeros(d);
B = E;
for k = nonemptygroups
% 分别估计各组的组内离差平方和矩阵.
[Q,Rk] = qr(bsxfun(@minus,training(gindex==k,:),gmeans(k,:)), 0);
% 各组的组内离差平方和矩阵:AkHat = Rk'*Rk
% 判断各组的组内离差平方和矩阵的正定性
s = svd(Rk);
if any(s <= max(gsize(k),d) * eps(max(s)))
error('错误: TRAINING中各组的组内离差平方和矩阵必须是正定矩阵.');
end
E = E + Rk'*Rk; % 计算总的组内离差平方和矩阵E
% 计算组间离差平方和矩阵B
B = B + (gmeans(k,:) - totalmean)'*(gmeans(k,:) - totalmean)*gsize(k);
end
% 求inv(E)*B的正特征值与相应的特征向量
EB = E\B;
[V, D] = eig(EB);
D = diag(D);
[D, idD] = sort(D,'descend'); %将特征值按降序排列
V = V(:,idD);
NumPosi = min(ngroups-1, d); %确定正特征值个数
D = D(1:NumPosi, :);
CumCont = cumsum(D/sum(D)); %计算累积贡献率
% 以表格形式返回所有特征值,贡献率,累积贡献率等. TabL是一个元胞数组 head = {'Eigenvalue', 'Difference', 'Proportion', 'Cumulative'};
TabL = cell(NumPosi+1, 4);
TabL(1,:) = head;
TabL(2:end,1) = num2cell(D);
if NumPosi == 1
TabL(2:end-1,2) = {0};
else
TabL(2:end-1,2) = num2cell(-diff(D)); end
TabL(2:end,3) = num2cell(D/sum(D)); TabL(2:end,4) = num2cell(CumCont);
% 根据累积贡献率的下限contri确定需要使用的判别式个数CumContGeCon CumContGeCon = find(CumCont >= contri); CumContGeCon = CumContGeCon(1); V = V(:, 1:CumContGeCon); %需要使用的判别式系数矩阵
% 以表格形式返回所用判别式的系数向量,若contri取值为1,
% 则返回所有判别式的系数向量. TabCan是一个元胞数组
TabCan = cell(d+1, CumContGeCon+1); TabCan(1, 1) = {'Variable'};
TabCan(2:end, 1) = strcat('x',cellstr(num2str((1:d)')));
TabCan(1, 2:end) = strcat('can',cellstr(num2str((1:CumContGeCon)')));
TabCan(2:end, 2:end) = num2cell(V);
% 将训练样品与待判样品放在一起进行判别
m = size(sampledata,1);
gv = gmeans*V;
stv = [sampledata; training]*V; nstv = size(stv, 1);
message = '';
outclass = NaN(nstv, 1);
for i = 1:nstv
obji = bsxfun(@minus,stv(i,:),gv);
obji = sum(obji.^2, 2);
idclass = find(obji == min(obji));
if length(idclass) > 1
idclass = idclass(1);
message = '警告: 出现了一个或多个结';
end
outclass(i) = idclass;
end
warning(message);
trclass = outclass(m+(1:n)); %训练样品的判别结果(由类序号构成的向量) outclass = outclass(1:m); %待判样品的判别结果(由类序号构成的向量)
outclass = glevels(outclass,:); %将待判样品的判别结果进行一个类型转换
trg1 = groups(gindex); %训练样品的初始类名称
trg2 = groups(trclass); %训练样品经判别后的类名称
% 以表格形式返回混淆矩阵(包含总的分类信息的矩阵). TabCon是一个元胞数组 [CLMat, order] = confusionmat(trg1,trg2); TabCon = [[{'From/To'},order'];order, num2cell(CLMat)];
% 以表格形式返回误判矩阵. TabM是一个元胞数组
miss = find(gindex ~= trclass); %训练样品中误判样品的编号
head1 = {'Obj', 'From', 'To'};
TabM = [head1; num2cell(miss), trg1(miss), trg2(miss)];
% 将所用判别式作用在各组的组均值上,得到组均值投影矩阵,以表格形式返回这个矩阵. % TabG是一个元胞数组
TabG = cell(ngroups+1,CumContGeCon+1); TabG(:,1) = [{'Group'};groups];
TabG(1,2:end) = strcat('can',cellstr(num2str((1:CumContGeCon)')));
TabG(2:end,2:end) = num2cell(gv);
% 计算训练样品所对应的判别式得分
trainscore = training*V;
trainscore = [gindex, trainscore];