我计算多元核估计时会出现什么问题?

use*_*312 9 matlab machine-learning pattern-matching kernel-density naivebayes

我的目的是通过贝叶斯分类器算法找到它的类.

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

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
Run Code Online (Sandbox Code Playgroud)

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

 HEIGHT(feet)   WEIGHT (lbs)    FOOT-SIZE (inches)
 4              150             12
Run Code Online (Sandbox Code Playgroud)

这也可以是多行矩阵.


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

在此输入图像描述

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

在此输入图像描述(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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

器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
Run Code Online (Sandbox Code Playgroud)

小智 4

首先,你的例子的脚很小!

其次,您似乎将内核密度估计和朴素贝叶斯混合在一起。在 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
Run Code Online (Sandbox Code Playgroud)

通过比较老虎与人类的概率,我们可以得出结论:老虎dataPoints(1,:)是人,dataPoints(2,:)老虎是人。您可以使该模型变得更加复杂,例如,添加属于一类或另一类的先验概率,然后将其乘以probHumanprobTiger