机器学习第五次作业

简介: 机器学习第五次作业包含三个题目。第一题实现高斯贝叶斯分类和高斯朴素贝叶斯分类,分别用于判断瓜的好坏。第二题使用EM算法对数据进行聚类,输出两个类别的均值、方差和先验概率。第三题内容未完整展示。

机器学习第五次作业

第一题

image-20210107112113413

高斯贝叶斯分类代码如下:

import numpy as np
def gaussian_bayes(x_0, x_1):
    n = len(data)
    c_0 = 0
    c_1 = 0
    mu_00 = 0
    mu_01 = 0
    mu_10 = 0
    mu_11 = 0
    var_00 = 0
    var_01 = 0
    var_10 = 0
    var_11 = 0
    var_0 = 0
    var_1 = 0

    for d in data:
        if d[2] == 0:
            mu_00 += d[0]
            mu_01 += d[1]
            c_0 += 1
        else:
            mu_10 += d[0]
            mu_11 += d[1]
            c_1 += 1
    mu_00 /= c_0
    mu_01 /= c_0
    mu_10 /= c_1
    mu_11 /= c_1

    for d in data:
        if d[2] == 0:
            var_00 += (d[0] - mu_00) * (d[0] - mu_00)
            var_01 += (d[1] - mu_01) * (d[1] - mu_01)
            var_0 += (d[0] - mu_00) * (d[1] - mu_01)
        else:
            var_10 += (d[0] - mu_10) * (d[0] - mu_10)
            var_11 += (d[1] - mu_11) * (d[1] - mu_11)
            var_1 += (d[0] - mu_10) * (d[1] - mu_11)
    # 协方差
    var_0 = np.array([[var_00, var_0], [var_0, var_01]]) / c_0
    var_1 = np.array([[var_10, var_1], [var_1, var_11]]) / c_1

    x = [x_0, x_1]
    mu_0 = np.array([[mu_00, mu_01]])
    mu_1 = np.array([[mu_10, mu_11]])

    p_0 = 1 / (2 * np.pi ** (2 / 2) * np.sqrt(var_00 * var_01)) * \
          np.exp(-1 / 2 * np.dot(np.dot((x - mu_0), np.linalg.inv(var_0)), (x - mu_0).T))
    p_1 = 1 / (2 * np.pi ** (2 / 2) * np.sqrt(var_10 * var_11)) * \
          np.exp(-1 / 2 * np.dot(np.dot((x - mu_1), np.linalg.inv(var_1)), (x - mu_1).T))
    print("好瓜:", p_1)
    print("坏瓜:", p_0)

高斯贝叶斯分类结果如下:

好瓜: [[0.75333906]]
坏瓜: [[0.30333779]]

高斯朴素贝叶斯分类代码如下:

import numpy as np

data = [[0.697, 0.460, 1], [0.774, 0.376, 1], [0.634, 0.264, 1], [0.608, 0.318, 1], [0.556, 0.215, 1],
        [0.403, 0.237, 1], [0.481, 0.149, 1], [0.437, 0.211, 1],
        [0.666, 0.091, 0], [0.243, 0.267, 0], [0.245, 0.057, 0], [0.343, 0.099, 0], [0.639, 0.161, 0],
        [0.657, 0.198, 0], [0.360, 0.370, 0], [0.593, 0.042, 0], [0.719, 0.103, 0]]

label_1_x1 = [i[0] for i in data if i[2]==1]
label_1_x2 = [i[1] for i in data if i[2]==1]
label_0_x1 = [i[0] for i in data if i[2]==0]
label_0_x2 = [i[1] for i in data if i[2]==0]

# 上面那组
label_0_x1_mean = np.mean(label_0_x1)
label_0_x1_std = np.std(label_0_x1)
label_0_x2_mean = np.mean(label_0_x2)
label_0_x2_std = np.std(label_0_x2)

# 下面那组
label_1_x1_mean = np.mean(label_1_x1)
label_1_x1_std = np.std(label_1_x1)
label_1_x2_mean = np.mean(label_1_x2)
label_1_x2_std = np.std(label_1_x2)

