【机器学习】EM原理和K-mean聚类

news2025/1/13 10:24:05

一、教程说明

        EM算法就是expect maxmise算法,就是“期望最大化”的缩写。本篇首先提出:1 什么是期望? 2 期望最大化是个啥意思?k-mean聚类中如何用EM算法? 

所涉及的概念:

  1.   期望
  2.   期望的加权平均理解
  3.   概率模型和统计模型
  4.   期望最大化
  5.   k-mean算法的原理

二、什么是期望?

2.1 从一个思想实验入门

        在回答这个概念之前,我们可以做一个思想实验。

        假如:我们这里有一枚六面骰子

        1)每次掷出“1”奖励一块钱,那么掷出100次,您能得到几块钱?

        我们很容易想到:掷出100次,获得“1”的次数大约100/6次,每次的1块,总数大约1×100/6 =16.6元。故IN _{come}= 16.6

        2)如果每次掷出“1”奖励一块钱,每掷出“2”奖励三元,那么掷出100次,您能得到几块钱?

        100次掷出,得到“2”的可能次数为100/6, 每次奖励3块,那么总的收益数为:

IN_{come} = \frac{100}{6}\times 1 + \frac{100}{6}\times 3 = 66.6

         3)更一般地,我们给出一个收益函数,那么,掷出100次后,总的收益是多少?

        给出收益函数:

        F = [ 1, 3, 0,-2, 4,-1 ]

        给出概率模型:

        R = [ 1/6, 1/6, 1/6, 1/6, 1/6, 1/6]

        那么,抛掷100次后,总的收益就是期望,它的公式为:

E(F)  =  <F, R >                     期望就是收益函数和概率模型的内积!

  • 掷出100次的获益(期望):

E = 100 < F, R > =100(1 \times \frac{1}{6} + 3 \times \frac{1}{6} + 0\times \frac{1}{6} + (-2)\times \frac{1}{6} + 4 \times \frac{1}{6} + (-1) \times \frac{1}{6} ) = 83

  •  掷出1 次的获益(期望)

E = < F, R > = (1 \times \frac{1}{6} + 3 \times \frac{1}{6} + 0\times \frac{1}{6} + (-2)\times \frac{1}{6} + 4 \times \frac{1}{6} + (-1) \times \frac{1}{6} ) =0.83

        结论:期望就是收益函数和概率模型的内积!此内积表示概率作用下的总收益。

 2.2 改变概率模型

        将上面的概率模型是:R = [ 1/6, 1/6, 1/6, 1/6, 1/6, 1/6]将其改成其它模型:

R = [ 0,1, 0.2, 0.1, 0.3, 0.1, 0.1, 0.1 ]

        期望可以如法炮制:

E = < F, R > = (1 \times \frac{1}{10} + 3 \times \frac{2}{10} + 0\times \frac{3}{10} + (-2)\times \frac{1}{10} + 4 \times \frac{1}{10} + (-1) \times \frac{1}{10} ) =0.8

        结论: 期望就是对“多路贡献”的加权平均。加权平均就是“多路贡献”的总贡献。

2.3 给期望一个定义

  • 所谓期望,就是一个收益函数与一个概率分布模型的内积。
  • 所谓期望就是在一个收益函数上施加概率模型,最终获益的总量。
  • 所谓期望,就是一个收益函数,在一个概率模型下的收益的概率平均(或加权平均)。

        注意:将收益函数赋予其它意义,期望还能有其它意义。

三、期望的几何意义

     我们看这里是教材对期望的定义:     

在这里插入图片描述

这个定义是否与上述的“收益函数”有矛盾?答曰“没有”,因为这里只要将“收益函数”定义为:

 F = X 就可以了。问题是这种期望有啥意义?

        期望的几何意义:一组数据的概率加权平均,或叫中心点,或叫重心。

四、期望的最大化原理(EM)

        引理:如果一组数据符合统计规律,那么这组数据能和理论上的一个概率模型对应。

 上图假定有两组数据,符合统计规律,且给出4个均匀分布概率模型。问两组数据分别和哪个理论模型匹配?

分别做内积:

组1和【1-4】期望:   【1,2,3,4】* 【1/4,1/4,1/4,1/4 】 = 2.5

组1和【2-5】期望:   【1,2,3,4,0】* 【0,1/4,1/4,1/4,1/4】 = 2.25

组1和【1-6】期望:   【1,2,3,4,0,0】* 【1/6,1/6,1/6,1/6,1/6,1/6】 =  1.666

因此:组1和【1-4】期望最大,说明组1和该分布最匹配。

组2和【12-17】的期望: 【12,13,14,15,16,17】* 【1/6,1/6,1/6,1/6,1/6,1/6】=14.5

