我的多元核估计计算有啥问题?
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,:)
是老虎。您可以通过例如添加属于一类或另一类的先验概率,然后将 probHuman
或 probTiger
相乘,使该模型更加复杂。
【讨论】:
以上是关于我的多元核估计计算有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章