我在计算多元核估计时遇到了什么问题?

我的目的是通过贝叶斯分类器算法来确定其类别。

假设,以下训练数据描述了不同性别的身高、体重和脚长

SEX         HEIGHT(feet)    WEIGHT (lbs)    FOOT-SIZE (inches)male        6               180             12male        5.92 (5'11")    190             11male        5.58 (5'7")     170             12male        5.92 (5'11")    165             10female      5               100             6female      5.5 (5'6")      150             8female      5.42 (5'5")     130             7female      5.75 (5'9")     150             9trans       4               200             5trans       4.10            150             8trans       5.42            190             7trans       5.50            150             9

现在,我想要测试一个人,具有以下属性(测试数据),以确定其性别,

 HEIGHT(feet)   WEIGHT (lbs)    FOOT-SIZE (inches) 4              150             12

这也可能是一个多行矩阵。


假设,我能够仅隔离出数据中的男性部分,并将其排列成矩阵,

enter image description here

并且,我想找到其Parzen密度函数,与以下行矩阵进行比较,该行矩阵代表另一人的相同数据(男性/女性/跨性别),

enter image description heredataPoint可能有多个行。)

这样我们就可以找到这些数据与那些男性的匹配程度。


我的尝试解决方案:

enter image description here


(1)由于矩阵的维度不匹配,我无法计算secondPart我该如何解决这个问题?

(2)这种方法正确吗?


MATLAB代码

male = [6.0000  180   12        5.9200  190   11        5.5800  170   12        5.9200  165   10];dataPoint = [4 150 2]variance  = var(male);

parzen.m

function [retval] = parzen (male, dataPoint, variance)    clc    %male    %dataPoint    %variance    sub = male - dataPoint    up = sub.^2    dw = 2 * variance;    sqr = sqrt(variance*2*pi);    firstPart = sqr.^(-1);    e = dw.^(-1)    secPart = exp((-1)*e*up);    pdf = firstPart.* secPart;    retval = mean(pdf);

bayes.m

function retval = bayes (train, test, aprori)    clc    classCounts = rows(unique(train(:,1)));    %pdfmx = ones(rows(test), classCounts);    %%Parzen density.    %pdf = parzen(train(:,2:end), test(:,2:end), variance);    maxScore = 0;    pdfProduct = 1;     for type = 1 : classCounts          %if(type == 1)        clidxTrain = train(:,1) == type;        %clidxTest = test(:,1) == type;        trainMatrix = train(clidxTrain,2:end);        variance = var(trainMatrix);        pdf = parzen(trainMatrix, test, variance);        %dictionary{type, 1} = type;        %dictionary{type, 2} = prod(pdf);        %pdfProduct = pdfProduct .* pdf;        %end    end    for type=1:classCounts    end    retval = 0;  endfunction

回答:

首先,你的示例人物有一个非常小的脚!

其次,你似乎将核密度估计和朴素贝叶斯混合在一起。在KDE中,你通过样本中每个数据点的核的总和来估计pdf。因此,如果你想对男性的身高进行KDE,你会将四个高斯分布相加,每个分布分别位于不同男性的身高上。

在朴素贝叶斯中,你假设特征(身高、脚长等)是独立的,并且每个特征都服从正态分布。你从训练数据中估计每个特征的单个高斯分布的参数,然后使用它们的乘积来获得新示例属于某一类别的联合概率。你链接的第一页对此解释得相当好。

在代码中:

clearhuman = [6.0000  180   12        5.9200  190   11        5.5800  170   12        5.9200  165   10];tiger = [    2   2000 17    3   1980 16    3.5 2100 18    3   2020 18    4.1 1800 20];dataPoints = [    4 150 12    3 2500 20    ];sigSqH  = var(human);muH = mean(human);sigSqT  = var(tiger);muT = mean(tiger);for i = 1:size(dataPoints, 1)    i    probHuman = prod( 1./sqrt(2*pi*sigSqH) .* exp( -(dataPoints(i,:) - muH).^2 ./ (2*sigSqH) ) )    probTiger = prod( 1./sqrt(2*pi*sigSqT) .* exp( -(dataPoints(i,:) - muT).^2 ./ (2*sigSqT)  ) )end

通过比较老虎和人类的概率,我们可以得出结论,dataPoints(1,:)是一个人,而dataPoints(2,:)是一只老虎。你可以通过例如添加属于某一类别的先验概率来使模型更加复杂,这将乘以probHumanprobTiger

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注