java naive方法_朴素贝叶斯方法(Naive Bayes Method)
樸素貝葉斯是一種很簡(jiǎn)單的分類方法,之所以稱之為樸素,是因?yàn)樗兄浅?qiáng)的前提條件-其所有特征都是相互獨(dú)立的,是一種典型的生成學(xué)習(xí)算法。所謂生成學(xué)習(xí)算法,是指由訓(xùn)練數(shù)據(jù)學(xué)習(xí)聯(lián)合概率分布P(X,Y),然后求得后驗(yàn)概率P(X|Y)。具體來(lái)說(shuō),利用訓(xùn)練數(shù)據(jù)學(xué)習(xí)P(X|Y)和p(Y)的估計(jì),得到聯(lián)合概率分布:
概率估計(jì)可以是極大似然估計(jì),或者貝葉斯估計(jì)。
假設(shè)輸入 X 為n維的向量集合,輸出 Y 為類別,X 和 Y 都是隨機(jī)變量。P(X,Y)是X和Y的聯(lián)合概率分布,訓(xùn)練數(shù)據(jù)集為:
首先,我們要明確我們求解的目標(biāo)是:,即給定某個(gè)輸入X,我們要判斷其所屬類別Ck。由概率論知識(shí),我們有:
其中,
代入公式得:
這是樸素貝葉斯分類的基本公式。于是,樸素貝葉斯分類器可以表示為
由于,分母對(duì)所有的Ck都是相同的,所以
那么如果給定一個(gè)輸入 X,我們只需要找到一個(gè)類別Ck,使得最大。那么Ck,就是 X 的最佳類別了。
下面我們來(lái)講講樸素貝葉斯法的參數(shù)估計(jì),為什么要估計(jì)樸素貝葉斯的參數(shù)呢,這些參數(shù)是什么?首先,我們要明確。現(xiàn)實(shí)中,給定我們一批數(shù)據(jù),我們就知道其分布,但是具體的數(shù)據(jù)分布的概率我們是不知道的。也就是說(shuō)先驗(yàn)概率和條件概率我們是不知道的,這就需要我們來(lái)利用其數(shù)據(jù)的分布估計(jì)其先驗(yàn)概率和條件概率了。統(tǒng)計(jì)學(xué)習(xí)中最常用的參數(shù)估計(jì)就是極大似然估計(jì)了,這里我們也可以用貝葉斯估計(jì),其實(shí)就是在極大似然估計(jì)基礎(chǔ)上添加了拉普拉斯平滑(Laplace smoothing)。
由于極大似然估計(jì)之前已經(jīng)講到過(guò),這里公式我也沒(méi)有具體來(lái)推,所以先驗(yàn)概率和條件概率直接給出來(lái)。
先驗(yàn)概率P(Y = Ck)和條件概率的極大似然估計(jì)如下:
這樣,給定具體的數(shù)據(jù),我們就可以估計(jì)其先驗(yàn)概率和條件概率,進(jìn)而計(jì)算出后驗(yàn)概率得到所屬類別。
同樣,貝葉斯估計(jì)和極大似然估計(jì)差不多,貝葉斯估計(jì)只是在極大似然估計(jì)上添加了一個(gè)拉普拉斯平滑。具體如下:
條件概率的貝葉斯估計(jì)如下:
先驗(yàn)概率的貝葉斯估計(jì)如下:
下面來(lái)給出一個(gè)簡(jiǎn)單的樸素貝葉斯實(shí)現(xiàn)代碼,代碼比較容易理解。只是課本上給出的特征是離散的,而code里面的特征是連續(xù)的。原理上其實(shí)是一樣一樣的~
1: % NAIVE BAYES CLASSIFIER
2:
3: clear
4: tic
5: disp('--- start ---')
6:
7: distr='normal';
8: distr='kernel';
9:
10: % read data
11: White_Wine = dataset('xlsfile', 'White_Wine.xlsx');
12: X = double(White_Wine(:,1:11));
13: Y = double(White_Wine(:,12));
14:
15: % Create a cvpartition object that defined the folds
16: c = cvpartition(Y,'holdout',.2);
17:
18: % Create a training set
19: x = X(training(c,1),:);
20: y = Y(training(c,1));
21: % test set
22: u=X(test(c,1),:);
23: v=Y(test(c,1),:);
24:
25: yu=unique(y);
26: nc=length(yu); % number of classes
27: ni=size(x,2); % independent variables
28: ns=length(v); % test set
29:
30: % compute class probability
31: for i=1:nc
32: fy(i)=sum(double(y==yu(i)))/length(y);
33: end
34:
35: switch distr
36:
37: case 'normal'
38:
39: % normal distribution
40: % parameters from training set
41: for i=1:nc
42: xi=x((y==yu(i)),:);
43: mu(i,:)=mean(xi,1);
44: sigma(i,:)=std(xi,1);
45: end
46: % probability for test set
47: for j=1:ns
48: fu=normcdf(ones(nc,1)*u(j,:),mu,sigma);
49: P(j,:)=fy.*prod(fu,2)';
50: end
51:
52: case 'kernel'
53:
54: % kernel distribution
55: % probability of test set estimated from training set
56: for i=1:nc
57: for k=1:ni
58: xi=x(y==yu(i),k);%the feature of dimension-k with respect to label yu(i)
59: ui=u(:,k);
60: fuStruct(i,k).f=ksdensity(xi,ui);
61: end
62: end
63: % re-structure
64: for i=1:ns
65: for j=1:nc
66: for k=1:ni
67: fu(j,k)=fuStruct(j,k).f(i);
68: end
69: end
70: P(i,:)=fy.*prod(fu,2)';
71: end
72:
73: otherwise
74:
75: disp('invalid distribution stated')
76: return
77:
78: end
79:
80: % get predicted output for test set
81: [pv0,id]=max(P,[],2);
82: for i=1:length(id)
83: pv(i,1)=yu(id(i));
84: end
85:
86: % compare predicted output with actual output from test data
87: confMat=myconfusionmat(v,pv);
88: disp('confusion matrix:')
89: disp(confMat)
90: conf=sum(pv==v)/length(pv);
91: disp(['accuracy = ',num2str(conf*100),'%'])
92:
93: toc
1: function confMat=myconfusionmat(v,pv)
2:
3: yu=unique(v);
4: confMat=zeros(length(yu));
5: for i=1:length(yu)
6: for j=1:length(yu)
7: confMat(i,j)=sum(v==yu(i) & pv==yu(j));
8: end
9: end
如果想要實(shí)驗(yàn)數(shù)據(jù)的話,請(qǐng)?jiān)诓┛拖旅嬖u(píng)論區(qū)域注明,我看到了會(huì)第一時(shí)間上傳。
總結(jié)
以上是生活随笔為你收集整理的java naive方法_朴素贝叶斯方法(Naive Bayes Method)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《Neural network and
- 下一篇: Linux系统查看位数和内存