结论:当一组数与一个概率模型匹配,那么它们的内积(期望)最大的。这就是期望最大原理。

五、K-mean算法原理

5.1 算法简要描述

kmeans的计算方法如下:

1  对于一组数据,我们假定需要将它们分成K 个类

2  随机选取k个中心点(期望)作为初始概率模型的位置(聚类重心)。

3  我们假设分类是合理的,遍历所有数据点,通过距离模型,将他们归到指定的概率模型中。

4  从以上的归类中,计算各分类的期望(平均值),修改聚类重心。并重新修改验证分类的合理性,并最近的中心点中。

5 重复3-4,直到这k个中心点不再变化(收敛了),或执行了足够多的迭代.


5.2 举个实际例子

给出如下数据集: Data =  {2,3,4,10,11, 12,20,25,30 }

我们假定k=2(就是要分成两类)

随机给出两个点c1 = 9,c2=10,作为两个聚类中心(期望)

数据集(坐标)到c1距离到c2距离距离比较最后归类
278<c1
367<c1
456<c1
1010>c2
1121>c2
1232>c2
201110>c2
251615>c2
302120>c2

累计上表c1的数据平均 = (2+3+4 )/3 = 3

累计上表c2的数据平均 = (10+11+12+20+25+30)/6 =  18

数据集(坐标)到c1距离到c2距离距离比较最后归类
2116<c1
3015<c1
4114<c1
1078<c1
1187>c2
1296>c2
20172>c2
25227>c2
302712>c2

累计上表c1的数据平均 = (2+3+4+10)/4 = 4.75

累计上表c2的数据平均 = (11+12+20+25+30)/5 =  19.6

数据集(坐标)到c1距离到c2距离距离比较最后归类
22.7517.6<c1
31.7516.6<c1
40.7515.6<c1
105.259.6<c1
116.258.6<c1
127.257.6<c1
2015.250.4>c2
2520.255.4>c2
3025.2515.4>c2

最后c1,c2无变化,算法停止,聚类结束!

六、概率模型和统计模型的关系

两者关系

  • 不同点:概率模型从理论出发,描述数据。统计模型是从数据触发,获得理论参数。
  • 共同点,两者都指向同一组数据,如果高度匹配,能使算法收敛。

七、代码实现

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random


data = [
[ 0.697,0.46],[ 0.774,0.376],[ 0.634,0.264],[ 0.608,0.318],
[ 0.556,0.215],[ 0.403,0.237],[ 0.481,0.149],[ 0.437,0.211],
[ 0.666,0.091],[ 0.243,0.267],[ 0.245,0.057],[ 0.343,0.099],
[ 0.639,0.161],[ 0.657,0.198],[ 0.36,0.37],[ 0.593,0.042],
[ 0.719,0.103],[ 0.359,0.188],[ 0.339,0.241],[ 0.282,0.257],
[ 0.784,0.232],[ 0.714,0.346],[ 0.483,0.312],[ 0.478,0.437],
[ 0.525,0.369],[ 0.751,0.489],[ 0.532,0.472],[ 0.473,0.376],
[ 0.725,0.445],[ 0.446,0.459]]



# filepath = open('S:/机器学习-周志华/西瓜数据集4.0.csv')
# data = pd.read_csv(filepath, sep=',')[["密度", "含糖率"]].values.tolist()  # tolist:ndarray转换为list

k = 3  # K值设置,3,4
mean_vectors = random.sample(data, k)  # 初始化均值向量,随机K个
print(mean_vectors)
x0 = list(map(lambda arr: arr[0], mean_vectors))
y0 = list(map(lambda arr: arr[1], mean_vectors))
# 将初试的均值向量用红色的方块表示出
plt.scatter( x0, y0, c='r', marker=',' )


# 计算欧式距离
def Distance(p1, p2):
    sum = 0
    for i, j in zip(p1, p2):
        sum = sum + (i - j) ** 2
    return np.sqrt(sum)


time = 0  # 循环次数
clusters = []  # 聚类初始化
while time < 100:  # 循环次数限制
    clusters = list(map((lambda x: [x]), mean_vectors))
    print(clusters)
    change = 1
    for sample in data:
        dist = []
        for j in mean_vectors:
            dist.append(Distance(j, sample))
        clusters[dist.index(min(dist))].append(sample)

    new_mean_vectors = []
    for c, v in zip(clusters, mean_vectors):
        c_num = len(c)
        c_array = np.array(c)
        v_array = np.array(v)
        new_mean_vector = sum(c_array) / c_num
        # if all(np.divide((new_mean_vector - v), v) < np.array([0.0001, 0.0001])):
        if all(np.true_divide((new_mean_vector - v_array), v_array) < np.array([0.0001, 0.0001])):
            new_mean_vectors.append(v)  # 不变
            change = 0
        else:
            new_mean_vectors.append(new_mean_vector.tolist())  # 更新

    if change == 1:
        mean_vectors = new_mean_vectors
    else:
        break
    time = time + 1

