em演算法,即最大期望演算法(expectation maximization algorithm,又譯期望最大化演算法),是一種迭代演算法,用於含有隱變數(latent variable)的概率引數模型的最大似然估計或極大後驗概率估計。
em演算法應用於高斯混合模型(gmm)、聚類、隱式馬爾科夫演算法(hmm)、基於概率的plsa模型等等。
問題一:
現在乙個班裡有50個男生,50個女生。我們假定男生的身高服從正態分佈
問題二:
但現在我們讓情況複雜一點,就是這50個男生和50個女生混在一起了。我們擁有100個人的身高資料,但是我們不知道抽取的那100個人裡面的每乙個人到底是從男生的那個身高分布裡面抽取的,還是女生的那個身高分布抽取的。 用數學的語言就是,抽取得到的每個樣本都不知道是從哪個分布抽取的。 這個時候,對於每乙個樣本,就有兩個東西需要猜測或者估計:
(1)這個人是男的還是女的?
(2)男生和女生對應的身高的高斯分布的引數是多少?
em演算法要解決的問題是: (1)求出每乙個樣本屬於哪個分布
(2)求出每乙個分布對應的引數
1.初始化引數:先初始化男生身高的正態分佈的引數:如均值=1.7,方差=0.1
2.計算每乙個人更可能屬於男生分布或者女生分布;
3.通過分為男生的n個人來重新估計男生身高分布的引數(最大似然估計),女生分布也按照相同的方式估計出來,更新分布。
4.這時候兩個分布的概率也變了,然後重複步驟(1)至(3),直到引數不發生變化為止。
總結:其實em演算法就是先通過假設的引數把資料進行分類,然後通過分類的資料計算引數,接著對比計算的引數和假設的引數是否滿足精度,不滿足就返回去,滿足就結束。
原圖及效果圖:
opencv原始碼:
#include #include using namespace cv;
using namespace cv::ml;
using namespace std;
int main(int argc, char** ar**)
char* inputwintitle = "input image";
namedwindow(inputwintitle, cv_window_autosize);
imshow(inputwintitle, src);
// 初始化
int numcluster = 3;
const scalar colors = ;
int width = src.cols;
int height = src.rows;
int dims = src.channels();
int nsamples = width*height;
mat points(nsamples, dims, cv_64fc1);
mat labels;
mat result = mat::zeros(src.size(), cv_8uc3);
// 影象rgb畫素資料轉換為樣本資料
int index = 0;
for (int row = 0; row < height; row++)
} // em cluster train
ptrem_model = em::create();
em_model->setclustersnumber(numcluster);
em_model->setcovariancematrixtype(em::cov_mat_spherical);
em_model->settermcriteria(termcriteria(termcriteria::eps + termcriteria::count, 100, 0.1));
em_model->trainem(points, noarray(), labels, noarray());
// 對每個畫素標記顏色與顯示
mat sample(1, dims, cv_64fc1);//
double time = gettickcount();
int r = 0, g = 0, b = 0;
for (int row = 0; row < height; row++)
} printf("execution time(ms) : %.2f\n", (gettickcount() - time) / gettickfrequency() * 1000);
imshow("em-segmentation", result);
waitkey(0);
return 0;
}
EM演算法原理
在聚類中我們經常用到em演算法 i.e.estimation maximization 進行引數估計,在該演算法中我們通過函式的凹 凸性,在estimation和maximization兩步中迭代地進行引數估計,並保證可以演算法收斂,達到區域性最優解。ps 為了不在11.11這個吉祥的日子發blog...
EM演算法原理
在聚類中我們經常用到em演算法 i.e.expectation maximization 進行引數估計,在該演算法中我們通過函式的凹 凸性,在expectation 和maximization兩步中迭代地進行引數估計,並保證可以演算法收斂,達到區域性最優解。ps 為了不在11.11這個吉祥的日子發b...
EM演算法原理
在聚類中我們經常用到em演算法 i.e.expectation maximization 進行引數估計,在該演算法中我們通過函式的凹 凸性,在expectation 和maximization兩步中迭代地進行引數估計,並保證可以演算法收斂,達到區域性最優解。ps 為了不在11.11這個吉祥的日子發b...