机器学习:混合高斯聚类GMM(求聚类标签)+PCA降维(3维降2维)习题

news2024/9/24 19:25:43
  1. 使用混合高斯模型 GMM,计算如下数据点的聚类过程:
    Data=np.array([1,2,6,7])
    均值初值为:
    μ1,μ2=1,5
    权重初值为:
    w1,w2=0.5,0.5
    方差:
    std1,std2=1,1
    K=2
    10 次迭代后数据的聚类标签是多少?

采用python代码实现:

 

from scipy import stats
import numpy as np

#初始化数据
Data = np.array([1,2,6,7])
w1 , w2 = 0.5, 0.5
mu1 , mu2 = 1, 5
std1 , std2 = 1, 1

n = len(Data) # 样本长度
zij=np.zeros([n,2])
for t in range(10):
    # E-step 依据当前参数,计算每个数据点属于每个子分布的概率
    z1_up = w1 * stats.norm(mu1 ,std1).pdf(Data)
    z2_up = w2*stats.norm(mu2 , std2).pdf(Data)
    z_all = (w1*stats.norm(mu1 ,std1).pdf(Data)+w2*stats.norm(mu2 ,std2).pdf(Data))+0.001
    rz1 = z1_up/z_all # 为甲分布的概率
    rz2 = z2_up/z_all # 为乙分布的概率
    # M-step 依据 E-step 的结果,更新每个子分布的参数。
    mu1 = np.sum(rz1*Data)/np.sum(rz1)
    mu2 = np.sum(rz2*Data)/np.sum(rz2)
    std1 = np.sum(rz1*np.square(Data-mu1))/np.sum(rz1)
    std2 = np.sum(rz2*np.square(Data-mu2))/np.sum(rz2)
    w1 = np.sum(rz1)/n
    w2 = np.sum(rz2)/n
for i in range(n):
    zij[i][0] = rz1[i]/(rz1[i]+rz2[i])
    zij[i][1] = rz2[i]/(rz1[i]+rz2[i])

labels = np.argmax(zij, axis=1)#输出每一行的最大值,0或1  axis表示返回每一行中最大值所在列的索引
print(labels)

聚类标签输出结果:[0 0 1 1]

也就是说,10 次迭代后数据的聚类标签是1,2归为0类6,7归为1

附注:

如果 axis 为 None,那么 np.argmax 会将数组展平为一维,然后返回最大值的索引。例如:

>>> a = np.array([[1, 2], [3, 4]])
>>> np.argmax(a)
3

如果 axis 为 0,那么 np.argmax 会沿着第一个维度(行)进行最大值的查找,返回每一列中最大值所在的行索引。例如:

>>> a = np.array([[1, 2], [3, 4]])
>>> np.argmax(a, axis=0)
array([1, 1])

如果 axis 为 1,那么 np.argmax 会沿着第二个维度(列)进行最大值的查找,返回每一行中最大值所在的列索引。例如:

>>> a = np.array([[1, 2], [3, 4]])
>>> np.argmax(a, axis=1)
array([1, 1])

在之前问题中,np.argmax([gamma1, gamma2], axis=0) 的意思是沿着第一个维度(gamma1 和 gamma2)进行最大值的查找,返回每个数据点属于哪个子分布的概率更大。

  1. 假设我们的数据集有 10 个 3 维数据, 需要用 PCA 降到 2 维特征。

    array([
        [ 3.25, 1.85, -1.29],
        [ 3.06, 1.25, -0.18],
        [ 3.46, 2.68, 0.64],
        [ 0.3 , -0.1 , -0.79],
        [ 0.83, -0.21, -0.88],
        [ 1.82, 0.99, 0.16],
        [ 2.78, 1.75, 0.51],
        [ 2.08, 1.5 , -1.06],
        [ 2.62, 1.23, 0.04],
        [ 0.83, -0.69, -0.61]])
    

    给出求解过程

解:

  1. 对所有的样本进行中心化:

x(i)=x(i)−1m∑j=1mx(j)

得到:

X=np.array([
     [ 1.147  0.825 -0.944]
     [ 0.957  0.225  0.166]
     [ 1.357  1.655  0.986]
     [-1.803 -1.125 -0.444]
     [-1.273 -1.235 -0.534]
     [-0.283 -0.035  0.506]
     [ 0.677  0.725  0.856]
     [-0.023  0.475 -0.714]
     [ 0.517  0.205  0.386]
     [-1.273 -1.715 -0.264]])
  1. 计算样本的协方差矩阵 XXT
covM2=np.array([[1.26344556 1.08743889 0.32030889], 
[1.08743889 1.11076111 0.31611111],
[0.32030889 0.31611111 0.45449333]])
  1. 对矩阵 XXT 进行特征值分解

取出最大的 n′ 个特征值对应的特征向量 (w1,…,wn′), 将所有的特征向量标准化后,组成特征向量矩阵 W。

3.1求出特征值:

eigval=np.array([2.38219729 0.09637041 0.35013229])

3.2特征向量标准化:

eigvec=np.array([
[ 0.71144     0.67380165 -0.19961077],
[ 0.66498574 -0.73733944 -0.11884665],
[ 0.22725997  0.04818606  0.97264126]])

3.3取出特征值最大的2个特征值索引,也就是[2.38,0.35]对应的第1列和第3列:

indexes=[2 0]

3.4特征向量矩阵W:(对eigvec取了第3列和第1列)

W=np.array([
[-0.19961077  0.71144   ], 
[-0.11884665   0.66498574], 
[ 0.97264126   0.22725997]])
  1. 对样本集中的每一个样本 x(i) , 转化为新的样本 z(i)=WTx(i) ,得到输出样本集 D=(z(1),…z(m))

X:3×10 W:3×2 x⋅W=10×33×2 因为输入行列转置,结果是一致的

D=np.array([
     [-1.24517539  1.15010151]
     [-0.05630956  0.86819503]
     [ 0.49146125  2.29005381]
     [ 0.06174799 -2.1317387 ]
     [-0.1185103  -1.84827733]
     [ 0.55280596 -0.10961848]
     [ 0.6112806   1.15829407]
     [-0.74632697  0.13724149]
     [ 0.24787719  0.5918589 ]
     [ 0.20114923 -2.10611029]])

代码:

import numpy as np

X=np.array([
    [ 3.25, 1.85, -1.29],
    [ 3.06, 1.25, -0.18],
    [ 3.46, 2.68, 0.64],
    [ 0.3 , -0.1 , -0.79],
    [ 0.83, -0.21, -0.88],
    [ 1.82, 0.99, 0.16],
    [ 2.78, 1.75, 0.51],
    [ 2.08, 1.5 , -1.06],
    [ 2.62, 1.23, 0.04],
    [ 0.83, -0.69, -0.61]])

def pca(X, d):
    # Centralization中心化
    means = np.mean(X, 0)
    X = X - means
    print(X)
    # Covariance Matrix 计算样本协方差矩阵
    M=len(X)
    X=np.mat(X)    
    covM2=np.cov(X.T)
    # 求出特征值,特征值分解
    eigval , eigvec = np.linalg.eig(covM2)
    indexes = np.argsort(eigval)[-d:]
    W = eigvec[:, indexes]
    return X*W
print(pca(X, 2))

附注:

np.cov()是一个用于计算协方差矩阵的函数,它可以接受一个或两个数组作为参数,返回一个二维数组,表示协方差矩阵。

协方差矩阵是一个对称矩阵,它的对角线元素表示各个变量的方差,非对角线元素表示两个变量之间的协方差。协方差反映了两个变量的线性相关程度,如果协方差为正,说明两个变量正相关;如果协方差为负,说明两个变量负相关;如果协方差为零,说明两个变量无相关性。

np.cov()的用法如下:

np.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)

参数说明:

  • m: 一个一维或二维的数组,表示多个变量和观测值。如果是一维数组,表示一个变量的观测值;如果是二维数组,每一行表示一个变量,每一列表示一个观测值。
  • y: 可选参数,另一个一维或二维的数组,表示另一组变量和观测值,必须和m具有相同的形状。
  • rowvar: 可选参数,布尔值,默认为True。如果为True,表示每一行代表一个变量;如果为False,表示每一列代表一个变量。
  • bias: 可选参数,布尔值,默认为False。如果为False,表示计算无偏协方差(除以n-1);如果为True,表示计算有偏协方差(除以n)。
  • ddof: 可选参数,整数,默认为None。如果不为None,则覆盖由bias隐含的默认值。ddof=0表示计算有偏协方差;ddof=1表示计算无偏协方差。
  • fweights: 可选参数,一维数组或整数,默认为None。表示每次观测的频率权重。
  • aweights: 可选参数,一维数组,默认为None。表示每个变量的可靠性权重。

返回值:

  • 一个二维数组,表示协方差矩阵。

举例说明:

import numpy as np

# 生成两组随机数据
x = np.random.randn(10)
y = np.random.randn(10)

# 计算x和y的协方差矩阵
cov_xy = np.cov(x,y)
print(cov_xy)
# 输出:
[[ 0.8136679  -0.01594772]
 [-0.01594772  0.84955963]]

# 计算x和y的相关系数矩阵
corr_xy = np.corrcoef(x,y)
print(corr_xy)
# 输出:
[[ 1.         -0.01904402]
 [-0.01904402  1.        ]]

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

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

相关文章

iOS开发-CABasicAnimation实现小球左右摆动动画效果

iOS开发-CABasicAnimation实现小球左右摆动动画效果 之前开发中遇到需要实现小球左右摆动动画效果,这里作下记录。 一、效果图 二、实现代码 2.1 CABasicAnimation CABasicAnimation基础动画,包括duration、repeatCount、repeatDuration、beginTime、…

Java中对Redis的常用操作

目录 数据类型五种常用数据类型介绍各种数据类型特点 常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令 在Java中操作RedisRedis的Java客户端Spring Data Redis使用方式介绍环境搭建配置Redis数据源编写配置类,创建RedisTempla…

JavaEE—— Callable接口、JUC的常见类、线程按安全的集合类(八股)

文章目录 一、Callable 接口二、JUC的常见类1. ReentrantLock2. 原子类(简单知晓)3.信号量 Semaphore4.CountDownLatch(简单了解) 三、线程安全的集合类1.多线程环境使用 ArrayList2.多线程使用哈希表 一、Callable 接口 Callable 接口类似于 Runnable 接口 Runnable 接口用来…

当阿里面试官问什么是hash?什么是布隆过滤器?什么是一致性hash?看这一篇就够了,很肝!也很干!

算法拾遗三十六hash 哈希函数特点hash表设计布隆过滤器布隆过滤器三大公式最终求解公式 一致性哈希经典数据存储经典hash缺点及解决方案虚拟节点 哈希函数特点 输入:任意长度字符串(输入域无穷大) 输出:相对有限 哈希函数无任何随…

前端,js , Error in created hook: TypeError ,有bug了

怎么兄弟,遇到bug了???你开心吗,哈哈哈哈

Linux操作系统1-命令篇

不同领域的主流操作系统 桌面操作系统 Windos Mac os Linux服务器操作系统 Unix Linux(免费、稳定、占有率高) Windows Server移动设备操作系统 Android(基于Linux,开源) ios嵌入式操作系统 Linux(机顶盒、路由器、交换机) Linux 特点:免费、开源、多用户、多任务…

【C/C++】#include<xxx.h>和#include“xxx.h“之间的区别以及寻找gcc和g++的系统头文件目录和系统库文件目录的方法

2023年7月29日&#xff0c;周六晚上 今天下午和晚上花了不少时间去研究这个C/C的头文件以及#include<xxx.h>和#include"xxx.h"之间的区别&#xff0c;收获到了很多的很有用的知识。非常值得花时间来以博客的形式总结这些学习成果。 说实话&#xff0c;我挺想…

python美化图形化界面设计,pythontkinter界面美化

大家好&#xff0c;本文将围绕python美化图形化界面设计展开说明&#xff0c;pythontkinter界面美化是一个很多人都想弄明白的事情&#xff0c;想搞清楚python美化输出模块需要先了解以下几个事情。 1、python如何做界面 PyQt&#xff0c;一个基于Qt的Python接口包&#xff0c…

网络框架重构之路plain2.0(c++23 without module) 综述

原因 plain1.1rc的不足 &#xff11;、命名空间问题 如果看过或者接触过plain的朋友&#xff0c;不难发现命名空间都是以pf_*开头。说起这个的时候&#xff0c;还是要从plain的前身plainserver&#xff08;GitHub - viticm/plainserver: A plain server, simple but stronger.&…

SpringBoot超级详解

1.父工程的父工程 在父工程的父工程中的核心依赖&#xff0c;专门用来版本管理的 版本管理。 2.父工程 资源过滤问题&#xff0c;都帮解决了&#xff0c;什么配置文件&#xff0c;都已经配置好了&#xff0c;资源过滤问题是帮助&#xff0c;过滤解决让静态资源文件能够过滤到…

HCIP OSPF链路状态类型总结

OSPF的LSA OSPF是典型的链路状态路由协议&#xff0c;使用LAS&#xff08;链路状态通告&#xff09;来承载链路状态信息。LSA是OSPF的一个核心内容&#xff0c;如果没有LSA&#xff0c;OSPF 是无法描述网络的拓扑结构及网段信息的&#xff0c;也无法传递路由信息&#xff0c;更…

跟老齐学python:数据分析,python数据分析开源软件

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python数据分析安装什么软件&#xff0c;python数据分析模块如何用&#xff0c;现在让我们一起来看看吧&#xff01;

百题千解计划【CSDN每日一练】收件邮箱(使用Python、Java、JavaScript解决)无敌的Python正则表达式、零宽负向断言

天真的人,不代表没有见过世界的黑暗,恰恰因为见到过,才知道天真的好。———三毛 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆…

25.10 matlab里面的10中优化方法介绍—— 函数fmincon(matlab程序)

1.简述 关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中&#xff0c;为了便于我们理解&#xff0c;引导我们进入规划模型的一种情况。相比之下&#xff0c;非线性规划会更加贴近…

开发集成工具pre-commit详解介绍

文章目录 pre-commit简介安装使用安装pre-commit脚本 pre-commit 官网-使用介绍 官网-可使用的钩子列表 简介 pre-commit&#xff1a;帮助你提高代码质量的工具 pre-commit是一个帮助开发人员提高代码质量的工具。它通过在提交代码之前运行一系列检查来实现这一点。这些检…

【并发编程】ForkJoinPool工作原理分析

目录 前置内容课程内容一、由一道算法题引发的思考1.算法题2.什么是归并排序法 二、什么是Fork/Join框架1.基本介绍2.ForkJoinPool2.ForkJoinPool构造函数及参数解读3.任务提交方式4.工作原理图5.工作窃取6.和普通线程池之间的区别7.ForkJoinTask 学习总结 前置内容 Q1&#x…

数学建模学习(7):Matlab绘图

一、二维图像绘制 1.绘制曲线图 最基础的二维图形绘制方法&#xff1a;plot -plot命令自动打开一个图形窗口Figure&#xff1b; 用直线连接相邻两数据点来绘制图形 -根据图形坐标大小自动缩扩坐标轴&#xff0c;将数据标尺及单位标注自动加到两个坐标轴上&#xff0c;可自定…

类和对象|六个默认成员函数|const成员函数|运算符重载

文章目录 默认成员构造函数1. 构造函数1.1 概念1.2 特性 2. 析构函数2.1 概念2.2 特性 3. 拷贝构造函数3.1 概念3.2 特性 4. 运算符重载4.1 赋值重载4.2 自增自减重载4.3 取地址操作符重载 5. const成员函数6. 取地址重载 默认成员构造函数 上一节我们说过&#xff0c;空类的大…

行为型:发布订阅模式

定义   发布订阅模式是基于一个事件&#xff08;主题&#xff09;通道&#xff0c;希望接收通知的对象Subscriber&#xff08;订阅者&#xff09;通过自定义事件订阅主题&#xff0c;被激活事件的对象 Publisher &#xff08;发布者&#xff09;通过发布主题事件的方式通知订…

STM32F103利用CubeMX配置开启定时中断

1、外部晶振8MHz&#xff0c;下载方式SWD模式&#xff0c;需求配置定时器1&#xff0c;产生每100ms一次中断 新建工程、配置晶振、选择下载方式等略 2、查阅资料&#xff0c;STM32F103的时钟树分配 3、配置CubeMX的时钟树 4、配置定时器-开启定时中断 5、配置定时时间 &…