# Show the clustering result

x1 = list(map(lambda arr: arr[0], clusters[0]))
y1 = list(map(lambda arr: arr[1], clusters[0]))
x2 = list(map(lambda arr: arr[0], clusters[1]))
y2 = list(map(lambda arr: arr[1], clusters[1]))
x3 = list(map(lambda arr: arr[0], clusters[2]))
y3 = list(map(lambda arr: arr[1], clusters[2]))
# x4 = list(map(lambda arr: arr[0], clusters[3]))
# y4 = list(map(lambda arr: arr[1], clusters[3]))
# x5 = list(map(lambda arr: arr[0], clusters[4]))
# y5 = list(map(lambda arr: arr[1], clusters[4]))
plt.scatter(x1, y1, c='y', marker='x', label='class1')
plt.scatter(x2, y2, c='g', marker='^', label='class2')
plt.scatter(x3, y3, c='blue', marker='*', label='class3')
# plt.scatter(x4, y4, c='black', marker='+', label='class4')

plt.xlabel('density')
plt.ylabel('sugar_content')
plt.show()

八、 总结

        本讲从收益函数的期望入手,让大家直观理解“期望”就是收益函数的总和,这里注意,期望是两个函数的内积。

        当将收益函数看成是数据的坐标,其几何意义就是数据中心位置。

        加权平均是对期望的另外一个观点。

        期望最大化,是指数据模型和某个概率分布的吻合度,越吻合,期望值越大。

        概率模型和统计模型交互搭配,达到自动迭代运算,并用距离衡量其收敛性。

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业网关开发:IxCahriot测试吞吐量

吞吐量测试可以确定被测试设备或被测试系统在不丢弃包的情况下&#xff0c;设备或系统能够接受并转发的最大有效数据。在测试中以一定的速率发送一定数量的帧&#xff0c;并计算待测设备接收的帧&#xff0c;如果发送的帧与接受的帧数量相等&#xff0c;那么就将发送速率提高并…

ASEMI代理ADA4940-1ACPZ-R7原装ADI车规级ADA4940-1ACPZ-R7

编辑&#xff1a;ll ASEMI代理ADA4940-1ACPZ-R7原装ADI车规级ADA4940-1ACPZ-R7 型号&#xff1a;ADA4940-1ACPZ-R7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LFCSP-16 批号&#xff1a;2023 引脚数量&#xff1a;16 安装类型&#xff1a;表面贴装型 ADA4940-1ACPZ-…

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据

作者&#xff1a;Jeff Vestal 结合 Elasticsearch 的搜索相关性和 OpenAI 的 ChatGPT 的问答功能来查询你的数据。 在此博客中&#xff0c;你将了解如何使用 Elasticsearch 将 ChatGPT 连接到专有数据存储&#xff0c;并为你的数据构建问答功能。 什么是聊天 GPT&#xff1f; …

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像…

ASEMI代理ADI亚德诺ADA4940-1ACPZ-R7车规级芯片

编辑-Z ADA4940-1ACPZ-R7芯片参数&#xff1a; 型号&#xff1a;ADA4940-1ACPZ-R7 −3 dB小信号带宽&#xff1a;260 MHz −3 dB大信号带宽&#xff1a;25 MHz 0.1dB平坦度的带宽&#xff1a;14.5 MHz 斜率&#xff1a;95 V/s 超速恢复时间&#xff1a;86 ns 输入电压噪…

【数据结构】堆的应用(堆排序的实现 + (向上/向下)建堆时间复杂度证明 + TopK问题(笔记总结))

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

Redis高可用之3种集群方案对比

Redis集群方案使用建议&#xff1a; Redis cluster&#xff1a;除非是1000个节点以上的超大规模集群&#xff0c;优先考虑使用Redis clustercodis&#xff1a;旧项目如果仍在使用codis&#xff0c;可继续使用&#xff0c;但也推荐迁移到Redis clustertwemproxy&#xff1a;不建…

什么是数字化?企业为什么要数字化转型?

什么是数字化&#xff1f;企业为什么要数字化转型&#xff1f; 深度长文&#xff0c;4000字&#xff0c;融合了很多国内外专业期刊观点&#xff0c;一文讲清到底什么是企业数字化转型&#xff1f;心急的小伙伴可以先看目录&#xff1a; 关于定义——到底什么是“数字化转型”…

Ubuntu18.04通过一根网线与树莓派建立连接,远程操作树莓派,向树莓派传文件

