根据高斯密度函数计算值 依据:“9.3.1 高斯混合模型” 式9.25 注:在公式中y是一个实数,但是在EM算法中(见算法9.2的E步),需要对每个j 都求一次yjk,在本实例中有1000个可观测数据,因此需要计算1000次。考虑到 在E步时进行1000次高斯计算,程序上比较不简洁,因此这里的y是向量,在numpy 的exp中如果exp内部值为向量,则对向量中每个值进行exp,输出仍是向量的形式。 所以使用向量的形式1次计算即可将所有计算结果得出,程序上较为简洁 :param dataSetArr: 可观测数据集
(dataSetArr, mu, sigmod)
| 59 | return dataSet |
| 60 | |
| 61 | def calcGauss(dataSetArr, mu, sigmod): |
| 62 | ''' |
| 63 | 根据高斯密度函数计算值 |
| 64 | 依据:“9.3.1 高斯混合模型” 式9.25 |
| 65 | 注:在公式中y是一个实数,但是在EM算法中(见算法9.2的E步),需要对每个j |
| 66 | 都求一次yjk,在本实例中有1000个可观测数据,因此需要计算1000次。考虑到 |
| 67 | 在E步时进行1000次高斯计算,程序上比较不简洁,因此这里的y是向量,在numpy |
| 68 | 的exp中如果exp内部值为向量,则对向量中每个值进行exp,输出仍是向量的形式。 |
| 69 | 所以使用向量的形式1次计算即可将所有计算结果得出,程序上较为简洁 |
| 70 | :param dataSetArr: 可观测数据集 |
| 71 | :param mu: 均值 |
| 72 | :param sigmod: 方差 |
| 73 | :return: 整个可观测数据集的高斯分布密度(向量形式) |
| 74 | ''' |
| 75 | #计算过程就是依据式9.25写的,没有别的花样 |
| 76 | result = (1 / (math.sqrt(2 * math.pi) * sigmod)) * \ |
| 77 | np.exp(-1 * (dataSetArr - mu) * (dataSetArr - mu) / (2 * sigmod**2)) |
| 78 | #返回结果 |
| 79 | return result |
| 80 | |
| 81 | |
| 82 | def E_step(dataSetArr, alpha0, mu0, sigmod0, alpha1, mu1, sigmod1): |