EM算法(python)

import numpy as np
from scipy.stats import norm

# 加载数据
file_path = '/mnt/data/data.txt'
with open(file_path, 'r') as file:
    data = np.array([float(line.strip()) for line in file.readlines()])

# EM算法定义
def em_algorithm_with_initialization(data, num_iterations, initial_means, initial_variances, initial_weights):
    # 初始化参数
    weights = np.array(initial_weights)
    means = np.array(initial_means)
    variances = np.array(initial_variances)

    for _ in range(num_iterations):
        # E步骤:计算每个分布对每个数据点的责任
        responsibilities = np.array([weights[k] * norm.pdf(data, means[k], np.sqrt(variances[k]))
                                     for k in range(len(weights))])
        responsibilities /= responsibilities.sum(axis=0)

        # M步骤:更新权重、均值和方差
        weights = responsibilities.mean(axis=1)
        means = np.array([np.sum(responsibilities[k] * data) / np.sum(responsibilities[k])
                          for k in range(len(weights))])
        variances = np.array([np.sum(responsibilities[k] * (data - means[k])**2) / np.sum(responsibilities[k])
                              for k in range(len(weights))])

    return weights, means, variances

# 设置初始参数
data_mean = np.mean(data)
data_std = np.std(data)
initial_means = [data_mean * 0.9, data_mean, data_mean * 1.1]
initial_variances = [data_std**2 * 0.5, data_std**2, data_std**2 * 1.5]
initial_weights = [1/3, 1/3, 1/3]

# 运行EM算法
weights, means, variances = em_algorithm_with_initialization(data, num_iterations=100, initial_means=initial_means, initial_variances=initial_variances, initial_weights=initial_weights)

print("Weights:", weights)
print("Means:", means)
print("Variances:", variances)
 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值