文章目录 前言1 树莓派设置静态IP1.1 不能登录到树莓派的图形化界面1.2 可以登录到树莓派的图形化界面 2 PC端的ubuntu18.04设置静态ip地址2.1 不使用图形化界面操作2.2 使用图形化界面进行操作 3 Putty软件3 FileZilla软件 前言 本篇博客的应用场景&#xff0c;前提条件如下&a…

4.1.2串的存储结构

串的存储结构和线性表类似 串的顺序存储&#xff1a; 缺点就是长度不可变&#xff08;也就是静态数组存储&#xff09; 函数执行结束存储空间自动回收 需要使用free函数回收 串的顺序存储&#xff1a; 方案二的缺点&#xff1a; char[0]存储length&#xff0c;但是由于char的…

智能学习 | MATLAB实现FA-BP多输入单输出回归预测(萤火虫算法优化BP神经网络)

智能学习 | MATLAB实现FA-BP多输入单输出回归预测(萤火虫算法优化BP神经网络) 目录 智能学习 | MATLAB实现FA-BP多输入单输出回归预测(萤火虫算法优化BP神经网络)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现FA-BP多输入单输出回归预测(萤火虫算法优化B…

基于铜锁构建Web在线加密工具库

基于铜锁构建Web在线加密工具库 搭建运行环境 实验⼿册中的实验都是以 docker 和 docker-compose 环境为主&#xff0c;基于 Ubuntu 20.04 容器镜像。 初始化项目 首先利用 IDE 创建一个 tongsuo_web 的空项目&#xff0c;接下来我们所有的文件都会创建在该项目中&#xff0…

学习系统编程No.19【进程间通信之控制进程】

引言&#xff1a; 北京时间&#xff1a;2023/4/13/8:00&#xff0c;早八人&#xff0c;早八魂&#xff0c;时间不怎么充足&#xff0c;磨磨引言刚好&#xff0c;学习Linux和Linux有关的系统级知识已经许久了&#xff0c;在不知不觉之中&#xff0c;发现自己已经更到了第19篇&a…

3D视觉之深度相机方案

随着机器视觉&#xff0c;自动驾驶等颠覆性的技术逐步发展&#xff0c;采用 3D 相机进行物体识别&#xff0c;行为识别&#xff0c;场景 建模的相关应用越来越多&#xff0c;可以说 3D 相机就是终端和机器人的眼睛。 3D 相机 3D 相机又称之为深度相机&#xff0c;顾名思义&…

openDriver开源插件main.js源码分析

、基础要求 阅读本文章需要对以下知识有相关的了解 Threejs 3D渲染引擎dat.gui界面控制插件webgl三维绘图协议、着色器相关知识UV坐标、XYZ惯性坐标XODR文件格式 拓展 自动驾驶场景仿真标准&#xff08;一&#xff09;- OpenDRIVE - 知乎 《OpenDRIVE1.6规格文档》3_open…

2023年SICWGHS两大高含金量商赛组队招募中

想参加商赛&#xff0c;问了周围一圈朋友&#xff0c;不是没时间就是没兴趣&#xff0c;找个靠谱的队友怎么这么难&#xff1f; 相信这是不少商赛热爱者的共同烦恼&#xff0c;别急&#xff01;翰林来承包你的“找队友”任务&#xff0c;各路学霸等你来pick&#xff01; 两大…

屏幕亮度调节工具:Simple Screen Shade Mac

Simple Screen Shade Mac版是mac上一款优秀的屏幕颜色亮度调节工具&#xff0c;能够让我们Mac电脑的显示器背景变暗&#xff0c;这样可以保护你眼睛的健康并保持舒适。Simple Screen Shade 旨在实现最大程度的简单性和易用性。你可以设置灰色背景以减轻明亮鲜艳的色彩&#xff…

上海亚商投顾:沪指跌近2%险守3300点 AI概念股集体重挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日放量调整&#xff0c;深成指午后跌超2%&#xff0c;沪指、创业板指均跌近2%&#xff0c;科创50指数跌…

java-word模板转化为pdf

文章目录 一、引入包1.1在pom引入1.2 因为我们的项目是打包成jar,所以以上方法在本地idea运行没有问题&#xff0c;linux系统不行1.2.1解决方法11.2.2解决方法2 二、配置文件--License.xml--去除水印2.1 license.xml直接放到resources的根目录下即可2.2 工具类 三、调用效果 一…

部署架构 因为单体架构痛点 升级到微服务架构

如图为单体部署 痛点 多人协作可能产生很多的回归测试 代码管理复杂度提升 软件包升级会导致增加测试次数 举例 单体电商 1增加功能(增加小程序平台) 2 并发增加 出现 1 代码复用 2 系统间相互调用 3 接口不仅要对外服务&#xff0c;也得对内提供接口 4 数据分析功…