文章目录
概率
变量类型 Variable types
import pandas as pd
columns = ['姓名','年龄','身高','是否婚恋','月薪','学历']
data = [['张三',18,181,1,18000,'本科'],
['李四',30,172,0,13000,'本科'],
['王五',14,198,1,8888,'本科'],
['赵六',18,176,0,3000,'本科']]
pd.DataFrame(columns=columns,data=data)
姓名 | 年龄 | 身高 | 是否婚恋 | 月薪 | 学历 | |
---|---|---|---|---|---|---|
0 | 张三 | 18 | 181 | 1 | 18000 | 本科 |
1 | 李四 | 30 | 172 | 0 | 13000 | 本科 |
2 | 王五 | 14 | 198 | 1 | 8888 | 本科 |
3 | 赵六 | 18 | 176 | 0 | 3000 | 本科 |
-
其中每一行就是一个 instance
-
每一列就是一个 attribute
-
如果你要对数据进行机器学习任务,那么你就要指定一列数据作为 label
-
因此 instance = attributes + label
-
更加直观地表述是:假设你要根据 ‘姓名’,‘年龄’,‘身高’,‘是否婚恋’,‘学历’ 这些 attributes 来进行预测 ‘月薪’
-
那么这个时候 ‘月薪’这一列就是 label,而其他的列就是 attributes,很多任务里我们也把 attributes 称为特征,labels 叫做标签
-
张三以及张三所有的信息称为一条 instance 也叫一条数据
-
根据 attributes 中数据类型的不同,我们可以把他们分为:
- Nomial/categorial :通过名称来区分类型,例如 ‘张三’ ‘李四’ 这些变量互相之间没有任何关系;这些变量之间也不存在顺序关系,他们相互之间是 equally dissimilar 的。boolean 类型是一类特殊的 nomial variable
- Ordinal:变量值是离散的,而且不同的变量值之间存在天然的顺序,数学运算通常没有意义。例如酒店评级,三星,五星;其中 3,5 是离散的值,但是不能进行数学运算,因为 3星 + 5星 = 8星,但是这违背了数据本身的意义,加完之后就变成了没有意义的数据
- Continuous(numerical):变量值本身是实数,没有明显的数据边界,例如:距离,时间,价格;两个值之间是连续的,可以进行有意义的数学运算,例如 3m + 5m = 8m
equally dissimilar:等同差异,那么什么是不等同差异呢,比如当我们做分类任务的时候我们区分猫、狗、人,猫和狗之间的差异与人和狗之间的差异显然是不一样的,虽然猫和狗不同,人也和狗不同,但是这种’不同’ 仍然不是等价的。而这个时候(猫或狗或人的)名字之间虽然不同,但是这种不同我们可以认为是 equally 的,这个名字属性并不会对分类这个任务产生任何影响,换句话说,就算你换了一个名字,依然不影响分类任务。但换到另外一类任务中,可能名字就不是 equally dissimilar 的了。
- 变量的类型之所以重要,是因为我们需要不同的处理方法,我们要避免无效和无意义的操作或者产生无意义的 attributs;
概率基础
- 我们之所以需要概率,是因为我们所处的世界和所面对的绝大多数情况,都是不确定的(uncertainty);当我们和别人擦肩而过的时候,我们喜欢猜他们的身份,帅气阳光、谈吐不凡的小伙大概率家境优渥,美丽而性感的女孩大概率是开朗的,而猜的过程就是一个通过观测到的已知信息进行概率预测的过程。
边际概率
-
假设我们现在有两个事件 X = { x 1 , x 2 , x 3 } X = \{x_1,x_2,x_3\} X={x1,x2,x3} 代表年龄; Y = { y 1 , y 2 } Y=\{y_1,y_2\} Y={y1,y2} 代表购买情况,也就构成了上面这张表格
-
P ( X = x 1 ) , P ( X = x 2 ) , P ( X = x 3 ) P(X=x_1),P(X=x_2),P(X=x_3) P(X=x1),P(X=x2),P(X=x3) 或者 P ( Y = y 1 ) , P ( Y = y 2 ) P(Y=y_1),P(Y=y_2) P(Y=y1),P(Y=y2) 我们称为边际概率,他们是上表中的一整行或者一整列,所以我们叫他们 “边际”概率
-
还是举个具体的例子帮助理解:校园里随便抓一个人 > 45 岁的概率是多少,数学表示可以是 P ( X = x 3 ) P(X=x_3) P(X=x3) 或者写成 P ( a g e > 45 ) P(age>45) P(age>45);
-
这个概率是多少呢?当然是 (50 + 100) / (所有值) = 150 / 1250 = 0.12
联合概率
- 联合概率就是两个事件同时发生的概率,例如: P ( X = x 3 , Y = y 2 ) P(X=x_3,Y=y_2) P(X=x3,Y=y2) 也可以简写成 P ( x 3 , y 2 ) P(x_3,y_2) P(x3,y2)
- 这个概率也很容易算出来,是 100 / 1250 = 0.08
条件概率
-
在一个事件发生的前提下,另外一个事件发生的概率。数学形式上写作 P ( x 3 ∣ y 2 ) P(x_3 | y_2) P(x3∣y2) 读作:在 y 2 y_2 y2 事件发生的条件下 x 3 x_3 x3 事件发生的概率
-
这个概率,我们也可以通过联合概率和边际概率一起求算条件概率:
P ( x ∣ y ) = P ( x , y ) P ( y ) P(x|y)=\frac{P(x,y)}{P(y)} P(x∣y)=P(y)P(x,y) -
概率的计算规则可以总结成下图:
-
注意,图中的 x, y 我们称为 小x 小y,是 X 和 Y 事件的其中一种情况,不能认为是 X 或者 Y 事件
贝叶斯公式 Bayes,先验概率,后验概率
P ( x ∣ y ) = P ( x , y ) P ( y ) P(x|y)=\frac{P(x,y)}{P(y)} P(x∣y)=P(y)P(x,y)
- 给定这个公式,我们可以得到 P ( x ∣ y ) ⋅ P ( y ) = P ( x , y ) P(x|y) \cdot P(y) = P(x,y) P(x∣y)⋅P(y)=P(x,y) 同样我们也可以得到 P ( y ∣ x ) ⋅ P ( x ) = P ( y , x ) P(y|x) \cdot P(x) = P(y,x) P(y∣x)⋅P(x)=P(y,x);而由这两个公式,我们可以联合得到贝叶斯公式: P ( y ∣ x ) = P ( x ∣ y ) ⋅ P ( y ) P ( x ) P(y|x) = \frac{P(x|y)\cdot P(y)}{P(x)} P(y∣x)=P(x)P(x∣y)⋅P(y) 或者 P ( x ∣ y ) = P ( y ∣ x ) ⋅ P ( x ) P ( y ) P(x|y) = \frac{P(y|x)\cdot P(x)}{P(y)} P(x∣y)=P(y)P(y∣x)⋅P(x)
我们上文中贝叶斯公式的第一种形式来举例: P ( y ∣ x ) = P ( x ∣ y ) ⋅ P ( y ) P ( x ) P(y|x) = \frac{P(x|y)\cdot P(y)}{P(x)} P(y∣x)=P(x)P(x∣y)⋅P(y)
-
P ( y ) P(y) P(y) 是先验概率 prior probability
-
P ( y ∣ x ) P(y|x) P(y∣x) 是后验概率 posterior probability
-
先验概率顾名思义是我们事先知道的概率。例如上面表格的例子中,我们可以通过统计直接得到的概率就是先验概率,例如 P ( a g e > 45 ) P(age>45) P(age>45)
事件的独立和条件独立
独立的两个事件
- 如果两个事件是完全独立的,例如
x
,
y
x,y
x,y 相互独立,那么:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woNP4PSy-1646821679282)(attachment:image.png)] - 因为两个独立事件相互不影响,一个发生或者不发生并不会影响另外一个的概率
条件独立的两个事件
- 假设
x
,
y
x,y
x,y 是关于 z 独立的,这个意思就是说,在
z
z
z 这个事件发生的时候,
x
,
y
x,y
x,y 可以认为是独立的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqhSlxUg-1646821679283)(attachment:image.png)]
不同事件对结果预测的影响
-
上面的例子中根据贝叶斯公式求得的概率显示,当我们把 a g e age age 作为条件求 y y y 的概率,而 Y Y Y 事件只有两种情况 y 1 , y 2 y1,y2 y1,y2,因此我们很容易通过给定一个 a g e age age 情况而判断 purchase 的情况,即:如果 P(yes|age) > P(no | age) 则预测为 purchase 否则就不 purchase
-
如果把这个条件和预测的事件调转一下:
-
当给定 purchase 事件作为条件,通过贝叶斯公式求得在一种 age 情况下的概率并不能帮我们一下得到预测结果;因为 age 的情况有三种,如果我们想得到所有的情况,我们需要依次计算,例如我们需要分别求得: P ( a g e < 18 ∣ y e s ) , P ( a g e 18 − 45 ∣ y e s ) , P ( a g e > 45 ∣ y e s ) P(age<18|yes),P(age18-45|yes),P(age>45|yes) P(age<18∣yes),P(age18−45∣yes),P(age>45∣yes) 才能判断出来当给定 yes 的条件下哪种人群的概率更大
概率分布
- 一个函数描述了一个随机变量的所有结果的概率 :
- 对于离散的随机变量,我们使用概率质量函数 probability mass function
- 对于连续的随机变量,我们采用概率密度函数 probability density function
离散随机变量的概率质量函数
import cv2
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
img = cv2.imread('./cat.jpeg')[:,:,::-1]
plt.imshow(img)
- 现在有 color 这个离散的随机变量,值的范围从 0-255 不定,如果我们拿到一张图,我们通过统计得到它的概率质量函数
# 统计 r,g,b 通道的概率质量(密度)曲线
# plt.hist(np.ravel(),density=True)
sns.distplot(np.ravel(img[:,:,0]))
sns.distplot(np.ravel(img[:,:,1]))
sns.distplot(np.ravel(img[:,:,2]))
- 上面的例子是离散的值,所有值的范围都是 0-255 之间,因此我们可以通过统计来完成概率质量函数的计算;那如果当我们面对连续的值怎么办?
连续随机变量的概率密度函数
- 假设你的外卖送达的时间,这个时间变量是一个连续的变量,比如可能是 1:59:32 送达,也有可能是 1:48:20 送达;因此我们不可能像离散情况一样统计所有的值的频率和次数。这种情况下我们应该怎么样统计频次和概率呢?
- 通过区间来限定例如 0-1点之间送达的次数,1-2点之间送达的次数,…这样最终就会产生一个分布。
# 产生 0-24 之间 100 个值来模拟 0-24 h 的任何一个时间点外卖送达
values = np.random.random(100)*24
hist,binedges = np.histogram(values,24)
values
array([1.77898275e+01, 2.36934109e+01, 1.97608921e+01, 1.83818365e+00,
2.55904301e+00, 1.37081541e+01, 2.35511071e+01, 1.10165121e+01,
2.17409025e+01, 2.63501317e+00, 4.85291551e+00, 2.30919417e+01,
7.53366405e-01, 8.16338291e+00, 2.72542799e+00, 2.00072120e+01,
6.79543011e+00, 9.44303541e+00, 3.15477018e+00, 2.38552304e+01,
2.28484488e+01, 6.91335488e+00, 1.86652702e+01, 5.58253850e+00,
1.99533793e+01, 5.00338232e+00, 7.66444269e+00, 1.20367540e+01,
1.79323948e+01, 1.78029936e+01, 1.06639548e+01, 9.73778849e+00,
2.81379048e+00, 1.58454815e+01, 2.09834843e+01, 1.35417834e+00,
9.77147842e+00, 1.13049226e+00, 9.96184126e+00, 2.15654436e+01,
6.07082821e+00, 1.80638204e+01, 1.32332998e+01, 1.42183790e+01,
1.36133202e+01, 1.27562229e+01, 1.20599640e+01, 1.92554979e+01,
1.32514498e+01, 1.03932626e+01, 2.13002550e+01, 3.83388708e+00,
2.37292122e+01, 6.50202649e+00, 1.75906608e+01, 2.35439543e+01,
1.91597177e+01, 1.20878026e+01, 1.76734467e+00, 1.74570178e+01,
9.37139219e+00, 6.47466473e+00, 1.16022299e+01, 6.28666787e+00,
1.80153805e+01, 2.08814096e+01, 2.15143660e+01, 1.95290029e+01,
2.31869682e+01, 1.32208857e+01, 1.30871452e+01, 1.08252339e+01,
1.79704600e+01, 2.38357069e+01, 3.31417414e+00, 1.75771939e-05,
1.38878190e+01, 1.68534942e+01, 1.11579023e+01, 6.72190402e+00,
1.90299822e+01, 2.96611767e+00, 1.13869820e+01, 8.92956203e+00,
2.00428362e+00, 9.59396062e+00, 2.14843483e+01, 1.20420311e+01,
1.82388181e+01, 1.83250690e+01, 1.27037388e+01, 2.12201975e+01,
8.37332642e+00, 1.10623171e+01, 1.47000085e+01, 1.85952568e+01,
2.32164613e+01, 1.31951608e+01, 1.11852917e+01, 8.62826134e+00])
sns.distplot(hist,binedges)
实验概率分布 empirical probability
- 通过一系列实验或者统计数据得到的概率分布,例如:
- 我在路上站了一天,统计各种不同的车出现的次数,宝马出现 505 次,奔驰 303次,宝骏 1923次,丰田 3532次,捷达 252次;那么我就能够根据统计数据得到实验概率分布
df = pd.DataFrame(columns=['宝马','奔驰','宝骏','丰田','捷达'],data=[[505,303,1923,3532,252]])
plt.bar(x=['宝马','奔驰','宝骏','丰田','捷达'],height=df.iloc[0])
理论概率分布
离散的均匀分布 discrete uniform distribution
二项分布(伯努利分布)Binomial Distribution / Bernoulli distribution
- 一个事件只有两种发生的可能,概率分别是 P P P 和 1 − P 1-P 1−P
- 现在有一个事件,扔 m 次硬币,最终 n 次 正面向上;如果我们统计 m = n 的情况;那么随着扔硬币的次数越多,这个事件的概率分布趋向于正态分布
多项分布(multinomial distribution)
- 有多个独立的结果的事件组成,例如扔一个六面骰子;每个面出现的概率都是 1/6;这就是一个多项分布
高斯分布(normal / Gaussian Distribution)
- 高斯分布通常用来代表噪声连续变量,尤其是噪声类型不知道的情况下,我们通常假设是正态分布的
- 当 μ = 0 , σ = 1 \mu=0, \sigma = 1 μ=0,σ=1 的时候,我们产生的高斯分布叫标准正态分布
概率模型(Probability models)
- 概率模型是通过数学方式来表示随机事件
- 概率模型通常有三部分组成:
- 采样空间:所有可能发生的值 X = x 1 , x 2 , . . . , x n X={x_1,x_2,...,x_n} X=x1,x2,...,xn
- 事件:采样空间的子集 x 1 , x 2 , . . . x_1,x_2,... x1,x2,...
- 关于事件的概率分布 P ( x ) P(x) P(x)
信息熵 Entropy
信息熵的定义
-
信息熵是对不可预测性的一种度量
-
是预测一个事件发生的依据
-
一个独立随机变量 X = x 1 , x 2 , . . . x n X={x_1,x_2,...x_n} X=x1,x2,...xn 的信息熵是:
-
假设扔骰子, P ( x i ) = 1 / 6 P(x_i)=1/6 P(xi)=1/6, 所以 H ( X ) = ( − 1 6 ∗ l o g ( 1 6 ) ) ∗ 6 = 2.5859 b i t H(X)= (-\frac{1}{6}*log(\frac{1}{6}))*6 = 2.5859 bit H(X)=(−61∗log(61))∗6=2.5859bit
-
因此,我们用 2.5859 bit 的信息就可以代表一个骰子的所有情况
-
对于一个二项分布来说, x 1 x_1 x1 事件发生的概率是 P P P 则 x 2 x_2 x2 的概率就是 1 − P 1-P 1−P
-
因此如果我们计算这个二项分布的信息熵:
二项分布的信息熵
# 我们在这里模拟一下 H(X) 的变化情况
Px = np.arange(0,1,0.01)
y = -Px * np.log2(Px)-(1-Px)*(np.log2(1-Px))
plt.plot(Px,y)
plt.xlabel('P(X=x1)')
plt.ylabel('H(X)')
- 从上图我们可以看出,当 P ( x 1 ) = 0.5 P(x1)=0.5 P(x1)=0.5 的时候, H ( X ) H(X) H(X) 表示的信息量最大,能够表示最多 1 b i t 1 bit 1bit 的信息
- 信息熵最小的情况发生在两端,即当一个事件( x 1 x_1 x1 或者 x 2 x_2 x2) 变成确定事件的时候,另外一个也就变成了确定事件,而这个时候,他们就不能够提供任何信息。所以我们可以说 “信息量的大小就是对一个事件不确定性的衡量”
多项分布的信息熵
- 让我们回顾一下上面骰子的例子,因为 6 个面的概率是均等的,因此能够表示这个骰子能表示的最多的信息量 2.5859 b i t 2.5859 bit 2.5859bit 但如果他们每个面的概率不同,他们表示的信息量就会降低,这是显而易见的。
- 扩展一下,当一个随机变量 X X X 拥有 100 个不同的事件,当他们是均匀分布的时候,包含的信息量最大。
信息熵的上限
- 对于一个只有两种可能结果的系统,信息熵取值范围为 0-1
- 对于一个有
N
N
N 种可能结果的系统,信息熵取值范围为 0-
l
o
g
2
(
N
)
log_2(N)
log2(N)
信息熵和信息编码
字母编码
- 我们对大英图书馆中所有的书进行统计,里面的字符的概率分布如上图所示;
- 26 个英文字母能够包含的最大信息量是 4.7 bit(当所有字母等可能出现)
- 但是根据实际情况,他们的 entropy 实际上是 4.14 bit
- 因此实际上只用 2 4.14 = 17.63 2^{4.14}=17.63 24.14=17.63 个不同的字母就可以对现在的系统重新编码
图像编码
- 如何使用有限的带宽资源来传输更多的信息?