杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

概率论实验

AI基础之概率论的学习,学习自华为的iLearnX网站

概率论介绍

概率论是研究随机现象数量规律的数学分支。随机现象是相对于决定性现象而言的,在一定条件下必然发生某一结果的现象称为决定性现象。
概率论是用来描述不确定性的数学工具,很多据挖掘中的算法都是通过描述样本的概率相关信息或推断来构建模型

均值实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import scipy as sp

# 均值实现
U = [[1, 2, 3, 4, 5, 6], [3, 4, 5, 6, 7, 8]]

# 全部元素求均值
print(np.mean(U))
# 结果输出:
# 4.5

# 按列求均值,0代表列向量
print(np.mean(U, 0))
# 结果输出:
# [2. 3. 4. 5. 6. 7.]

# 按行求均值,1代表行向量
print(np.mean(U, 1))
# 结果输出:
# [3.5 5.5]

方差实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import scipy as sp
# 方差实现
b = [1,3,5,6]
U = [[1,2,3,4,5,6],[3,4,5,6,7,8]]
# 求方差
np.var(b)
# 结果输出
# 3.6875

# 第二个参数为1,表示按行求方差
np.var(U, 1)
# 结果输出
# array([2.91666667, 2.91666667])

# 第二个参数为0,表示按行求方差
np.var(U, 0)
# 结果输出
# array([1., 1., 1., 1., 1., 1.])

标准差实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import scipy as sp
# 标准差实现
U = [[1,2,3,4,5,6],[3,4,5,6,7,8]]
# 求标准差
np.std(U)
# 结果输出
# 1.9790570145063195

# 第二个参数为1,表示按行求标准差

# 结果输出
# array([1.70782513, 1.70782513])
np.std(U, 1)
# 第二个参数为0,表示按行求标准差
np.std(U, 0)
# 结果输出
# array([1., 1., 1., 1., 1., 1.])

协方差实现

1
2
3
4
5
6
7
8
import numpy as np
import scipy as sp
# 协方差实现
b = [1,3,5,6]
# 求协方差
np.cov(b)
# 结果输出
# array(4.91666667)

相关系数

1
2
3
4
5
6
# 相关系数
vc=[1,2,39,0,8]
vb=[1,2,38,0,8]

np.corrcoef(vc,vb)
# 结果输出:

二项分布的实现

服从二项分布的随机变量X表示在n次独立同分布的伯努利试验中成功的次数,其中每次试验的成功概率为p。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 二项分布的实现
from scipy.stats import binom,norm,beta,expon
import numpy as np
import matplotlib.pyplot as plt

# n,p对应二项式公式中的事件成功次数及其概率
binom_sim = binom.rvs(n=10, p=0.3,size=10000)
print('Data:',binom_sim)
print('Mean:%g'%np.mean(binom_sim))
print('SD:%g'%np.std(binom_sim,ddof=1))
# 生成直方图,x指定每个bin(箱子)分布的数据,对应x轴,bins是总共有几条条状图,
# normed值密度,也就是每个条状图的占比比例,默认为1
plt.hist(binom_sim,bins=10,density=True)
plt.xlabel('x')
plt.ylabel('density')
plt.show()
Data: [4 5 1 ... 5 5 2]
Mean:3.0176
SD:1.42664

png

泊松分布实现

一个服从泊松分布的随机变量X,表示在具有比率参数$\lambda$的一段固定时间间隔内,事件发生的次数。参数$\lambda$告诉你该事件发生的比率。随机变量X的平均值和方差都是$\lambda$

1
2
3
4
5
6
7
8
9
10
import numpy as np
import matplotlib.pyplot as plt

# 产生10000个符合lambda=2的泊松分布的数
X = np.random.poisson(lam=2,size=10000)

a = plt.hist(X, bins=15, density=True,range=[0,15])
# 生成网络
plt.grid()
plt.show()

png

正态分布

正态分布是一种连续分布,其函数可以在实线上的任何地方取值。正态分布由两个参数描述:
分布的平均值μ标准差σ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt

mu = 0
sigma = 1
# 分布采样点
x = np.arange(-5,5,0.1)
# 生成符合mu,sigma的正态分布
y = norm.pdf(x,mu,sigma)
plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('density')
plt.show()

png

应用

图像加噪声

案例引入:比如在深度学习中,我们需要训练一个图像分类的模型,但是能拿到的图像不是很多,那有没有一种方法可以根据现有的图像生成一些新的图像出来呢?

增加的图像需要满足一些条件:图像本身的内容不能发生根本性的改变,比如图像能看出来是一只狗的话扩增出来的图像应该也是一只狗而不能成为只剩下一个毛茸茸的尾巴。最直接的方式就是在原始的图像上增加一些噪声,也就是使得图像变得粗糙同时保持图像原本要表述的信息。

给图像增加噪声,实现一下这个过程,该过程需要使用到 Python图像处理的模块 OpenCV,我们使用著名的Lena图作为原始图像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 图像加噪声
from numpy import *
from scipy import *
import numpy as np
import cv2

srcImage = cv2.imread(r'E:\Python\sources\lena.png')
print(srcImage.shape) # 打印图像size
cv2.namedWindow('Original image') # 图像显示窗口命令
cv2.imshow('Original image', srcImage) # 显示图像
k = cv2.waitKey(0)
# 灰度处理原始图片
grayImage = cv2.cvtColor(srcImage, cv2.COLOR_BGR2GRAY) # 灰度变换
print(grayImage.shape)
cv2.imshow('grayimage', grayImage)
k = cv2.waitKey(0)
# 加入高斯噪声(均值mean,方差var,比例percent)
image = np.array(grayImage / 255, dtype=float)
percent = 0.01 # 图像加入噪声比例
num = int(percent * image.shape[0] * image.shape[1])

for i in range(num):
temp1 = np.random.randint(image.shape[0])
temp2 = np.random.randint(image.shape[1])

mean = 0
var = 0.04
noise = np.random.normal(mean, var**0.5, 1)
image[temp1][temp2] += noise
out = image

if out.min() < 0:
low_clip = -1
else:
low_clip = 0
out = np.clip(out, low_clip, 1)
gasuss_image = np.uint8(out * 255)
print(gasuss_image.shape)
cv2.imshow('gasuss_image', gasuss_image)
k = cv2.waitKey(0)

# 加入泊松噪声(泊松参数scale,比例percent)
from scipy.stats import expon

image = np.array(grayImage, dtype=float)
percent = 0.001 # 图像加入噪声比例
num = int(percent * image.shape[0] * image.shape[1])
for i in range(num):
temp1 = np.random.randint(image.shape[0])
temp2 = np.random.randint(image.shape[1])
scale = 150
noise = np.random.poisson(scale, 1)
image[temp1][temp2] += noise

out = image
if out.min() < 0:
low_clip = -1
else:
low_clip = 0
out = np.clip(out, low_clip, 255)
expon_image = np.uint8(out)
print(expon_image.shape)
cv2.imshow('expon.image', expon_image)
k = cv2.waitKey(0)
(457, 563, 3)

欢迎关注我的其它发布渠道