判别分析需要足够的数据来拟合具有可逆协方差矩阵的高斯模型。如果您的数据不足以惟一地适合这样的模型,fitcdiscr
失败。本节示出了处理故障的方法。
提示
要获得一个正确的判别分析分类器,请设置DiscrimType
名称-值对'pseudolinear'
或“pseudoQuadratic”
在fitcdiscr
.
“伪”鉴别器从来不会失败,因为它们使用协方差矩阵Σ的伪逆K.(见pinv
)。
当拟合分类器协方差矩阵为奇异时,fitcdiscr
可以失败:
load popcorn X = popcorn(:,[1 2]);X (:, 3) = 0;% a零方差列Y =爆米花(:,3);ppcrn = fitcdiscr (X, Y);使用分类判别器的误差(第635行)Predictor x3的方差为零。要么排除这个预测器,要么将“discritype”设置为“伪线性”或“diagLinear”。在classreg.learning错误。obj = this.MakeFitObject(X,Y,W,this.ModelParameters,fitArgs{:});Error in fitcdiscr (line 296) this = fit(temp,X,Y);
为了继续进行线性判别分析,使用a伪线性
或diagLinear
判别类型:
ppcrn = fitcdiscr(x,y,...'stomimtype','pseudolinear');MeanPredict =预测(PPCRN,平均值(x))意味着预期= 3.5000
有六种类型的判别分析分类器:线性和二次,与对角和伪每种类型的变体。
提示
看看协方差矩阵是否奇异,集合差异
到'线性'
或“二次”
.如果矩阵是奇异的fitcdiscr
方法失败“二次”
,而且γ
属性为非零'线性'
.
即使您的协方差矩阵为单数,设置二次分类器DiscrimType
到“pseudoQuadratic”
或'diagquadratic'
.
obj = fitcdiscr(X,Y,' discritype ',' pseudo二次')%或' diag二次'
属性来选择分类器类型差异
名称 - 值对之一:
'线性'
(默认)-估计所有类的协方差矩阵。
“二次”
-估计每个类的协方差矩阵。
“diagLinear”
—使用对角线'线性'
协方差矩阵,并在必要时使用其伪敏。
'diagquadratic'
-使用对角线的“二次”
协方差矩阵,并在必要时使用它们的伪逆。
'pseudolinear'
-使用的伪逆'线性'
如果需要协方差矩阵。
“pseudoQuadratic”
-使用的伪逆“二次”
如果需要协方差矩阵。
fitcdiscr
可以失败'线性'
和“二次”
分类器。当它失败时,它返回一个解释,如处理奇异数据.
fitcdiscr
对角线和伪变量总是成功的。有关伪逆的信息,请参见pinv
.
在构造分类器后,可以使用点表示法设置判别类型:
obj.discrimtype ='差异'
您可以在线性类型或二次类型之间更改,但不能在线性和二次类型之间进行更改。
这resubstitution错误是响应训练数据与分类器基于输入训练数据对响应做出的预测之间的差值。如果重新替换错误很高,就不能期望分类器的预测很好。然而,低的再替代误差并不能保证对新数据的良好预测。再替代误差通常是对新数据的预测误差的过于乐观的估计。
这混淆矩阵显示在重新替换中产生的错误数量和类型。当有K.
类,混淆矩阵R.
是A.K.
——- - - - - -K.
矩阵有
R(I,J)
=班级的观察次数一世
分类器预测的类j
.
检查Fisher Iris数据的默认判别分析分类器的重新提交错误:
Load Fisheriris obj = fitcdiscr(Meas,物种);Resuberror = Resubloss(OBJ)Resuberror = 0.0200
再替换错误很低,意思是obj.
将正确分类所有Fisher IRIS数据。错误分类总数是:
resuberror * obj。NumObservations = 3.0000
要查看三种错误分类的细节,请检查混淆矩阵:
r = confusionmat(obj.y,Resubpredict(obj))r = 50 0 0 0 48 2 0 1 49 obj.classnames ans ='setosa''versicolor''virginica'
R(1,:) = [50 0 0]
意味着obj.
正确分类所有50个特性虹膜。
R(2,:) = [0 48 2]
意味着obj.
正确分类48个versicolor虹膜,并将两个versicolor虹膜误差为virginica。
R(3,:) = [0 1 49]
意味着obj.
正确分类49个维珍鸢尾,错误分类一个维珍鸢尾为花斑。
通常,判别分析分类器是稳健的,当预测器的数量远远小于观测值时,不会表现出过度训练。不过,交叉验证分类器以确保其稳定性是一种良好的实践。
这个例子展示了如何执行二次判别分析分类器的五次交叉验证。
加载示例数据。
加载fisheriris
为数据创建二次判别分析分类器。
quadisc = fitcdiscr(量、种类、'isstrimtype'那“二次”);
查找分类器的重新替换错误。
Qerror = Resubloss(Quadisc)
qerror = 0.0200
分类器做了一个很好的工作。尽管如此,重新提交错误可能是对分类新数据时出错的乐观估计。所以继续讲话。
创建交叉验证模型。
cvmodel = crossval(Quadisc,'kfold'5);
找到模型的交叉验证损失,这意味着折叠折叠观测的错误。
cverror = kfoldLoss (cvmodel)
Cverror = 0.0200.
交叉验证的损失与原始副立损失一样低。因此,您可以有信心分类是合理准确的。
有时你更想避免某些分类错误。例如,检测过度敏感的癌症可能比检测不敏感的癌症更好。过于敏感的检测会导致更多的假阳性(不必要的检测或治疗)。不敏感的检测会产生更多的假阴性(可预防的疾病或死亡)。检测不足的后果可能会很严重。因此,您可能希望设置成本以反映结果。
同样,训练数据y
可以具有不代表其真实频率的类的分布。如果您对真实频率的更好估计,则可以在分类中包含此知识事先的
财产。
以Fisher虹膜数据为例。假设将versicolor虹膜分类为viggina的成本是制作任何其他分类错误的10倍。从数据创建分类器,然后包含此成本,然后查看生成的分类器。
加载Fisher虹膜数据并创建一个默认(线性)分类器,如示例:判别分析分类器的重替换错误:
Load Fisheriris obj = fitcdiscr(Meas,物种);resuberror = resubloss(obj)resuberror = 0.0200 r = confusionmat(obj.y,Resubpredict(obj))r = 50 0 0 0 48 2 0 1 49 obj.classnames ans ='setosa''versicolor''virginica'
R(2,:) = [0 48 2]
意味着obj.
正确分类48个versicolor虹膜,并将两个versicolor虹膜误差为virginica。
更改成本矩阵,以减少将花斑虹膜分类为virginica的错误:
obj.Cost(2、3)= 10;R2 = obj. y,resubPredict(obj)
obj.
现在正确对所有versicolor虹膜进行分类,以牺牲virginica鸢尾花的错误分类数量为代价1
到7.
.
以Fisher虹膜数据为例。数据中有50种不同的虹膜。假设,在一个特定的地区,你有历史数据显示,弗吉尼亚的流行程度是其他种类的五倍。创建包含此信息的分类器。
加载Fisher虹膜数据并创建一个默认(线性)分类器,如示例:判别分析分类器的重替换错误:
Load Fisheriris obj = fitcdiscr(Meas,物种);resuberror = resubloss(obj)resuberror = 0.0200 r = confusionmat(obj.y,Resubpredict(obj))r = 50 0 0 0 48 2 0 1 49 obj.classnames ans ='setosa''versicolor''virginica'
R(3,:) = [0 1 49]
意味着obj.
正确分类49个维珍鸢尾,错误分类一个维珍鸢尾为花斑。
更改之前匹配您的历史数据,并检查新分类器的混淆矩阵:
obj。Prior = [1 1 5];R2 = obj. y,resubPredict(obj)
新分类器可以正确分类所有维尔吉纳鸢蛋白,以增加versicolor鸢尾花的错误分类次数2
到4.
.