根据EM算法进行参数估计 算法依据“9.3.2 高斯混合模型参数估计的EM算法” 算法9.2 :param dataSetList:数据集(可观测数据) :param iter: 迭代次数 :return: 估计的参数
(dataSetList, iter = 500)
| 124 | |
| 125 | |
| 126 | def EM_Train(dataSetList, iter = 500): |
| 127 | ''' |
| 128 | 根据EM算法进行参数估计 |
| 129 | 算法依据“9.3.2 高斯混合模型参数估计的EM算法” 算法9.2 |
| 130 | :param dataSetList:数据集(可观测数据) |
| 131 | :param iter: 迭代次数 |
| 132 | :return: 估计的参数 |
| 133 | ''' |
| 134 | #将可观测数据y转换为数组形式,主要是为了方便后续运算 |
| 135 | dataSetArr = np.array(dataSetList) |
| 136 | |
| 137 | #步骤1:对参数取初值,开始迭代 |
| 138 | alpha0 = 0.5; mu0 = 0; sigmod0 = 1 |
| 139 | alpha1 = 0.5; mu1 = 1; sigmod1 = 1 |
| 140 | |
| 141 | #开始迭代 |
| 142 | step = 0 |
| 143 | while (step < iter): |
| 144 | #每次进入一次迭代后迭代次数加1 |
| 145 | step += 1 |
| 146 | #步骤2:E步:依据当前模型参数,计算分模型k对观测数据y的响应度 |
| 147 | gamma0, gamma1 = E_step(dataSetArr, alpha0, mu0, sigmod0, alpha1, mu1, sigmod1) |
| 148 | #步骤3:M步 |
| 149 | mu0, mu1, sigmod0, sigmod1, alpha0, alpha1 = \ |
| 150 | M_step(mu0, mu1, gamma0, gamma1, dataSetArr) |
| 151 | |
| 152 | #迭代结束后将更新后的各参数返回 |
| 153 | return alpha0, mu0, sigmod0, alpha1, mu1, sigmod1 |
| 154 | |
| 155 | if __name__ == '__main__': |
| 156 | start = time.time() |