我的目的是通过贝叶斯分类器算法来确定其类别。
假设,以下训练数据描述了不同性别的身高、体重和脚长
SEX HEIGHT(feet) WEIGHT (lbs) FOOT-SIZE (inches)male 6 180 12male 5.92 (5'11") 190 11male 5.58 (5'7") 170 12male 5.92 (5'11") 165 10female 5 100 6female 5.5 (5'6") 150 8female 5.42 (5'5") 130 7female 5.75 (5'9") 150 9trans 4 200 5trans 4.10 150 8trans 5.42 190 7trans 5.50 150 9
现在,我想要测试一个人,具有以下属性(测试数据),以确定其性别,
HEIGHT(feet) WEIGHT (lbs) FOOT-SIZE (inches) 4 150 12
这也可能是一个多行矩阵。
假设,我能够仅隔离出数据中的男性部分,并将其排列成矩阵,
并且,我想找到其Parzen密度函数,与以下行矩阵进行比较,该行矩阵代表另一人的相同数据(男性/女性/跨性别),
这样我们就可以找到这些数据与那些男性的匹配程度。
我的尝试解决方案:
(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,你会将四个高斯分布相加,每个分布分别位于不同男性的身高上。
在朴素贝叶斯中,你假设特征(身高、脚长等)是独立的,并且每个特征都服从正态分布。你从训练数据中估计每个特征的单个高斯分布的参数,然后使用它们的乘积来获得新示例属于某一类别的联合概率。你链接的第一页对此解释得相当好。
在代码中:
clearhuman = [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
。