我的多元核估计计算有什么问题?
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 或另一个的先验概率,然后乘以 probHuman
或 probTiger
.
我的意图是通过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 或另一个的先验概率,然后乘以 probHuman
或 probTiger
.