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

Posted

技术标签:

【中文标题】我的多元核估计计算有啥问题?【英文标题】:What is the issue in my calculation of Multivariate Kernel Estimation?我的多元核估计计算有什么问题? 【发布时间】:2017-03-18 23:54:26 【问题描述】:

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

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

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

现在,我想通过以下属性(测试数据)测试一个人,以找出他/她的性别,

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

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


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

并且,我想在下面的行矩阵中找到它的Parzen Density Function,该行矩阵代表另一个人(男性/女性/跨性别)的相同数据,

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);
        %dictionarytype, 1 = type;
        %dictionarytype, 2 = prod(pdf);
        %pdfProduct = pdfProduct .* pdf;
        %end
    end

    for type=1:classCounts

    end
    retval = 0;  
endfunction

【问题讨论】:

您能否指出您正在遵循第一个链接中列出的方法,也就是说,您正在尝试复制该页面底部的代码(希望我在回答之前阅读.. .) 【参考方案1】:

首先,您的示例人物的脚很小!

第二,您似乎将核密度估计和朴素贝叶斯混合在一起。在 KDE 中,您估计 pdf 内核的总和,样本中每个数据点一个内核。因此,如果你想做一个男性身高的 KDE,你可以将四个高斯相加,每个高斯都以不同男性的身高为中心。

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

在代码中:

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,:) 是老虎。您可以通过例如添加属于一类或另一类的先验概率,然后将 probHumanprobTiger 相乘,使该模型更加复杂。

【讨论】:

以上是关于我的多元核估计计算有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

python中多元核密度估计的条件抽样

为核密度估计选择带宽和空间。 (为啥我的带宽不起作用?)

如何在核密度估计中找到局部最大值?

什么是gis核密度计算

r语言绘制核密度图怎么计算重叠

R中的高斯核密度估计