机器学习---使用 EM 算法来进行高斯混合模型的聚类

1. 指定k个高斯分布參数

导包

import math
import copy
import numpy as np
import matplotlib.pyplot as plt

isdebug = False

全局变量 isdebug可以用来控制是否打印调试信息。当 isdebug 为 True 时,代码中的一些调试信

息将被打印出来,方便进行调试。 

初始化:

def ini_data(Sigma,Mu1,Mu2,k,N):
    global X
    global Mu
    global Expectations
    X = np.zeros((1,N))
    Mu = np.random.random(2)
    Expectations = np.zeros((N,k))
    for i in range(0,N):
        if np.random.random(1) > 0.5:
            X[0,i] = np.random.normal()*Sigma + Mu1
        else:
            X[0,i] = np.random.normal()*Sigma + Mu2
    if isdebug:
        print("***********")
        print(u"初始观測数据X:")
        print(X)

在函数内部,首先使用 numpy 创建了一个形状为 (1, N) 的全零数组 X,用于存储观测数据。然

后,使用 numpy 的 random 模块生成了两个随机数作为均值 Mu 的初始值。接着,创建了一个形

状为 (N, k) 的全零数组 Expectations,用于存储期望值。接下来,使用 for 循环遍历了 N 次,对于

每个观测数据,根据随机生成的概率值,使用 np.random.normal 生成服从正态分布的随机数,并

将其赋值给 X。最后,如果 isdebug 为 True,就打印出初始观测数据 X。

2. EM算法:步骤1,计算E[zij]

def e_step(Sigma,k,N):
    global Expectations
    global Mu
    global X
    for i in range(0,N):
        Denom = 0
        for j in range(0,k):
            Denom += math.exp((-1/(2*(float(Sigma**2))))*(float(X[0,i]-Mu[j]))**2)
        for j in range(0,k):
            Numer =  math.exp((-1/(2*(float(Sigma**2))))*(float(X[0,i]-Mu[j]))**2)
            Expectations[i,j] = Numer / Denom
    if isdebug:
        print("***********")
        print(u"隐藏变量E(Z):")
        print(Expectations)

在这段代码中,首先使用两个嵌套的 for 循环遍历观测数据集中的每个样本。在内部的第一个循环

中,计算了分母 Denom,它是高斯分布密度函数的归一化项,用于计算每个样本属于每个分布的

概率。在内部的第二个循环中,计算了分子 Numer,它是样本属于某个分布的概率。然后,将

Numer 除以 Denom,得到每个样本属于每个分布的概率,将这些概率值存储在 Expectations 数组

中。最后,如果 isdebug 为 True,就打印出隐藏变量的期望值 Expectations。

3. EM算法:步骤2,求最大化E[zij]的參数Mu

def m_step(k,N):
    global Expectations
    global X
    for j in range(0,k):
        Numer = 0
        Denom = 0
        for i in range(0,N):
            Numer += Expectations[i,j]*X[0,i]
            Denom +=Expectations[i,j]
        Mu[j] = Numer / Denom 

在这段代码中,首先使用一个外部的 for 循环遍历每个分布。在内部的两个嵌套的 for 循环中,分

别计算了 Numer 和 Denom。Numer 是根据每个样本对应的隐藏变量的期望值来加权计算得到的

均值的分子部分,Denom 是对应的分母部分,它是所有样本对应的隐藏变量的期望值的总和。然

后,将 Numer 除以 Denom,得到了更新后的均值 Mu[j]。

4. 迭代过程

def run(Sigma,Mu1,Mu2,k,N,iter_num,Epsilon):
    ini_data(Sigma,Mu1,Mu2,k,N)
    print(u"初始<u1,u2>:", Mu)
    for i in range(iter_num):
        Old_Mu = copy.deepcopy(Mu)
        e_step(Sigma,k,N)
        m_step(k,N)
        print(i,Mu)
        if sum(abs(Mu-Old_Mu)) < Epsilon:
            break
if __name__ == '__main__':
   run(6,40,20,2,1000,1000,0.0001)
   plt.hist(X[0,:],50)
   plt.show()

该函数用于运行期望最大化(EM)算法来拟合高斯混合模型。函数的参数包括了高斯分布的标准

差 Sigma,两个高斯分布的均值 Mu1 和 Mu2,混合模型中的分布数量 k,观测数据的数量 N,迭

代次数 iter_num 以及精度 Epsilon。在函数内部,首先调用了 ini_data 函数来初始化观测数据 X、

均值 Mu 和期望 Expectations。然后,进入一个 for 循环,循环次数为 iter_num。在每次迭代中,

记录下当前的均值 Mu,然后执行 E 步骤和 M 步骤,即调用 e_step 和 m_step 函数来更新隐藏变

量的期望值和更新每个分布的均值。在每次迭代后,打印出当前的均值 Mu。最后,如果当前迭代

的均值变化小于设定的精度 Epsilon,就跳出循环,算法结束。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes(k8s)访问不了Pod服务

在k8s集群部署java web应用的服务时&#xff0c;浏览器访问不了pod服务或linux终端curl http://192.168.138.112:30000即curl http://ip地址:端口号失败&#xff0c;如下图&#xff1a; 在网上找了很久的答案&#xff0c;最后还是没解决&#xff0c;后来突然想起来一直是在k8…

7个简单技巧,让你从容应对压力面试!

01-什么是压力面试&#xff1f; 压力面试是指有意制造紧张&#xff0c;以了解求职者将如何面对工作压力的一种面试形式。 事实上&#xff0c;压力面试不是单独存在的一类面试&#xff0c;往往是穿插在面试过程中。 面试人通过提出不礼貌、冒犯的问题&#xff0c;或者用怀疑、…

JavaWeb(五)

一、JDBC概述 JDBC 就是使用Java语言操作关系型数据库的一套API 全称是Java DataBase Connectivity 表示Java数据库连接。 JDBC的本质是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口,各个数据库厂商去实现这套接口&#xff0…

11、信息打点——红队工具篇FofaQuakeSuize水泽Arl灯塔

网络空间测绘引擎 Fofa Quake shodan Zoomeye 主要搜关联资产、特征资产、资产信息&#xff08;在测绘引擎上直接搜IP&#xff0c;它会显示所有与该域名有关的信息。&#xff09; fofa和Quake测绘引擎集成化工具&#xff1a;Finger 自动化信息收集项目 ARL灯塔 Suize水泽 …

编程语言分类

如果要将编程语言分成两大类&#xff0c;可以考虑以下分类方式&#xff1a; 编译型语言&#xff08;Compiled Languages&#xff09;&#xff1a;这类语言在运行之前需要通过编译器将源代码转换为机器码或类似形式的可执行代码。编译型语言的特点包括&#xff1a; 需要显式的编…

二极管:TVS瞬态抑制二极管

一、什么是TVS二极管 TVS&#xff08;Transient Voltage Suppressors&#xff09;&#xff0c;即瞬态电压抑制器&#xff0c;又称雪崩击穿二极管。 TVS二极管的符号如下图所示 什么是雪崩击穿 雪崩击穿是有必要了解一下的&#xff0c;不然后面还有齐纳击穿&#xff0c;搞不…

GoWin FPGA--- startup2

clock Click Tools\IP Core Generator\rPLL, and open the configure file 原语 for Clock 双击选项&#xff0c;生产对应的代码&#xff0c;Copy到制定的地点。 右侧有对应的说明文件

【优选算法系列】【专题一双指针】第三节.611. 有效三角形的个数和LCR 179. 查找总价格为目标值的两个商品

文章目录 前言一、有效三角形的个数 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、查找总价格为目标值的两个商品 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 …

