㈠ 怎麼利用r語言做em演算法估計混合雙參數指數分布的數值模擬
建議你先看一下這本書:
Modeling Survival Data Using Frailty Models
chap 2. Some Parametric Methods
2.1 Introction . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Exponential Distribution . . . . . . . . . . . . . . . . . . . 20
2.3 Weibull Distribution . . . . . . . . . . . . . . . . . . . . . 21
2.4 Extreme Value Distributions . . . . . . . . . . . . . . . . 23
2.5 Lognormal . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.6 Gamma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.7 Loglogistic . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.8 Maximum Likelihood Estimation . . . . . . . . . . . . . 30
2.9 Parametric Regression Models
chap 6. Estimation Methods for Shared Frailty Models
6.1 Introction . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.2 Inference for the Shared Frailty Model . . . . . . . . . . 106
6.3 The EM Algorithm . . . . . . . . . . . . . . . . . . . . . . . 108
6.4 The Gamma Frailty Model . . . . . . . . . . . . . . . . . . . 110
6.5 The Positive Stable Frailty Model . . . . . . . . . . . . . . 111
6.6 The Lognormal Frailty Model . . . . . . . . . . . . . . . . . 113
6.6.1 Application to Seizure Data . . . . . . . . . . . . . . . 113
6.7 Modified EM (MEM) Algorithm for Gamma Frailty Models 114
6.8 Application
然後用最基本的package "survival"
並參考你的模型可能用到的一些functions:
survreg(formula, data, weights, subset,na.action, dist="weibull",....)
survreg.distributions include "weibull", "exponential", "gaussian",
"logistic","lognormal" and "loglogistic"
frailty(x, distribution="gamma", ...)
distribution: either the gamma, gaussian or t distribution may be specified.
frailty.gamma(x, sparse = (nclass > 5), theta, df, eps = 1e-05,
method = c("em","aic", "df", "fixed"),...)
㈡ 運行MATLAB配置要求
處理器:intel i7 3770K或以上的四核。
內存:三通道DDR3 1600,三條4G的
操作系統:64位的win7或Vista(這樣12G內存可以全部調用,32位的系統最多隻能調用3.25G)
==如果要預算便宜1000塊,建議
AMD推土機FX-8150。動態加速到4.5G的8核,2013版的Matlab也算不死。
內存:雙通道DDR3 1866,4G兩條或8G兩條。
系統:64位
==intel的i7,不用買1866內存,因為內存控制器只支持到1600。推土機支持1866的。
推土機的功耗比i7大48W(一年開機365天,每天8小時,電費多50塊),發熱較大,因此建議買保一年的散片,1060。另買散熱器:超頻三 黃海S90F至尊版,95。 不買盒裝(1220)。盒裝的散熱器不好。
㈢ 機器學習需要什麼數學基礎
數學基礎
歡迎補充。
文中提供的PDF下載鏈接,均來自於網路,如有問題,請站內告知。
《矩陣分析》 PDFRoger Horn。矩陣分析領域無爭議的經典
《概率論及其應用》 PDF威廉·費勒。極牛的書,可數學味道太重,不適合做機器學習的
《All Of Statistics》 PDF 掃描版PDF 高清版機器學習這個方向,統計學也一樣非常重要。推薦All of statistics,這是CMU的一本很簡潔的教科書,注重概念,簡化計算,簡化與Machine Learning無關的概念和統計內容,可以說是很好的快速入門材料。
《Nonlinear Programming, 2nd》 PDF最優化方法,非線性規劃的參考書。
《Convex Optimization》 PDF配套代碼Boyd的經典書籍,被引用次數超過14000次,面向實際應用,並且有配套代碼,是一本不可多得的好書。
《Numerical Optimization》 PDF第二版,Nocedal著,非常適合非數值專業的學生和工程師參考,演算法流程清晰詳細,原理清楚。
《Introction to Mathematical Statistics》 PDF第六版,Hogg著,本書介紹了概率統計的基本概念以及各種分布,以及ML,Bayesian方法等內容。
《An Introction to Probabilistic Graphical Models》 PDFJordan著,本書介紹了條件獨立、分解、混合、條件混合等圖模型中的基本概念,對隱變數(潛在變數)也做了詳細介紹,相信大家在隱馬爾科夫鏈和用Gaussian混合模型來實現EM演算法時遇到過這個概念。
《Probabilistic Graphical Models-Principles and Techniques》 PDFKoller著,一本很厚很全面的書,理論性很強,可以作為參考書使用。
具體數學 PDF經典
bind一月 4
線性代數 (Linear Algebra):我想國內的大學生都會學過這門課程,但是,未必每一位老師都能貫徹它的精要。這門學科對於Learning是必備的基礎,對它的透徹掌握是必不可少的。我在科大一年級的時候就學習了這門課,後來到了香港後,又重新把線性代數讀了一遍,所讀的是
Introction to Linear Algebra (3rd Ed.) by Gilbert Strang.
這本書是MIT的線性代數課使用的教材,也是被很多其它大學選用的經典教材。它的難度適中,講解清晰,重要的是對許多核心的概念討論得比較透徹。我個人覺得,學習線性代數,最重要的不是去熟練矩陣運算和解方程的方法——這些在實際工作中MATLAB可以代勞,關鍵的是要深入理解幾個基礎而又重要的概念:子空間(Subspace),正交(Orthogonality),特徵值和特徵向量(Eigenvalues and eigenvectors),和線性變換(Linear transform)。從我的角度看來,一本線代教科書的質量,就在於它能否給這些根本概念以足夠的重視,能否把它們的聯系講清楚。Strang的這本書在這方面是做得很好的。
而且,這本書有個得天獨厚的優勢。書的作者長期在MIT講授線性代數課(18.06),課程的video在MIT的Open courseware網站上有提供。有時間的朋友可以一邊看著名師授課的錄像,一邊對照課本學習或者復習。
Linear Algebra
概率和統計 (Probability and Statistics):概率論和統計的入門教科書很多,我目前也沒有特別的推薦。我在這里想介紹的是一本關於多元統計的基礎教科書:
Applied Multivariate Statistical Analysis (5th Ed.) by Richard A. Johnson and Dean W. Wichern
這本書是我在剛接觸向量統計的時候用於學習的,我在香港時做研究的基礎就是從此打下了。實驗室的一些同學也借用這本書學習向量統計。這本書沒有特別追求數學上的深度,而是以通俗易懂的方式講述主要的基本概念,讀起來很舒服,內容也很實用。對於Linear regression, factor analysis, principal component analysis (PCA), and canonical component analysis (CCA)這些Learning中的基本方法也展開了初步的論述。
之後就可以進一步深入學習貝葉斯統計和Graphical models。一本理想的書是
Introction to Graphical Models (draft version). by M. Jordan and C. Bishop.
我不知道這本書是不是已經出版了(不要和Learning in Graphical Models混淆,那是個論文集,不適合初學)。這本書從基本的貝葉斯統計模型出發一直深入到復雜的統計網路的估計和推斷,深入淺出,statistical learning的許多重要方面都在此書有清楚論述和詳細講解。MIT內部可以access,至於外面,好像也是有電子版的。
㈣ 基於混合高斯模型的EM演算法在MATLAB中實現後,為什麼輸出的極大似然函數值隨著聚類個數的增多而變大
應該是「過擬合」了吧。雖然在EM中沒有真正的「過擬合」一說,但是類別增多,每個數據點會以更高的概率分配到這些類別上。
㈤ em演算法是什麼
最大期望演算法(Expectation-Maximization algorithm, EM),或Dempster-Laird-Rubin演算法,是一類通過迭代進行極大似然估計(Maximum Likelihood Estimation, MLE)的優化演算法 ,通常作為牛頓迭代法(Newton-Raphson method)的替代用於對包含隱變數(latent variable)或缺失數據(incomplete-data)的概率模型進行參數估計。
EM演算法的標准計算框架由E步(Expectation-step)和M步(Maximization step)交替組成,演算法的收斂性可以確保迭代至少逼近局部極大值 。EM演算法是MM演算法(Minorize-Maximization algorithm)的特例之一,有多個改進版本,包括使用了貝葉斯推斷的EM演算法、EM梯度演算法、廣義EM演算法等 。
由於迭代規則容易實現並可以靈活考慮隱變數,EM演算法被廣泛應用於處理數據的缺測值 ,以及很多機器學習(machine learning)演算法,包括高斯混合模型(Gaussian Mixture Model, GMM) 和隱馬爾可夫模型(Hidden Markov Model, HMM) 的參數估計。
㈥ 如何系統地學習數據挖掘
看數據挖掘方面的演算法理論時經常感覺一些公式的推導過程如天書一般,例如看svm的數學證明,EM演算法..,感覺知識跳躍比較大,那麼數據挖掘系統的學習過程是怎麼樣?
磨刀不誤砍柴工。在學習數據挖掘之前應該明白幾點:
數據挖掘目前在中國的尚未流行開,猶如屠龍之技。
數據初期的准備通常占整個數據挖掘項目工作量的70%左右。
數據挖掘本身融合了統計學、資料庫和機器學習等學科,並不是新的技術。
數據挖掘技術更適合業務人員學習(相比技術人員學習業務來的更高效)
數據挖掘適用於傳統的BI(報表、OLAP等)無法支持的領域。
數據挖掘項目通常需要重復一些毫無技術含量的工作。
如果你閱讀了以上內容覺得可以接受,那麼繼續往下看。
學習一門技術要和行業靠攏,沒有行業背景的技術如空中樓閣。技術尤其是計算機領域的技術發展是寬泛且快速更替的(十年前做網頁設計都能成立公司),一般人沒有這個精力和時間全方位的掌握所有技術細節。但是技術在結合行業之後就能夠獨當一面了,一方面有利於抓住用戶痛點和剛性需求,另一方面能夠累計行業經驗,使用互聯網思維跨界讓你更容易取得成功。不要在學習技術時想要面面俱到,這樣會失去你的核心競爭力。
一、目前國內的數據挖掘人員工作領域大致可分為三類。
數據分析師:在擁有行業數據的電商、金融、電信、咨詢等行業里做業務咨詢,商務智能,出分析報告。
數據挖掘工程師:在多媒體、電商、搜索、社交等大數據相關行業里做機器學習演算法實現和分析。
科學研究方向:在高校、科研單位、企業研究院等高大上科研機構研究新演算法效率改進及未來應用。
二、說說各工作領域需要掌握的技能。
(1).數據分析師
需要有深厚的數理統計基礎,但是對程序開發能力不做要求。
需要熟練使用主流的數據挖掘(或統計分析)工具如Business Analytics and Business Intelligence Software(SAS)、SPSS、EXCEL等。
需要對與所在行業有關的一切核心數據有深入的理解,以及一定的數據敏感性培養。
經典圖書推薦:《概率論與數理統計》、《統計學》推薦David Freedman版、《業務建模與數據挖掘》、《數據挖掘導論》、《SAS編程與數據挖掘商業案例》、《Clementine數據挖掘方法及應用 》、《Excel 2007 VBA參考大全》、《IBM SPSS Statistics 19 Statistical Proceres Companion》等。
(2).數據挖掘工程師
需要理解主流機器學習演算法的原理和應用。
需要熟悉至少一門編程語言如(Python、C、C++、java、Delphi等)。
需要理解資料庫原理,能夠熟練操作至少一種資料庫(Mysql、SQL、DB2、Oracle等),能夠明白MapRece的原理操作以及熟練使用Hadoop系列工具更好。
經典圖書推薦:《數據挖掘概念與技術》、《機器學習實戰》、《人工智慧及其應用》、《資料庫系統概論》、《演算法導論》、《Web數據挖掘》、《 Python標准庫》、《thinking in Java》、《Thinking in C++》、《數據結構》等。
(3).科學研究方向
需要深入學習數據挖掘的理論基礎,包括關聯規則挖掘 (Apriori和FPTree)、分類演算法(C4.5、KNN、Logistic Regression、SVM等) 、聚類演算法 (Kmeans、Spectral Clustering)。目標可以先吃透數據挖掘10大演算法各自的使用情況和優缺點。
相對SAS、SPSS來說R語言更適合科研人員The R Project for Statistical Computing,因為R軟體是完全免費的,而且開放的社區環境提供多種附加工具包支持,更適合進行統計計算分析研究。雖然目前在國內流行度不高,但是強烈推薦。
可以嘗試改進一些主流演算法使其更加快速高效,例如實現Hadoop平台下的SVM雲演算法調用平台--web 工程調用hadoop集群。
需要廣而深的閱讀世界著名會議論文跟蹤熱點技術。如KDD,ICML,IJCAI,Association for the Advancement of Artificial Intelligence,ICDM 等等;還有數據挖掘相關領域期刊:ACM Transactions on Knowledge Discovery from Data,IEEE Transactions on Knowledge and Data Engineering,Journal of Machine Learning Research Homepage,IEEE Xplore: Pattern Analysis and Machine Intelligence, IEEE Transactions on等。
可以嘗試參加數據挖掘比賽培養全方面解決實際問題的能力。如Sig KDD ,Kaggle: Go from Big Data to Big Analytics等。
可以嘗試為一些開源項目貢獻自己的代碼,比如Apache Mahout: Scalable machine learning and data mining ,myrrix等(具體可以在SourceForge或GitHub.上發現更多好玩的項目)。
經典圖書推薦:《機器學習》 《模式分類》《統計學習理論的本質》《統計學習方法》《數據挖掘實用機器學習技術》《R語言實踐》,英文素質是科研人才必備的《Machine Learning: A Probabilistic Perspective》《Scaling up Machine Learning : Parallel and Distributed Approaches》《Data Mining Using SAS Enterprise Miner : A Case Study Approach》《Python for Data Analysis》等。
三、以下是通信行業數據挖掘工程師的工作感受。
真正從數據挖掘項目實踐的角度講,溝通能力對挖掘的興趣愛好是最重要的,有了愛好才可以願意鑽研,有了不錯的溝通能力,才可以正確理解業務問題,才能正確把業務問題轉化成挖掘問題,才可以在相關不同專業人才之間清楚表達你的意圖和想法,取得他們的理解和支持。所以我認為溝通能力和興趣愛好是個人的數據挖掘的核心競爭力,是很難學到的;而其他的相關專業知識誰都可以學,算不上個人發展的核心競爭力。
說到這里可能很多數據倉庫專家、程序員、統計師等等都要扔磚頭了,對不起,我沒有別的意思,你們的專業對於數據挖掘都很重要,大家本來就是一個整體的,但是作為單獨一個個體的人來說,精力有限,時間有限,不可能這些領域都能掌握,在這種情況下,選擇最重要的核心,我想應該是數據挖掘技能和相關業務能力吧(從另外的一個極端的例子,我們可以看, 比如一個迷你型的挖掘項目,一個懂得市場營銷和數據挖掘技能的人應該可以勝任。這其中他雖然不懂數據倉庫,但是簡單的Excel就足以勝任高打6萬個樣本的數據處理;他雖然不懂專業的展示展現技能,但是只要他自己看的懂就行了,這就無需什麼展示展現;前面說過,統計技能是應該掌握的,這對一個人的迷你項目很重要;他雖然不懂編程,但是專業挖掘工具和挖掘技能足夠讓他操練的;這樣在迷你項目中,一個懂得挖掘技能和市場營銷業務能力的人就可以圓滿完成了,甚至在一個數據源中根據業務需求可以無窮無盡的挖掘不同的項目思路,試問就是這個迷你項目,單純的一個數據倉庫專家、單純的一個程序員、單純的一個展示展現技師、甚至單純的一個挖掘技術專家,都是無法勝任的)。這從另一個方面也說明了為什麼溝通能力的重要,這些個完全不同的專業領域,想要有效有機地整合在一起進行數據挖掘項目實踐,你說沒有好的溝通能力行嗎?
數據挖掘能力只能在項目實踐的熔爐中提升、升華,所以跟著項目學挖掘是最有效的捷徑。國外學習挖掘的人都是一開始跟著老闆做項目,剛開始不懂不要緊,越不懂越知道應該學什麼,才能學得越快越有效果。我不知道國內的數據挖掘學生是怎樣學的,但是從網上的一些論壇看,很多都是紙上談兵,這樣很浪費時間,很沒有效率。
另外現在國內關於數據挖掘的概念都很混亂,很多BI只是局限在報表的展示和簡單的統計分析,卻也號稱是數據挖掘;另一方面,國內真正規模化實施數據挖掘的行業是屈指可數(銀行、保險公司、移動通訊),其他行業的應用就只能算是小規模的,比如很多大學都有些相關的挖掘課題、挖掘項目,但都比較分散,而且都是處於摸索階段,但是我相信數據挖掘在中國一定是好的前景,因為這是歷史發展的必然。
講到移動方面的實踐案例,如果你是來自移動的話,你一定知道國內有家叫華院分析的公司(申明,我跟這家公司沒有任何關系,我只是站在數據挖掘者的角度分析過中國大多數的號稱數據挖掘服務公司,覺得華院還不錯,比很多徒有虛名的大公司來得更實際),他們的業務現在已經覆蓋了絕大多數中國省級移動公司的分析挖掘項目,你上網搜索一下應該可以找到一些詳細的資料吧。我對華院分析印象最深的一點就是2002年這個公司白手起家,自己不懂不要緊,一邊自學一邊開始拓展客戶,到現在在中國的移動通訊市場全面開花,的確佩服佩服呀。他們最開始都是用EXCEL處理數據,用肉眼比較選擇比較不同的模型,你可以想像這其中的艱難吧。
至於移動通訊的具體的數據挖掘的應用,那太多了,比如不同話費套餐的制訂、客戶流失模型、不同服務交叉銷售模型、不同客戶對優惠的彈性分析、客戶群體細分模型、不同客戶生命周期模型、渠道選擇模型、惡意欺詐預警模型,太多了,記住,從客戶的需求出發,從實踐中的問題出發,移動中可以發現太多的挖掘項目。最後告訴你一個秘密,當你數據挖掘能力提升到一定程度時,你會發現無論什麼行業,其實數據挖掘的應用有大部分是重合的相似的,這樣你會覺得更輕松。
㈦ matlab實現EM演算法
1. EM演算法程序:
http://www.mathworks.com/matlabcentral/fileexchange/3713-em-algorithm-for-clustering-emfc-m
2. EM image segmentation:
http://www.mathworks.com/matlabcentral/fileexchange/10956-em-image-segmentation
3. 貝葉斯圖像分割程序:(Bayseian image segmentation)
沒有找到合適的程序代碼 :-(
㈧ R語言有沒有做CRF或者「命名實體識別」的包
基本上需要rule-based + ML-based 方法。
規則就要根據實際數據來設計了。如果有標注數據,那麼我想應該可以EM演算法學出一些對齊信息來(word alignment)。
㈨ 急求如何用MATLab實現EM演算法
最大期望演算法(Expectation Maximization Algorithm,又譯期望最大化演算法),是一種迭代演算法,用於含有隱變數(hidden variable)的概率參數模型的最大似然估計或極大後驗概率估計。
實現代碼如下:
02 Jul 2015 hui cheng
06 May 2015 Mei Dong
very good job!
12 Nov 2014 Jobaer
please, sir , send me a source code on image segmentation. I want to segement weeds from soil.My email address is [email protected] .
18 Jan 2014 HuangJunFeng HuangJunFeng
16 Dec 2013 widdy
19 Feb 2013 Tong Chu
01 Jan 2013 manas nag
sir
after executing this it is declaring that k is undefined
04 Dec 2012 Jason Rebello
Some people want to know how to view the segmented image. For example suppose you have two classes ie k=2; us the following code to view it
[row col] = size(ima);
final_img = zeros(row,col);
for i=1:row
for j=1:col
if mask(i,j)==1
final_img(i,j)=1;
else
final_img(i,j)=255;
end
end
end
imshow(final_img/255);
This is a naive way of viewing it .. you may have to change somethings if k>2. Anywayz hope it helps. The mask basically stores the segmented image.
16 Nov 2011 surya
great job.i am using the same algorithm in my project for x-ray images.can u please tell how to view the segmented image
Comment only
18 Feb 2010 prashanth
Sir, I am starting my project on the same subject. i was unable to find the algorithm psuedocode for em algorithm. kindly send me one at [email protected]. Also can u just tell me the explanation for the source code..
Comment only
21 Dec 2009 maria
Hi, could you please explain how I can use "mask" to see result of segmentation??
Comment only
17 Mar 2009 Patrick
Greetings Prof., Very nice .. could you please let me know what exactly does the mask variable store ? As what i see it classifies each pixel that falls within each class . Am i correct in that assumption?
Thanks
24 May 2008 darko brajicic
great job!
27 Apr 2008 Bilo Bilo
Thanks
15 Aug 2007 smiled fisher
06 Nov 2006 Karthik Raja T
HI, Greetings,can it for my color image segmentation ?
04 Sep 2006 Mikel Rodriguez
12 Jul 2006 carlos mas
03 May 2006 Mohamed Sami
look when u make a code u must show us the output to see it then u read ur code .. try to explain that with output we can see bye
㈩ 誰做過 EM演算法 java實現
參考:
packagenlp;
/**
*@authorOrisun
*date2011-10-22
*/
importjava.util.ArrayList;
publicclassBaumWelch{
intM;//隱藏狀態的種數
intN;//輸出活動的種數
double[]PI;//初始狀態概率矩陣
double[][]A;//狀態轉移矩陣
double[][]B;//混淆矩陣
ArrayList<Integer>observation=newArrayList<Integer>();//觀察到的集合
ArrayList<Integer>state=newArrayList<Integer>();//中間狀態集合
int[]out_seq={2,1,1,1,2,2,2,2,2,1,1,1,1,2,2,2,2,1,1,
1,1,1,2,2,2,1,1,1,1,1,2,1};//測試用的觀察序列
int[]hidden_seq={1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,
1,1,1,1,2,2,2,1,1,1,1,1,1,1};//測試用的隱藏狀態序列
intT=32;//序列長度為32
double[][]alpha=newdouble[T][];//向前變數
doublePO;
double[][]beta=newdouble[T][];//向後變數
double[][]gamma=newdouble[T][];
double[][][]xi=newdouble[T-1][][];
//初始化參數。Baum-Welch得到的是局部最優解,所以初始參數直接影響解的好壞
publicvoidinitParameters(){
M=2;
N=2;
PI=newdouble[M];
PI[0]=0.5;
PI[1]=0.5;
A=newdouble[M][];
B=newdouble[M][];
for(inti=0;i<M;i++){
A[i]=newdouble[M];
B[i]=newdouble[N];
}
A[0][0]=0.8125;
A[0][1]=0.1875;
A[1][0]=0.2;
A[1][1]=0.8;
B[0][0]=0.875;
B[0][1]=0.125;
B[1][0]=0.25;
B[1][1]=0.75;
observation.add(1);
observation.add(2);
state.add(1);
state.add(2);
for(intt=0;t<T;t++){
alpha[t]=newdouble[M];
beta[t]=newdouble[M];
gamma[t]=newdouble[M];
}
for(intt=0;t<T-1;t++){
xi[t]=newdouble[M][];
for(inti=0;i<M;i++)
xi[t][i]=newdouble[M];
}
}
//更新向前變數
publicvoipdateAlpha(){
for(inti=0;i<M;i++){
alpha[0][i]=PI[i]*B[i][observation.indexOf(out_seq[0])];
}
for(intt=1;t<T;t++){
for(inti=0;i<M;i++){
alpha[t][i]=0;
for(intj=0;j<M;j++){
alpha[t][i]+=alpha[t-1][j]*A[j][i];
}
alpha[t][i]*=B[i][observation.indexOf(out_seq[t])];
}
}
}
//更新觀察序列出現的概率,它在一些公式中當分母
publicvoipdatePO(){
for(inti=0;i<M;i++)
PO+=alpha[T-1][i];
}
//更新向後變數
publicvoipdateBeta(){
for(inti=0;i<M;i++){
beta[T-1][i]=1;
}
for(intt=T-2;t>=0;t--){
for(inti=0;i<M;i++){
for(intj=0;j<M;j++){
beta[t][i]+=A[i][j]
*B[j][observation.indexOf(out_seq[t+1])]
*beta[t+1][j];
}
}
}
}
//更新xi
publicvoipdateXi(){
for(intt=0;t<T-1;t++){
doublefrac=0.0;
for(inti=0;i<M;i++){
for(intj=0;j<M;j++){
frac+=alpha[t][i]*A[i][j]
*B[j][observation.indexOf(out_seq[t+1])]
*beta[t+1][j];
}
}
for(inti=0;i<M;i++){
for(intj=0;j<M;j++){
xi[t][i][j]=alpha[t][i]*A[i][j]
*B[j][observation.indexOf(out_seq[t+1])]
*beta[t+1][j]/frac;
}
}
}
}
//更新gamma
publicvoipdateGamma(){
for(intt=0;t<T-1;t++){
doublefrac=0.0;
for(inti=0;i<M;i++){
frac+=alpha[t][i]*beta[t][i];
}
//doublefrac=PO;
for(inti=0;i<M;i++){
gamma[t][i]=alpha[t][i]*beta[t][i]/frac;
}
//for(inti=0;i<M;i++){
//gamma[t][i]=0;
//for(intj=0;j<M;j++)
//gamma[t][i]+=xi[t][i][j];
//}
}
}
//更新狀態概率矩陣
publicvoipdatePI(){
for(inti=0;i<M;i++)
PI[i]=gamma[0][i];
}
//更新狀態轉移矩陣
publicvoipdateA(){
for(inti=0;i<M;i++){
doublefrac=0.0;
for(intt=0;t<T-1;t++){
frac+=gamma[t][i];
}
for(intj=0;j<M;j++){
doubledem=0.0;
//for(intt=0;t<T-1;t++){
//dem+=xi[t][i][j];
//for(intk=0;k<M;k++)
//frac+=xi[t][i][k];
//}
for(intt=0;t<T-1;t++){
dem+=xi[t][i][j];
}
A[i][j]=dem/frac;
}
}
}
//更新混淆矩陣
publicvoipdateB(){
for(inti=0;i<M;i++){
doublefrac=0.0;
for(intt=0;t<T;t++)
frac+=gamma[t][i];
for(intj=0;j<N;j++){
doubledem=0.0;
for(intt=0;t<T;t++){
if(out_seq[t]==observation.get(j))
dem+=gamma[t][i];
}
B[i][j]=dem/frac;
}
}
}
//運行Baum-Welch演算法
publicvoidrun(){
initParameters();
intiter=22;//迭代次數
while(iter-->0){
//E-Step
updateAlpha();
//updatePO();
updateBeta();
updateGamma();
updatePI();
updateXi();
//M-Step
updateA();
updateB();
}
}
publicstaticvoidmain(String[]args){
BaumWelchbw=newBaumWelch();
bw.run();
System.out.println("訓練後的初始狀態概率矩陣:");
for(inti=0;i<bw.M;i++)
System.out.print(bw.PI[i]+" ");
System.out.println();
System.out.println("訓練後的狀態轉移矩陣:");
for(inti=0;i<bw.M;i++){
for(intj=0;j<bw.M;j++){
System.out.print(bw.A[i][j]+" ");
}
System.out.println();
}
System.out.println("訓練後的混淆矩陣:");
for(inti=0;i<bw.M;i++){
for(intj=0;j<bw.N;j++){
System.out.print(bw.B[i][j]+" ");
}
System.out.println();
}
}
}