主要内容:
1.Matplotlib 快速学习
(1)在一张图形上进行多次绘图
调用了初始的整体分布函数,但我们还想添加另外一个正态分布,它的均值是1.0,标准差是 0.5。然后,将它们同时显示出来,以便进行彼此之间的比较。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x=np.arange(-3,3,0.001)
plt.plot(x,norm.pdf(x))
plt.plot(x,norm.pdf(x,1.0,0.5))
plt.show()
(2)将图形保存为文件
plt.savefig('Myplot',format='png')
(3)调整坐标轴
首先使用 plt.axes 获取坐标轴,调用 set_xlim,将 x 轴的范围设定为从–5 到 5,调用 set_ylim,将 y 轴的范围设定为从 0 到 1,使用 set_xticks()和 set_yticks()函数将 x 轴的刻度设定为–5、–4、–3 等,将 y 轴的刻度设定为从 0 到 1,增量为 0.1。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x=np.arange(-3,3,0.001)
axes = plt.axes() #获取坐标轴
axes.set_xlim([-5,5]) #x轴范围为-5到5
axes.set_ylim([0, 1.0]) #y轴范围为0到1
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) #设置x轴的刻度
axes.set_yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) #设置y轴的刻度
plt.plot(x, norm.pdf(x))
plt.plot(x, norm.pdf(x, 1.0, 0.5))
plt.show()
(4)添加网格
先使用 plt.axes()获取坐标轴对象,然后对 axes 调用grid()函数即可。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x=np.arange(-3,3,0.001)
axes = plt.axes() #获取坐标轴
axes.set_xlim([-5,5]) #x轴范围为-5到5
axes.set_ylim([0, 1.0]) #y轴范围为0到1
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) #设置x轴的刻度
axes.set_yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) #设置y轴的刻度
axes.grid() #添加网格
plt.plot(x, norm.pdf(x))
plt.plot(x, norm.pdf(x, 1.0, 0.5))
plt.show()
(5)修改线型和颜色
在第一个 plot()函数中,b-表示使用一条蓝色实线,b 表示蓝色,短划线表示实线。在第二个 plot()函数中,r 表示红色,冒号表示虚线,所以是一条红色虚线。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x=np.arange(-3,3,0.001)
axes = plt.axes() #获取坐标轴
axes.set_xlim([-5,5]) #x轴范围为-5到5
axes.set_ylim([0, 1.0]) #y轴范围为0到1
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) #设置x轴的刻度
axes.set_yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) #设置y轴的刻度
axes.grid() #添加网格
plt.plot(x, norm.pdf(x),'b-')
plt.plot(x, norm.pdf(x, 1.0, 0.5),'r:')
plt.show()
r - -表示红色虚线
plt.plot(x, norm.pdf(x, 1.0, 0.5),'r--')
plt.plot(x, norm.pdf(x, 1.0, 0.5),'r-.')
(6)标记坐标轴并添加图例
,可以使用 plt 的 xlabel()和 ylabel()函数在坐标轴上添加标签。我们将 x 轴标记为Greebles,将 y 轴标记为 Probability。第一条曲线的名称为 Sneetches,第二条曲线的名称为Gacks,loc 参数表示图例的位置,1表示右上角,2表示左上角,3表示左下角,4 表示右下角。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x=np.arange(-3,3,0.001)
axes = plt.axes() #获取坐标轴
axes.set_xlim([-5,5]) #x轴范围为-5到5
axes.set_ylim([0, 1.0]) #y轴范围为0到1
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) #设置x轴的刻度
axes.set_yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) #设置y轴的刻度
axes.grid() #添加网格
plt.xlabel('Greebles')
plt.ylabel('Probability')
plt.plot(x, norm.pdf(x),'b-')
plt.plot(x, norm.pdf(x, 1.0, 0.5),'r-.')
plt.legend(['Sneetches','Gacks'],loc=4)
plt.show()
(7)生成饼图
如果想生成饼图,只需调用 plt.pie 函数,并且设定好数值、颜色、标记这些参数数组,以及是否凸出显示和凸出的程度。
import matplotlib.pyplot as plt
values=[12,45,32,6,78]
colors=['red','black','blue','green','yellow']
labels = ['India', 'United States', 'Russia', 'China', 'Europe']
plt.pie(values, colors= colors, labels=labels)
plt.title('Student Locations')
plt.show()
explode = [0, 0, 0.2, 0, 0]表示将绿色部分凸显出来
import matplotlib.pyplot as plt
values=[12,45,32,6,78]
colors=['r','b','g','grey','y']
explode = [0, 0, 0.2, 0, 0]
labels = ['India', 'United States', 'Russia', 'China', 'Europe']
plt.pie(values, colors= colors, labels=labels, explode = explode)
plt.title('Student Locations')
plt.show()
(8)生成条形图
首先定义一个数值数组和一个颜色数组,然后绘制数据。上面代码绘制的图形范围是从0 到 5,y 值来自于 values 数组,并使用 colors 数组中的值来明确指定颜色。
import matplotlib.pyplot as plt
values = [12, 55, 4, 32, 14]
colors = ['r', 'g', 'b', 'c', 'm']
plt.bar(range(0,5),values,color=colors)
plt.show()
(9)生成散点图
绘制散点图的方法是使用 plt.scatter()函数,两个坐标轴分别定义为你要绘制出彼此关系的两个属性。从图中可以看出,数据有向中心集中的趋势,因为两个坐标轴上使用的都是正态分布。由于数据是随机的,因此 X 和 Y 之间没有相关性。
from pylab import randn
import matplotlib.pyplot as plt
x=randn(500)
y=randn(500)
plt.scatter(x,y)
plt.show()
(10)生成直方图
调用 pyplot 的直方图函数 hist(),并指定了在直方图中数据分组的数量。最后,调用show()函数显示出图形。
import numpy as np
import matplotlib.pyplot as plt
x=np.random.normal(170,50,1000)
plt.hist(x,50)
plt.show()
2.协方差和相关系数
协方差和相关系数为我们提供了一种衡量事物之间联系紧密程度的手段。
(1)协方差:协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
如果协方差接近于 0,就说明两个变量之间没有什么相关性,但是如果协方差非常大,则意味着变量之间是相关的。
(2)相关系数:相关系数是最早由统计学家卡尔·皮尔逊设计的统计指标,是研究变量之间线性相关程度的量,一般用字母 r 表示。由于研究对象的不同,相关系数有多种定义方式,较为常用的是皮尔逊相关系数。
相关系数通过每个属性的标准差实现了归一化(就是用协方差除以两个变量的标准差,实现归一化)。
通过归一化,我们可以明确地说,相关系数为–1 表示完全负相关,即当一个属性的值增加时,另一个属性的值减少,反之亦然。相关系数为 0 表示两组属性没有相关性。相关系数为1 表示完全相关,即两个属性在不同数据点之间按照完全一样的方式进行变化。
(3)在python中计算相关系数——基本方法
这两个属性除了都是随机的和服从正态分布之外,没有什么相关性。如果计算出这两个属性的协方差,肯定是个非常小的值,果然,是0.15211014702947728。所以,协方差非常小,
接近于 0。这说明二者之间没有真正的联系。
from pylab import *
def de_mean(x):
xmean = mean(x) # 求均值
return [xi - xmean for xi in x] # 求出每一个与均值之差返回列表
def covariance(x, y):
n = len(x)
return dot(de_mean(x), de_mean(y)) / (n - 1) #求出协方差
x = np.random.normal(3.0, 1.0, 1000) # 生成可迭代对象
y = np.random.normal(50.0, 10.0, 1000)
print(covariance(x, y)) #协方差:0.15211014702947728
plt.scatter(x, y) # 生成散点图
plt.show()
如果计算出协方差,就会得到一个非常大的值,即-9.624751812848746。数值的大小非常重要,符号的正负表示的是正相关还是负相关。-9.624751812848746 这个值比 0 大得多,所以我们发现了一些问题,但还是难以解释 8 具体意味着什么。
from pylab import *
def de_mean(x):
xmean = mean(x) # 求均值
return [xi - xmean for xi in x] # 求出每一个与均值之差返回列表
def covariance(x, y):
n = len(x)
return dot(de_mean(x), de_mean(y)) / (n - 1) #求出协方差
pageSpeeds = np.random.normal(3.0, 1.0, 1000)
purchaseAmount = np.random.normal(50.0, 10.0, 1000) / pageSpeeds
print(covariance(purchaseAmount,pageSpeeds)) #-9.624751812848746
plt.scatter(pageSpeeds,purchaseAmount)
plt.show()
这就是引入相关系数的原因,即它通过标准差将协方差进行了归一化。
先计算出每组属性的标准差,再计算出二者之间的协方差,然后用协方差除以两个标准差,就可以计算出相关系数的值,而且这个值被归一化到–1 和 1 之间。我们计算出这个值是-0.4,表示两组属性之间存在一定程度的负相关。
这不是一条直线,如果是直线的话,相关系数应该为–1,但确实存在相关性。
相关系数为–1 表示完全负相关,0 表示不存在相关性,1 表示完全正相关。
from pylab import *
def de_mean(x):
xmean = mean(x) # 求均值
return [xi - xmean for xi in x] # 求出每一个与均值之差返回列表
def covariance(x, y):
n = len(x)
return dot(de_mean(x), de_mean(y)) / (n - 1) #求出协方差
#相关系数
def correlation(x, y):
corx=x.std() #求标准差
cory=y.std()
return covariance(x,y)/corx/cory
pageSpeeds = np.random.normal(3.0, 1.0, 1000)
purchaseAmount = np.random.normal(50.0, 10.0, 1000) / pageSpeeds
print(correlation(pageSpeeds,purchaseAmount))
#-0.4167069137470847
(4) python计算相关系数——使用 NumPy
在 NumPy 中,可以使用 corrcoef()函数来计算相关系数。
import numpy as np
import matplotlib.pyplot as plt
from pylab import mean,dot
def de_mean(x):
xmean = mean(x) # 求均值
return [xi - xmean for xi in x] # 求出每一个与均值之差返回列表
def covariance(x, y):
n = len(x)
return dot(de_mean(x), de_mean(y)) / (n - 1) #求出协方差
#在Numpy可以使用np.corrcoef(x,y)求出相关系数
pageSpeeds = np.random.normal(3.0, 1.0, 1000)
purchaseAmount = 100-pageSpeeds*3
print(np.corrcoef(pageSpeeds,purchaseAmount))
plt.scatter(purchaseAmount,pageSpeeds)
plt.show()
'''
[[ 1. -1.]
[-1. 1.]]
'''
numpy.cov()函数,这是使用 NumPy 计算协方差的方法。
import numpy as np
import matplotlib.pyplot as plt
#在Numpy可以使用np.corrcoef(x,y)求出相关系数
#np.cov(x,y)求出协方差
pageSpeeds = np.random.normal(3.0, 1.0, 1000)
purchaseAmount = 100-pageSpeeds*3
print(np.cov(purchaseAmount,pageSpeeds))
'''
[[ 9.85396536 -3.28465512]
[-3.28465512 1.09488504]]
'''
print(np.corrcoef(pageSpeeds,purchaseAmount))
'''
[[ 1. -1.]
[-1. 1.]]
'''
plt.scatter(purchaseAmount,pageSpeeds)
plt.show()
3.条件概率
条件概率是一种测量两个同时发生的事情之间关系的方法。如果想找出一个事件在另一个事件已经发生的情况下发生的概率,就可以使用条件概率。
使用条件概率要解决的问题是:如果两个事件是互相依赖的,那么它们同时发生的概率是多少?
P(A, B)表示 A 和 B 在彼此独立的情况下同时发生的概率,也就是说,两个事件在不考虑其他因素时同时发生的概率。
P(B|A)读作给定 A 时 B 的概率。那么在事件 A 已经发生的情况下,事件 B 发生的概率到底是多少呢?这和上面的概率有点区别,它们之间的联系如下。
(1)Python 中的条件概率练习
附加:np.random.seed(0)表示种子相同,这个可以产生相同的随机数。
import numpy as np
np.random.seed(0)
x = np.random.randn(2,2)
np.random.seed(0)
y = np.random.randn(2,2)
print(x)
print(y)
'''
[[1.76405235 0.40015721]
[0.97873798 2.2408932 ]]
[[1.76405235 0.40015721]
[0.97873798 2.2408932 ]]
'''
np.random.random( )接收一个单独的元组,而random.rand( )接收分开的参数,参数传递不同,但两个函数都是在 [0, 1) 的均匀分布中产生随机数。要生成3行5列的数组,可以np.random.rand(3, 5)或者np.random.random((3, 5))
使用这些数据来说明一下条件概率的概念,找出 30 岁年龄组的人购买该产品的概率。令购买事件为 E,位于 30 岁年龄组这个事件为 F,那么这个概率可以表示为 P(E|F)。
E与F的联合概率表示为P(EF)或者P(E,F),或者P(E∩F)。
求出两件事情同时发生的概率,就可以将这两个概率相乘。所以P(E, F)就是 P(E)P(F)。
要验证一下 P(E|F) = P(E, F)/P(F)。
import numpy as np
np.random.seed(0)
totals={20:0,30:0,40:0,50:0,60:0,70:0}
purchases={20:0,30:0,40:0,50:0,60:0,70:0}
totalPurchases=0
for i in range(100000):
ageDecade=np.random.choice([20,30,40,50,60,70])
#计算一下不同年龄段的购买概率
purchaseProbability=float(ageDecade)/100.0
# 求出这100000人中20,30,40,50,60,70岁人数的随机分布情况
# {50: 16805, 20: 16576, 70: 16704, 40: 16632, 60: 16664, 30: 16619}
totals[ageDecade]+=1
if np.random.random()<purchaseProbability:
purchases[ageDecade]+=1
totalPurchases+=1
# print(totals)
# print(purchases)
# print(totalPurchases)
#要找出当你位于 30 岁年龄组时,购买某种产品的概率
PEF=float(purchases[30])/float(totals[30])
#不考虑年龄时购买该商品的概率
PE=float(purchases[30])/100000.0
#某个人是 30 多岁的概率
PF=float(totals[30])/100000.0
# 求出两件事情同时发生的概率,就可以将这两个概率相乘。所以
# P(E, F)就是 P(E)P(F)。
if PEF==(PE/PF):
print(PEF)
print(PE / PF)
print('P(E|F) = P(E,F)/PF 验证正确!')
# 0.29929598652145134
# 0.29929598652145134
# P(E|F) = P(E,F)/PF 验证正确!
4.贝叶斯定理
贝叶斯定理可以简单表述如下:给定 B 时 A 的概率等于 A 的概率乘以给定 A 时 B 的概率再除以 B 的概率。可以将 A 和 B 替换为任意事件。