概率和高斯贝叶斯算法
1. 概率和数理统计
- 辅助建模,建模思想
- model
- 高斯贝叶斯算法
1.1 概率的概念
- probability 固有属性
- frequency 频率代替
- 实验次数越来越多,频率就接近概率
- 实战中:数据量很大,概率直接拿频率来代替即可
- 非负性:P(A) ≥ 0
- 规范性:P(A) + P(B) + P(C ) … = 1
1.2 如何计算概率
- 离散型变量
- 在有限个状态中选择一个:
- 交通灯:红色,绿色,黄色
- 性别:男,女,未知
- 鸢尾花:1,2,3
- zero index 编码:
- 1,2,3,4, … , N-1
- 编码本身有大小,但是这个大小并没有数学内涵,
- one hot 编码:
- 0:[1, 0, 0, 0, 0, …]
- 1:[0, 1, 0, 0, 0, …]
- 2:[0, 0, 1, 0, 0, …]
- 采样:[1, 2, 2, 2, 2, 3, 1, 1]
- 概率:
- P(1) = 3 / 8
- P(2) = 4 / 8
- P(3) = 1 / 8
- 先验概率:
- 在有限个状态中选择一个:
- 连续量:
-
有无数个采样结果
-
[0, 1]
- 严格意义上,对于连续量的某个单点,比如 0.6,这个点的概率是 0 。
- 连续量的概率是概率密度函数的积分,单点的积分上下限是 0 。
-
人工智能是纯理论数学的工程化简。
-
概率密度函数: PDF (Probability Density Function)
- 概率密度函数是概率的导函数
- 概率是概率密度函数的积分
-
高斯分布(正态分布)
f ( x ) = 1 2 π σ e x p − ( x − μ ) 2 2 σ 2 f(x) = \frac{1}{\sqrt{2\pi}\sigma} exp^{-\frac{(x-\mu)^2}{2\sigma^2}} f(x)=2πσ1exp−2σ2(x−μ)2 -
模型中对概率的使用
- 重在比较概率的大小,而不是概率的具体数值是多少。
- 所以比较大小可以使用概率密度函数的值来代替即可。
-
采样:[1, 2, 2, 2, 2, 3, 1, 1] 假定这是一个连续分布
-
工程化简:假定其是高斯分布即可!
- 化简之后计算得到的概率结果并不是真实概率,但是可以用于比较大小即可。
logits = np.array([1,2,2,2,2,3,1,1]) mu = logits.mean() sigma = logits.std() P1 = gaussian(x=1,mu=mu,sigma=sigma) P2 = gaussian(x=2,mu=mu,sigma=sigma) P3 = gaussian(x=3,mu=mu,sigma=sigma)
-
1.3 条件概率
- 有前提条件的概率:
- 例子: {李1,李2,李3,王1,王2,刘1} 六个人竞选村长,姓李的当选了,李1当选的概率就是 1 / 3 1/3 1/3
- P(A): A发生的概率。
- P(A|B): 在B发生的条件下,A发生的概率。
- 应对策略:根据条件,重新划分样本空间,将不满足的干掉,然后在计算概率。
- P ( A ∣ B ) = P ( A B ) / P ( B ) P(A|B) = P(AB) / P(B) P(A∣B)=P(AB)/P(B)
- P ( B ∣ A ) = P ( A B ) / P ( A ) P(B|A) = P(AB) / P(A) P(B∣A)=P(AB)/P(A)
- P ( A ∣ B ) P ( B ) = P ( B ∣ A ) P ( A ) P(A|B)P(B) = P(B|A) P(A) P(A∣B)P(B)=P(B∣A)P(A)
- P ( A ∣ B ) = P ( B ∣ A ) P ( A ) / P ( B ) P(A|B) = P(B|A) P(A)/ P(B) P(A∣B)=P(B∣A)P(A)/P(B)
- 贝叶斯
- X: 一个输入样本的特征[x1,x2,x3…]
- y0: 第0类; y1: 第1类; y2: 第2类 …
- P ( y 0 ∣ X ) = P ( X ∣ y 0 ) P ( y 0 ) / P ( X ) — P ( X ∣ y 0 ) P ( y 0 ) — P ( x 1 , x 2 , x 3... ∣ y 0 ) P ( y 0 ) — P ( x 1 ∣ y 0 ) P ( x 2 ∣ y 0 ) P ( x 3 ∣ y 0 ) . . . P ( x N ∣ y 0 ) P ( y 0 ) P(y0|X) = P(X|y0) P(y0)/ P(X) — P(X|y0) P(y0) — P(x1,x2,x3...|y0) P(y0) — P(x1|y0) P(x2|y0)P(x3|y0)...P(x_N|y0)P(y0) P(y0∣X)=P(X∣y0)P(y0)/P(X)—P(X∣y0)P(y0)—P(x1,x2,x3...∣y0)P(y0)—P(x1∣y0)P(x2∣y0)P(x3∣y0)...P(xN∣y0)P(y0)
- P ( y 1 ∣ X ) = P ( X ∣ y 1 ) P ( y 1 ) / P ( X ) — P ( X ∣ y 1 ) P ( y 1 ) — P ( x 1 , x 2 , x 3... ∣ y 1 ) P ( y 1 ) — P ( x 1 ∣ y 1 ) P ( x 2 ∣ y 1 ) P ( x 3 ∣ y 1 ) . . . P ( x N ∣ y 1 ) P ( y 1 ) P(y1|X) = P(X|y1) P(y1)/ P(X) — P(X|y1) P(y1) — P(x1,x2,x3...|y1) P(y1) — P(x1|y1) P(x2|y1)P(x3|y1)...P(x_N|y1)P(y1) P(y1∣X)=P(X∣y1)P(y1)/P(X)—P(X∣y1)P(y1)—P(x1,x2,x3...∣y1)P(y1)—P(x1∣y1)P(x2∣y1)P(x3∣y1)...P(xN∣y1)P(y1)
- P ( y 2 ∣ X ) = P ( X ∣ y 2 ) P ( y 2 ) / P ( X ) — P ( X ∣ y 2 ) P ( y 2 ) — P ( x 1 , x 2 , x 3... ∣ y 2 ) P ( y 2 ) — P ( x 1 ∣ y 2 ) P ( x 2 ∣ y 2 ) P ( x 3 ∣ y 2 ) . . . P ( x N ∣ y 2 ) P ( y 2 ) P(y2|X) = P(X|y2) P(y2)/ P(X) — P(X|y2) P(y2) — P(x1,x2,x3...|y2) P(y2) — P(x1|y2) P(x2|y2)P(x3|y2)...P(x_N|y2)P(y2) P(y2∣X)=P(X∣y2)P(y2)/P(X)—P(X∣y2)P(y2)—P(x1,x2,x3...∣y2)P(y2)—P(x1∣y2)P(x2∣y2)P(x3∣y2)...P(xN∣y2)P(y2)
2. 基本统计量(均值、方差、标准差、协方差、皮尔逊相关系数)
- 均值:加起来,除以个数
- 方差:一列数据的离散情况
- 求均值
- 求每个数跟均值的差
- 把差取平方
- 再把平方取均值
- 标准差:
- 方差开平方
- 协方差:
- 考察两列数据的变化趋势是否相同
-
C
o
v
a
r
i
a
n
c
e
=
E
(
(
X
−
E
(
X
)
)
∗
(
Y
−
E
(
Y
)
)
)
Covariance = E((X-E(X)) * (Y-E(Y)))
Covariance=E((X−E(X))∗(Y−E(Y)))
- E : 期望 (平均值)
- Covariance : 协方差
- 皮尔逊相关系数(Pearson correlation coefficient)
- 把 协方差标准化 就变成了 皮尔逊相关系数,他能更清楚明了的表达相关程度。
- $$ Covariance / $
- 皮尔逊相关系数的区间是:[-1, 1]
- -1: 严格负相关
- 1:严格正相关
- 0:不相关
- 工作
- 均值大,方差小
- 均值大,方差大:认可你的努力
3. 代码
3.1 加载鸢尾花数据,计算每种花的概率
from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)
P_y0 = (y==0).mean()
P_y1 = (y==1).mean()
P_y2 = (y==2).mean()
print(P_y0,P_y1,P_y2)
输出:0.3333333333333333 0.3333333333333333 0.3333333333333333
3.2 高斯分布定义及画图
import numpy as np
from matplotlib import pyplot as plt
# 高斯分布 (正态分布,概率密度函数)
def gaussian(x, mu=0, sigma=1):
"""
x:随机变量
mu: 均值 控制图形左右移动
sigma: 标准差 控制图形胖瘦
"""
return 1 / np.sqrt(2*np.pi)/sigma*np.exp(-(x-mu)**2/2/sigma**2)
x = np.linspace(start=-5,stop=5,num=100)
plt.plot(x, gaussian(x,mu=0,sigma=1),label="$\mu=0,\sigma=1$")
plt.plot(x, gaussian(x,mu=1,sigma=1),label="$\mu=1,\sigma=1$")
plt.plot(x, gaussian(x,mu=0,sigma=2),label="$\mu=0,\sigma=2$")
plt.grid()
plt.legend()
输出:
3.3 高斯贝叶斯预测鸢尾花
# 加载数据
from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)
# 切分数据
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
# 加载模型:高斯贝叶斯(天真的贝叶斯)
from sklearn.naive_bayes import GaussianNB
# 构建模型
gnb = GaussianNB()
# 训练模型
gnb.fit(X=X_train,y=y_train)
# 测试模型
y_pred = gnb.predict(X = X_test)
print(y_pred)
acc = (y_test==y_pred).mean()
print(acc)
输出:
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 1 1 1 2 0 2 0 0]
1.0
3.4 计算协方差
X = np.array([1,3,5,7,9])
Y = np.array([2,4,6,8,10])
Z = Y[::-1]
# 严格正相关
X_Y = ((X-X.mean()) * (Y-Y.mean())).mean()/X.std()/Y.std()
# 严格负相关
X_Z = ((X-X.mean()) * (Z-Z.mean())).mean()/X.std()/Z.std()
print(X_Y,X_Z)
0.9999999999999999 -0.9999999999999999
X = np.random.randint(0,101,100)
Y = np.random.randint(0,101,100)
# 随机生成的两组数据就没啥相关关系了,所以皮尔逊相关系数(协方差归一化)接近0
X_Y = ((X-X.mean()) * (Y-Y.mean())).mean()/X.std()/Y.std()
print(X_Y)
0.05746974673284489