# 先算是bad瓜的概率
p1 = 1/(np.sqrt(2*np.pi)*label_0_x1_std)*np.exp((-(0.5-label_0_x1_mean)**2)/(2*(label_0_x1_std**2)))
p2 = 1/(np.sqrt(2*np.pi)*label_0_x2_std)*np.exp((-(0.3-label_0_x2_mean)**2)/(2*(label_0_x2_std**2)))
print("坏瓜:", p1*p2*(9/17))

# 再算是good瓜的概率
p1x = 1/(np.sqrt(2*np.pi)*label_1_x1_std)*np.exp((-(0.5-label_1_x1_mean)**2)/(2*label_1_x1_std**2))
p2x = 1/(np.sqrt(2*np.pi)*label_1_x2_std)*np.exp((-(0.3-label_1_x2_mean)**2)/(2*label_1_x2_std**2))
print("好瓜:", p1x*p2x*(8/17))

高斯朴素贝叶斯分类结果如下:

坏瓜: 1.6139228137336026
好瓜: 5.312634923114169

第二题

image-20210107112127949

1

2

3

代码如下:

import numpy as np

data = [1.0, 1.3, 2.2, 2.6, 2.8, 5.0, 7.3, 7.4, 7.5, 7.7, 7.9]

# 均值 方差 pc
theta1 = [6, 1, 0.5]
theta2 = [7.5, 1, 0.5]

while True:
    # E-step
    # pxc: P(x|c)
    # pcx: P(c|x) pcx1:
    pc1x_list = []
    pc2x_list = []
    for d in data:
        pxc1 = 1 / np.sqrt(2 * np.pi * theta1[1]) * np.exp(-(d - theta1[0]) ** 2 / (2 * theta1[1]))
        pxc2 = 1 / np.sqrt(2 * np.pi * theta2[1]) * np.exp(-(d - theta2[0]) ** 2 / (2 * theta2[1]))
        pc1x = theta1[2] * pxc1 / (theta1[2] * pxc1 + theta2[2] * pxc2)
        pc2x = theta2[2] * pxc2 / (theta1[2] * pxc1 + theta2[2] * pxc2)
        pc1x_list.append(pc1x)
        pc2x_list.append(pc2x)

    # M-step
    mu1_temp1 = 0
    mu1_temp2 = 0
    mu2_temp1 = 0
    mu2_temp2 = 0
    sigma1_temp1 = 0
    sigma1_temp2 = 0
    sigma2_temp1 = 0
    sigma2_temp2 = 0
    pc1 = 0
    pc2 = 0
    for index, d in enumerate(data):
        # print(index, d)
        # mu
        mu1_temp1 += pc1x_list[index] * d
        mu1_temp2 += pc1x_list[index]
        mu2_temp1 += pc2x_list[index] * d
        mu2_temp2 += pc2x_list[index]

        # sigma
        sigma1_temp1 += pc1x_list[index] * (d - theta1[0]) ** 2
        sigma1_temp2 += pc1x_list[index]
        sigma2_temp1 += pc2x_list[index] * (d - theta2[0]) ** 2
        sigma2_temp2 += pc2x_list[index]

        # pc
        pc1 += pc1x_list[index]
        pc2 += pc2x_list[index]

    theta = theta1[:]

    # 更新均值
    theta1[0] = mu1_temp1 / mu1_temp2
    theta2[0] = mu2_temp1 / mu2_temp2
    # 更新方差
    theta1[1] = sigma1_temp1 / sigma1_temp2
    theta2[1] = sigma2_temp1 / sigma2_temp2
    # 更新P(C)
    theta1[2] = pc1 / len(data)
    theta2[2] = pc2 / len(data)

    if np.abs(theta[2] - theta1[2]) < 1e-7:
        break
print(theta1)
print(theta2)

结果如下:

[2.484129369953009, 1.6917479527139188, 0.5455419134418865]
[7.560020390897808, 0.046398844567893, 0.4544580865581134]

第三题

image-20210107112149261

0

09, 1.6917479527139188, 0.5455419134418865]
[7.560020390897808, 0.046398844567893, 0.4544580865581134]
```

第三题

[外链图片转存中...(img-pG1AwdUZ-1616158608323)]

[外链图片转存中...(img-XRJ4d0UK-1616158608324)]

目录
相关文章
|
2天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
3天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1540 5
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
7天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
578 22
|
3天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
201 3
|
10天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
10天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
578 5
|
23天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
233 3
|
9天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
327 2