Weka中EM算法详解
private void EM_Init (Instances inst)
throws Exception {
int i, j, k; // 由于EM算法对初始值较敏感,故选择run k means 10 times and choose best solution
SimpleKMeans bestK = null;
double bestSqE = Double.MAX_VALUE;
for (i = 0; i < 10; i++) {
SimpleKMeans sk = new SimpleKMeans();
sk.setSeed(m_rr.nextInt());
sk.setNumClusters(m_num_clusters);
sk.setDisplayStdDevs(true);
sk.buildClusterer(inst);
//KMeans中各个cluster的平方误差
if (sk.getSquaredError() < bestSqE) { bestSqE = sk.getSquaredError();
bestK = sk;
}
} /*************** KMeans Finds the best cluster number *****************/ // initialize with best k-means solution
m_num_clusters = bestK.numberOfClusters();
// 每个样本所在各个集群的概率
m_weights = new double[inst.numInstances()][m_num_clusters];
// 评估每个集群所对应的离散型属性的相关取值
30 m_model = new DiscreteEstimator[m_num_clusters][m_num_attribs];
// 每个集群所对应的连续性属性数所对应的相关取值(均值,标准偏差,样本权值(进行归一化))
m_modelNormal = new double[m_num_clusters][m_num_attribs][3];
// 每个集群所对应的先验概率
m_priors = new double[m_num_clusters];
// 每个集群所对应的中心点
Instances centers = bestK.getClusterCentroids();
// 每个集群所对应的标准差
Instances stdD = bestK.getClusterStandardDevs();
// ??? Returns for each cluster the frequency counts for the values of each nominal attribute
int [][][] nominalCounts = bestK.getClusterNominalCounts();
// 得到每个集群所对应的样本数
int [] clusterSizes = bestK.getClusterSizes(); for (i = 0; i < m_num_clusters; i++) {
Instance center = centers.instance(i);
for (j = 0; j < m_num_attribs; j++) { // 样本属性是离散型
if (inst.attribute(j).isNominal())
{
m_model[i][j] = new DiscreteEstimator(m_theInstances.attribute(j).numValues()
, true);
for (k = 0; k < inst.attribute(j).numValues(); k++) {
m_model[i][j].addValue(k, nominalCounts[i][j][k]);
}
}
//// 样本属性是连续型
else
{
double minStdD = (m_minStdDevPerAtt != null)? m_minStdDevPerAtt[j]: m_minStdDev;
double mean = (center.isMissing(j))? inst.meanOrMode(j): center.value(j);
m_modelNormal[i][j][0] = mean;
double stdv = (stdD.instance(i).isMissing(j))? ((m_maxValues[j] -
m_minValues[j]) / (2 * m_num_clusters)): stdD.instance(i).value(j);
if (stdv < minStdD)
{
stdv = inst.attributeStats(j).numericStats.stdDev;
if (Double.isInfinite(stdv)) {
stdv = minStdD;
}
if (stdv < minStdD) {
stdv = minStdD;
}
}
if (stdv <= 0) {
stdv = m_minStdDev;
} m_modelNormal[i][j][1] = stdv;
m_modelNormal[i][j][2] = 1.0;
}
}
} for (j = 0; j < m_num_clusters; j++) {
// 计算每个集群的先验概率
m_priors[j] = clusterSizes[j];
}
Utils.normalize(m_priors);
}
Weka中EM算法详解的更多相关文章
- EM算法详解
EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...
- css中em单位详解,说明
em详解 em可以理解成“倍”. em会以父级元素中所设置的字体像素值为基准值进行成倍放大: 字体大小=(父级元素中的字体像素 * em的值) 例: 网页部分代码如下: 1.我现在没有在父级 ...
- 从最大似然函数 到 EM算法详解
极大似然算法 本来打算把别人讲的好的博文放在上面的,但是感觉那个适合看着玩,我看过之后感觉懂了,然后实际应用就不会了.... MLP其实就是用来求模型参数的,核心就是“模型已知,求取参数”,模型的意思 ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- SVD在推荐系统中的应用详解以及算法推导
SVD在推荐系统中的应用详解以及算法推导 出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...
随机推荐
- Activiti 多个并发子流程的应用
多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批. 流程如下: 要解决以上问题,需要实现多个子流程并行处 ...
- windows下用mingw编译linux项目
1.下载安装mingw32 2.将mingw下bin和msys\1.0下bin设置为系统path 3.启动msys.bat 4.cd到项目目录 5.输入./configure 6.输入make 7.输 ...
- php 获取指定日期所在月份的最后一天
本文引用来自 http://hi.baidu.com/yflife/item/fd00ef142c5967fcdceeca84 php 获取指定月最后一天: <?phpfunction gett ...
- Java常用类:String
一.介绍 String:不可变的Unicode字符序列 例如:"Java" 就是4个Unicode字符J,a,v,a组成的 Java没有内置的字符串类型,而是在标准的J ...
- AndroidSdk离线下载
http://dl.vmall.com/c00x42abt3# 关键字:android sdk 离线
- hdu 1850 Being a Good Boy in Spring Festival(Nimm Game)
题意:Nimm Game 思路:Nimm Game #include<iostream> #include<stdio.h> using namespace std; int ...
- HDU5807 Keep In Touch (BestCoder Round #86 D ) 分布式dp
#include <cstdio> #include <cstring> #include <cmath> #include <vector> #inc ...
- hihocoder 1356 分隔相同整数 简单贪心
分析:考虑贪心,考虑填ans[i],前i-1个合法,现在剩下一些数, 那么挑出出现次数最多的数,次数为mx,当前剩余总数为sum 如果sum-mx>=mx-1那么肯定有解,这个想想就知道了(这种 ...
- leetcode—sudoku solver
1.题目描述 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicate ...
- linux进程控制命令
& 加在一个命令的最后,可以把这个命令放到后台执行 ,如gftp &. ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态,不可执行. jobs 查看当前有多少在 ...