我的多元核估计计算有什么问题?

What is the issue in my calculation of Multivariate Kernel Estimation?

我的意图是通过Bayes Classifier Algorithm找到它的class。

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

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

现在,我想测试一个具有以下属性的人(测试数据)以找到his/her性别,

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

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


假设,我只能分离数据的 male 部分并将其排列在矩阵中,

并且,我想根据以下代表另一个人的相同数据的行矩阵找到它的 Parzen Density Function(male/female/transgender),

dataPoint 可能有多行。)

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


我尝试的解决方案:


(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,你会把四个高斯分布加在一起,每个都以不同男性的身高为中心。

在朴素贝叶斯中,您假设特征(身高、脚尺寸等)是独立的,并且每个特征都是正态分布的。您从训练数据中估计每个特征的单个高斯参数,然后使用它们的乘积来获得属于某个 class 的新示例的联合概率。您 link 的第一页很好地解释了这一点。

在代码中:

clear

human = [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,:) 是老虎。你可以使这个模型更复杂,例如,添加一个 class 或另一个的先验概率,然后乘以 probHumanprobTiger.