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密度函数,该矩阵代表另一个人(男/女/变性人)的相同数据,
这样我们就可以发现这些数据与那些男性的匹配程度.
我的尝试解决方案
(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,:)老虎是人。您可以使该模型变得更加复杂,例如,添加属于一类或另一类的先验概率,然后将其乘以probHuman或probTiger。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |