注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Koala++'s blog

计算广告学 RTB

 
 
 

日志

 
 

Weka开发[28]——EM源代码分析(3)  

2009-11-28 11:12:43|  分类: 机器学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

         再把EM的步骤列一次:

Weka开发[28]——EM源代码分析(3) - quweiprotoss - Koala++s blogWeka开发[28]——EM源代码分析(3) - quweiprotoss - Koala++s blog

         1步:初始化:weka是从十次执行K-means找出最少最好的一次:

// 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);

    if (sk.getSquaredError() < bestSqE) {

       bestSqE = sk.getSquaredError();

       bestK = sk;

    }

}

         最好的一次是判断它的square error,然后如在EM for Gaussian mixtures中写到的,从它取得相应的值。

// initialize with best k-means solution

m_num_clusters = bestK.numberOfClusters();

m_weights = new double[inst.numInstances()][m_num_clusters];

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();

int[][][] nominalCounts = bestK.getClusterNominalCounts();

int[] clusterSizes = bestK.getClusterSizes();

         这里已经取得了相应的值,在下面的for循环中将它们进一步计算,得到m_modelm_modelNormalm_priors

         2步:E步骤,简单地说就是找出这个样本属于哪个类的概率是多少。

private double E(Instances inst, boolean change_weights) throws Exception {

 

    double loglk = 0.0, sOW = 0.0;

 

    for (int l = 0; l < inst.numInstances(); l++) {

 

       Instance in = inst.instance(l);

 

       loglk += in.weight() * logDensityForInstance(in);

       sOW += in.weight();

 

       if (change_weights) {

           m_weights[l] = distributionForInstance(in);

       }

    }

 

    // reestimate priors

    if (change_weights) {

       estimate_priors(inst);

    }

    return loglk / sOW;

}

       iterate调用E的时候change_weights是为true,要调用distributionForInstance,最后会调用logJointDensitiesForInstance

public double[] logJointDensitiesForInstance(Instance inst)

       throws Exception {

 

    double[] weights = logDensityPerClusterForInstance(inst);

    double[] priors = clusterPriors();

 

    for (int i = 0; i < weights.length; i++) {

       if (priors[i] > 0) {

           weights[i] += Math.log(priors[i]);

       } else {

           throw new IllegalArgumentException("Cluster empty!");

       }

    }

    return weights;

}

         3步:M步骤,这里只看连续值的情况,m_modelNormal[i][j][0]是均值,m_model[i][j][1]是方差,m_modelNormal[i][j][2]mixing coeffients就是步骤中的pai

if (inst.attribute(j).isNominal()) {

    m_model[i][j].addValue(in.value(j), in.weight()

           * m_weights[l][i]);

} else {

    m_modelNormal[i][j][0] += (in.value(j)

           * in.weight() * m_weights[l][i]);

    m_modelNormal[i][j][2] += in.weight()

           * m_weights[l][i];

    m_modelNormal[i][j][1] += (in.value(j)

           * in.value(j) * in.weight() * m_weights[l][i]);

}

*******************************************************************************

// variance

m_modelNormal[i][j][1] = (m_modelNormal[i][j][1] - (m_modelNormal[i][j][0]

       * m_modelNormal[i][j][0] / m_modelNormal[i][j][2]))

       / (m_modelNormal[i][j][2]);

// mean

m_modelNormal[i][j][0] /= m_modelNormal[i][j][2];

         4步:判断收敛:有两种判断方法,llk是在E步骤时计算出来的。

for (i = 0; i < m_max_iterations; i++)

*******************************************************************************

if (i > 0) {

    if ((llk - llkold) < 1e-6) {

       break;

    }

}

         要注意的一点是这些算的不是协方差矩阵,而是它的对角阵,在Pattern recognition and machine learning中有一张图可以看一下:

Weka开发[28]——EM源代码分析(3) - quweiprotoss - Koala++s blog

 

         左边的就是一般的形式,中间的就是对角阵的形式,而右边的是一个单位阵乘一个常数的形式。中间的那幅图它轴是与坐标轴平行的,The three possibilities of general, diagonal, and isotropic covariance matrices are illustrated in Figure 2.8. Unfortunately, whereas such approaches limit the number of degrees of freedom in the distribution and make inversion of the covariance matrix a much faster operation, they also greatly restrict the form of the probability density and limit its ability to capture interesting correlations in the data. 书中提到用后面两种限制分布的自由度可以更快的计算协方差矩阵,但是它们也极大的限制了概率密度的形式也限制了它捕获数据的相关性的能力。这里说到的协方差有什么要的影响,可以看一下PCA的论文,可以更好地理解。

  评论这张
 
阅读(1492)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017