『科学计算』可视化二元正态分布&3D科学可视化实战
二元正态分布可视化本体
由于近来一直再看kaggle的入门书(sklearn入门手册的感觉233),感觉对机器学习的理解加深了不少(实际上就只是调包能力加强了),联想到假期在python科学计算上也算是进行了一些尝试学习,觉得还是需要学习一下机器学习原理的,所以重新啃起了吴恩达的cs229,上次(5月份的时候?)就是在多元高斯分布这里吃的瘪,看不下去了,这次觉定稳扎稳打,不求速度多实践实践,尽量理解数学原理,所以再次看到这部分时决定把这个分布复现出来,吴恩达大佬用的matlab,我用的python,画的还不错,代码如下,
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
import matplotlib as mpl num = 200
l = np.linspace(-5,5,num)
X, Y =np.meshgrid(l, l) u = np.array([0, 0])
o = np.array([[1, 0.5],
[0.5, 1]]) pos = np.concatenate((np.expand_dims(X,axis=2),np.expand_dims(Y,axis=2)),axis=2) a = (pos-u).dot(np.linalg.inv(o))
b = np.expand_dims(pos-u,axis=3)
Z = np.zeros((num,num), dtype=np.float32)
for i in range(num):
Z[i] = [np.dot(a[i,j],b[i,j]) for j in range(num)]
Z = np.exp(Z*(-0.5))/(2*np.pi*np.linalg.det(o))
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot_surface(X, Y, Z, rstride=5, cstride=5, alpha=0.3, cmap=cm.coolwarm) cset = ax.contour(X,Y,Z,10,zdir='z',offset=0,cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-5,cmap=mpl.cm.winter)
cset = ax.contour(X, Y, Z, zdir='y', offset= 5,cmap= mpl.cm.winter)
'''
mpl.cm.rainbow
mpl.cm.winter
mpl.cm.bwr # 蓝,白,红
cm.coolwarm
''' ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
实际操作中,可以看到我在Z生成部分使用了双层循环,我本意是使用numpy广播机制优化掉循环,实际操作不太顺利,(20,20,2)去叉乘(20,20,2,1),结果shape不是我期望的(20,20,1),而是(20,20,20,20,1),也就是说在高维叉乘时其实广播机制不太好用,毕竟实际上两个不同维度矩阵是可以直接叉乘的(虽然对维度有要求),这一点值得注意(高维矩阵叉乘不要依赖numpy的广播机制)。
参数:
u = np.array([0, 0])
o = np.array([[1, 0.5],
[0.5, 1]])

参数:
u = np.array([1, 1])
o = np.array([[1, 0],
[0, 1]])

参数:
u = np.array([1, 1])
o = 3*np.array([[1, 0],
[0, 1]])

等高线图添加
我们单独绘制一下等高线图,
# 前面添加图的位置修改如下,
# ax = fig.add_subplot(211,projection='3d') ax2 = fig.add_subplot(212)
cs = ax2.contour(X,Y,Z)
ax2.clabel(cs, inline=1, fontsize=20)

高斯判别分析模型示意图可视化
现在我们在上面代码的基础上可视化吴恩达老大的下一节的图,高斯判别分析模型可视化,这里面我们仅仅可视化基础的双高斯独立分布,代码如下,
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
import matplotlib as mpl num = 200
l = np.linspace(-5,5,num)
X, Y =np.meshgrid(l, l)
pos = np.concatenate((np.expand_dims(X,axis=2),np.expand_dims(Y,axis=2)),axis=2) u1 = np.array([2, 2])
o1 = 3*np.array([[1, 0],
[0, 1]])
a1 = (pos-u1).dot(np.linalg.inv(o1))
b1 = np.expand_dims(pos-u1,axis=3)
Z1 = np.zeros((num,num), dtype=np.float32) u2 = np.array([-2, -2])
o2 = 3*np.array([[1, 0],
[0, 1]])
a2 = (pos-u2).dot(np.linalg.inv(o2))
b2 = np.expand_dims(pos-u2,axis=3)
Z2 = np.zeros((num,num), dtype=np.float32) for i in range(num):
Z1[i] = [np.dot(a1[i,j],b1[i,j]) for j in range(num)]
Z2[i] = [np.dot(a2[i,j],b2[i,j]) for j in range(num)]
Z1 = np.exp(Z1*(-0.5))/(2*np.pi*np.linalg.det(o1))
Z2 = np.exp(Z2*(-0.5))/(2*np.pi*np.linalg.det(o1)) Z = Z1 + Z2 fig = plt.figure()
ax = fig.add_subplot(211,projection='3d')
ax.plot_surface(X, Y, Z, rstride=5, cstride=5, alpha=0.3, cmap=cm.coolwarm) cset = ax.contour(X,Y,Z,10,zdir='z',offset=0,cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-5,cmap=mpl.cm.winter)
cset = ax.contour(X, Y, Z, zdir='y', offset= 5,cmap= mpl.cm.winter)
'''
mpl.cm.rainbow
mpl.cm.winter
mpl.cm.bwr # 蓝,白,红
cm.coolwarm
''' ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show() ax2 = fig.add_subplot(212)
cs = ax2.contour(X,Y,Z)
ax2.clabel(cs, inline=1, fontsize=20)

不过吴老大的图两个高斯分布投影是分开的,所以我们再次小改绘图部分,
cset = ax.contour(X,Y,Z1,10,zdir='z',offset=0,cmap=cm.coolwarm)
cset = ax.contour(X,Y,Z2,10,zdir='z',offset=0,cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-5,cmap=mpl.cm.winter)
cset = ax.contour(X, Y, Z, zdir='y', offset= 5,cmap= mpl.cm.winter)
'''
mpl.cm.rainbow
mpl.cm.winter
mpl.cm.bwr # 蓝,白,红
cm.coolwarm
''' ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show() ax2 = fig.add_subplot(212)
cs = ax2.contour(X,Y,Z1)
ax2.clabel(cs, inline=1, fontsize=20)
cs2 = ax2.contour(X,Y,Z2)
ax2.clabel(cs2, inline=1, fontsize=20)
显示如下,框子不够标准导致圆有点变形,不过这个可以通过手动拉伸得到优化,所以问题不大,

有关多元正态分布的数学原理建议自行百度(cs229的学习不会在博客上更新,主要是因为我非常非常讨厌打数学公式233)。
『科学计算』可视化二元正态分布&3D科学可视化实战的更多相关文章
- 阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算
日前,阿里巴巴正式对外发布了分布式科学计算引擎 Mars 的开源代码地址,开发者们可以在pypi上自主下载安装,或在Github上获取源代码并参与开发. 此前,早在2018年9月的杭州云栖大会上,阿里 ...
- 『科学计算』L0、L1与L2范数_理解
『教程』L0.L1与L2范数 一.L0范数.L1范数.参数稀疏 L0范数是指向量中非0的元素的个数.如果我们用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0,换句话说,让参数W是稀 ...
- 『科学计算』通过代码理解SoftMax多分类
SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...
- 『科学计算』通过代码理解线性回归&Logistic回归模型
sklearn线性回归模型 import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model de ...
- 『科学计算』科学绘图库matplotlib练习
思想:万物皆对象 作业 第一题: import numpy as np import matplotlib.pyplot as plt x = [1, 2, 3, 1] y = [1, 3, 0, 1 ...
- 『科学计算』图像检测微型demo
这里是课上老师给出的一个示例程序,演示图像检测的过程,本来以为是传统的滑窗检测,但实际上引入了selectivesearch来选择候选窗,所以看思路应该是RCNN的范畴,蛮有意思的,由于老师的注释写的 ...
- 『科学计算』科学绘图库matplotlib学习之绘制动画
基础 1.matplotlib绘图函数接收两个等长list,第一个作为集合x坐标,第二个作为集合y坐标 2.基本函数: animation.FuncAnimation(fig, update_poin ...
- 『深度应用』NLP命名实体识别(NER)开源实战教程
近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务—命名实体识别(Named Entity Recogni ...
- 『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
随机推荐
- python socket编程函数介绍
网上看到一个socket中常用函数的介绍,记录一下 https://blog.csdn.net/rebelqsp/article/details/22109925
- 硬件中断和DPC一直占40-52%左右 解决方法
硬件中断和DPC一直占40-52%左右,突然感觉电脑变慢 重启后竟然启动不了了,冷却一段时间后才能进去,温度检测cpu,硬盘都超标了! 用Process Explorer检测硬件中断和DPC 占cpu ...
- 【运维技术】Maven + Gogs + Nexus 实现版本管理 + 代码模块开发管理
Gogs:能够实现fork + 代码提交 + 代码框架 Nexus:进行jar包的版本管理,私服下载jar包共享jar包 Maven:在客户端进行模块管理和批量操作 1. 本地maven仓库配置配置s ...
- MySQL Crash Course #13# Chapter 21. Creating and Manipulating Tables
之前 manipulate 表里的数据,现在则是 manipulate 表本身. INDEX 创建多列构成的主键 自动增长的规定 查看上一次插入的自增 id 尽量用默认值替代 NULL 外键不可以跨引 ...
- pyDay6
内容来自廖雪峰的官方网站 1.在Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好,1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 2.取指 ...
- noip2015 day1
不解释,很简单,直接按照题目的方法构造就行了 Code #include<iostream> #include<cstdio> #include<cctype> # ...
- gensim工具[学习笔记]
平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 一.将copy_train.csv文件的内容进行分 ...
- BZOJ2819: Nim 树链剖分
Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...
- 3:JavaScript中的各类语句
上面我们说完了数据类型和基本运算 下面说的就是各种类型的语句 --- ---------------------------------------------------------------- ...
- python 判断字符串是否以数字结尾
import re def end_num(string): #以一个数字结尾字符串 text = re.compile(r".*[0-9]$") if text.match(st ...