EM 算法

学习一时爽,一直学习一直爽

  Hello,大家好,我是 もうり,一个从无到有的技术+语言小白。

https://blog.csdn.net/weixin_44510615/article/details/89216162

EM 算法

EM 算法,指的是最大期望算法(Expectation Maximization Algorithm,期望最大化算法),是一种迭代算法,在统计学中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计。基本思想是首先随机取一个值去初始化待估计的参数值,然后不断迭代寻找更优的参数使得其似然函数比原来的似然函数大。

EM 算法当做最大似然估计的拓展,解决难以给出解析解(模型中存在隐变量)的最大似然估计(MLE)问题

EM 算法步骤:

使用 EM 算法处理 iris

# !/usr/bin/python# -*- coding:utf-8 -*-import numpy as npimport pandas as pdfrom sklearn.mixture import GaussianMixtureimport matplotlib as mplimport matplotlib.colorsimport matplotlib.pyplot as pltfrom sklearn.metrics.pairwise import pairwise_distances_argminmpl.rcParams<span style="font.sans-serif">] = ['SimHei'</span>mpl.rcParams['axes.unicode_minus'] = Falseiris_feature = '花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'def expand(a, b, rate=0.05):    d = (b - a) * rate    return a-d, b+dif __name__ == '__main__':    path = 'iris.data'    data = pd.read_csv(path, header=None)    x_prime = data[np.arange(4)]    y = pd.Categorical(data[4]).codes    n_components = 3    feature_pairs = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]    plt.figure(figsize=(8, 6), facecolor='w')    for k, pair in enumerate(feature_pairs, start=1):        x = x_prime[pair]        m = np.array([np.mean(x[y == i], axis=0) for i in range(3)])  # 均值的实际值        print('实际均值 = \n', m)        gmm = GaussianMixture(n_components=n_components, covariance_type='full', random_state=0)        gmm.fit(x)        print('预测均值 = \n', gmm.means_)        print('预测方差 = \n', gmm.covariances_)        y_hat = gmm.predict(x)        order = pairwise_distances_argmin(m, gmm.means_, axis=1, metric='euclidean')        print('顺序:\t', order)        n_sample = y.size        n_types = 3        change = np.empty((n_types, n_sample), dtype=np.bool)        for i in range(n_types):            change[i] = y_hat == order[i]        for i in range(n_types):            y_hat[change[i]] = i        acc = '准确率:%.2f%%' % (100*np.mean(y_hat == y))        print(acc)        cm_light = mpl.colors.ListedColormap(<span style="color:#FF8080">, '#77E0A0', '#A0A0FF'</span>)        cm_dark = mpl.colors.ListedColormap(<span style="r">, 'g', '#6060FF'</span>)        x1_min, x2_min = x.min()        x1_max, x2_max = x.max()        x1_min, x1_max = expand(x1_min, x1_max)        x2_min, x2_max = expand(x2_min, x2_max)        x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]
        grid_test = np.stack((x1.flat, x2.flat), axis=1)        grid_hat = gmm.predict(grid_test)        change = np.empty((n_types, grid_hat.size), dtype=np.bool)        for i in range(n_types):            change[i] = grid_hat == order[i]        for i in range(n_types):            grid_hat[change[i]] = i        grid_hat = grid_hat.reshape(x1.shape)        plt.subplot(2, 3, k)        plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)        plt.scatter(x[pair[0]], x[pair[1]], s=20, c=y, marker='o', cmap=cm_dark, edgecolors='k')        xx = 0.95 * x1_min + 0.05 * x1_max        yy = 0.1 * x2_min + 0.9 * x2_max        plt.text(xx, yy, acc, fontsize=10)        plt.xlim((x1_min, x1_max))        plt.ylim((x2_min, x2_max))        plt.xlabel(iris_feature[pair[0]], fontsize=11)        plt.ylabel(iris_feature[pair[1]], fontsize=11)        plt.grid(b=True, ls=':', color='#606060')    plt.suptitle('EM算法无监督分类鸢尾花数据', fontsize=14)    plt.tight_layout(1, rect=(0, 0, 1, 0.95))    plt.show()

本文分享自微信公众号 - 毛利学Python(sen13717378202)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏D·技术专栏

多线程之阻塞队列

DelayQueue每次都是将元素加入排序队列,以delay/过期时间为排序因素,将快过期的元素放在队首,取数据的时候每次都是先取快过期的元素。 构造方法

7110
来自专栏木又AI帮

【leetcode刷题】T186-二进制求和

https://leetcode-cn.com/problems/add-binary

5610
来自专栏新智元

腾讯开源全栈机器学习平台 Angel 3.0,支持三大类型图计算算法

10 月 18 日,2019 中关村论坛平行论坛 ——AI WORLD 2019 世界人工智能峰会在北京启幕。新智元杨静、科大讯飞胡郁、微软王永东、华为王成录、...

20920
来自专栏木又AI帮

【leetcode刷题】T185-回文数

https://leetcode-cn.com/problems/palindrome-number

6610
来自专栏D·技术专栏

多线程之线程安全

   线程是越多越好吗?答案否,线程太多的话,会造成CPU频繁的切换反而会造成很多线程处于等待状态。除了浪费资源和效率之外,多线程带来的其他风险:安全、死锁等 ...

5610
来自专栏专注 Java 基础分享

Redis 的底层数据结构(整数集合)

当一个集合中只包含整数,并且元素的个数不是很多的话,redis 会用整数集合作为底层存储,它的一个优点就是可以节省很多内存,虽然字典结构的效率很高,但是它的实现...

4010
来自专栏大数据成神之路

SparkRDD转DataSet/DataFrame的一个深坑

原需求:希望在map函数中将每一个rdd转为DataSet或者DataFrame。

12920
来自专栏A周立SpringCloud

面试官:谈谈你对 MySQL 索引的认识?

大家好,我渣渣烟。我曾经写过一篇《面试官:讲讲mysql表设计要注意啥》,当时写完后,似乎效果还行!

7720
来自专栏D·技术专栏

Spring阶段性问题总结

上篇文章我们看过了Spring解析、注册的对象的过程和源码,相信大家和我一样肯定有很多打问号的地方。下面针对我自己疑问的点作出的整理,看源码的时候不仅仅要知道是...

7010
来自专栏大内老A

[ASP.NET Core 3框架揭秘] 依赖注入:一个Mini版的依赖注入框架

在前面的章节中,我们从纯理论的角度对依赖注入进行了深入论述,我们接下来会对.NET Core依赖注入框架进行单独介绍。为了让读者朋友能够更好地理解.NET Co...

10110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励