FastAPI与BaseModel

from typing import Optionalfrom fastapi import FastAPI from pydantic import BaseModel #当一个模型属性具有默认值时&#xff0c;它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性 app FastAPI() class Item(BaseModel):name:str #没有初始值都…

动态类型语言与静态类型语言的对比与比较

编程语言可以根据类型系统和类型检查时机分为动态编程语言和静态编程语言两大类&#xff0c;它们在运行时的代码检查方式、变量类型的使用方式等方面有很大的区别。这一块你知道吗&#xff1f; 本文将为您详细讲解两种编程语言的优缺点&#xff0c;以及它们的应用场景。 动态编…

基于SpringBoot的校园互助网站

简介 本系统分为三个角色&#xff0c;分别是普通用户和管理员、以及超级管理员&#xff0c;主要的功能模块有注册、登录、物品代购、快递代取、话题管理、任务管理、反馈管理、投诉管理、订单管理等功能模块。 项目 数据库 首页 登录 新增反馈 发布话题 发布任务 接单 我要投诉…

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt&#xff08;重要&#xff09;4、…

深入理解URL、URI和URN在Web开发中的重要性

引言&#xff1a; 在Web开发中&#xff0c;我们经常听到URL、URI和URN这几个术语&#xff0c;它们是构建和理解互联网资源的基础。虽然它们看起来相似&#xff0c;但实际上代表着不同的概念。本文将深入研究URL、URI和URN的定义、用途以及在Web开发中的重要性。 一、什么是URI&…

Verilog基础:$time、$stime和$realtime系统函数的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html $time、 $stime和$realtime这三个系统函数提供了返回当前仿真时间方法。注意&#xff0c;这里的仿真时间的最小分辨能力是由仿真时间精度决定的&#xff0c;简单来说&#xff0c;可以理解为…

Oracle连接错误:ORA-28040:没有匹配的验证协议

一、产生原因&#xff1a;oci动态库版本太低&#xff0c;无法连接高版本的数据库 二、解决办法 1、下载高版本的oci库 https://www.oracle.com/database/technologies/instant-client/winx64-64- downloads.html 2、解压并复制oci动态库 3、粘贴到相应的目录

VSCode + gdb + gdbserver调试ARM程序

在开发ARM嵌入式端C/C程序时&#xff0c;一般会在PC上编写代码&#xff0c;在Linux服务器上编译&#xff0c;然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题&#xff0c;在不使用gdb的情况下&#xff0c;经常在代码中添加打印&#xff0c;编译&#xff0c;然后在开发…

CentOS 7 安装并配置tomcat

简介 Tomcat是一个使用Java编写的开源Web应用服务器,是由Apache Software Foundation管理的一个项目。它是一个轻量级的应用服务器,可以下载、安装和使用,而且还提供了许多高级功能,例如支持Java Servlet、JavaServer Pages (JSP)和JavaServer Faces (JSF) 等JavaEE技术,…

【C++】动态内存管理——new和delete

这篇文章我们讲一下C的动态内存管理&#xff0c;从一个比较陌生的知识说起&#xff0c;我们知道&#xff0c;一个工程可以创建很多.c文件&#xff0c;我们如果定义一个全局变量&#xff0c;只要用extern声明一下&#xff0c;在每个文件都可以用。而用static修饰的全局变量只能在…

SpringBoot面试题:(一)SpringBoot自动装配原理源码解析

源码研究 SpringBoot启动类&#xff1a;SpringBootApplication注解 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class SpringBoot1Application {public static …

项目文章|冰川宏病毒功能多样性新进展

近期&#xff0c;凌恩生物客户兰州大学泛第三极环境中心合作的研究论文“Diversity and function of mountain and polar supraglacial DNA viruses”发表在《Science Bulletin》&#xff08;IF 18.9&#xff09;。该研究结果首次系统地描述了极地冰川上DNA病毒的多样性、功能和…