##
相关系数矩阵 |
通常,样本是由多维特征的构成的,把每个特征维度都看成一个随机变量,为了考查两两特征间的关系,可以借助 随机变量的协方差。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtJafW4N-1683965092591)(//img-blog.csdn.net/20180320174526151?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
协方差是对两个随机变量联合分布线性相关程度的一种度量。
c o v ( X i , X j ) = E [ ( X i − E ( X i ) ) ( X j − E ( X j ) ) ] v a r ( X i ) = E [ ( X i − E ( X i ) ) 2 ] v a r ( X j ) = E [ ( X j − E ( X j ) ) 2 ] cov(X_i,X_j)=E[(X_i-E(X_i))(X_j-E(X_j))]\\ var(X_i)=E[(X_i-E(X_i))^2]\\ var(X_j)=E[(X_j-E(X_j))^2] cov(Xi,Xj)=E[(Xi−E(Xi))(Xj−E(Xj))]var(Xi)=E[(Xi−E(Xi))2]var(Xj)=E[(Xj−E(Xj))2]
由于随机变量的取值范围不同,没有可比性,对其进行归一化处理,得到相关系数
η = c o v ( X i , X j ) v a r ( X i ) ⋅ v a r ( X j ) \eta=\frac{cov(X_i,X_j)}{\sqrt{var(X_i)\cdot var(X_j)}} η=var(Xi)⋅var(Xj)cov(Xi,Xj)
其中, ∣ η ∣ ≤ 1 |\eta|\leq1 ∣η∣≤1: 1 1 1表示随机变量 X i X_i Xi和 X j X_j Xj完全线性正相关; − 1 -1 −1表示随机变量 X i X_i Xi和 X j X_j Xj完全线性负相关; 0 0 0表示随机变量 X i X_i Xi和 X j X_j Xj线性无关,但是线性无关并不代表完全无关。
样本(共
m
m
m个)随机变量
X
=
[
X
1
,
X
2
,
⋯
,
X
n
]
T
X=[X_1,X_2,\cdots,X_n]^T
X=[X1,X2,⋯,Xn]T,第
k
k
k个样本为
{
x
k
.
=
[
x
k
1
,
x
k
2
,
⋯
,
x
k
n
]
T
∣
1
≤
k
≤
m
}
\{x_{k.}=[x_{k1},x_{k2},\cdots,x_{kn}]^T|1\leq k\leq m\}
{xk.=[xk1,xk2,⋯,xkn]T∣1≤k≤m}。则任意两个维度特征的协方差为
c
o
v
(
X
i
,
X
j
)
=
∑
k
=
1
m
(
x
k
i
−
x
.
i
‾
)
(
x
k
j
−
x
.
j
‾
)
m
−
1
\displaystyle cov(X_i,X_j)=\frac{\sum\limits_{k=1}^m(x_{ki}-\overline{x_{.i}})(x_{kj}-\overline{x_{.j}})}{m-1}
cov(Xi,Xj)=m−1k=1∑m(xki−x.i)(xkj−x.j)
分母是
m
−
1
m-1
m−1是因为随机变量的数学期望未知,用“样本均值”代替,自由度减1。
###利用numpy的corrcoef可以计算关系矩阵
np.corrcoef(a)可计算行与行之间的相关系数
np.corrcoef(a,rowvar=0)用于计算列与列之间的相关系数
import numpy as np
a=np.array([[1, 1, 2, 2, 3],
[2, 2, 3, 3, 5],
[1, 4, 2, 2, 3]])
a
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBz4g46X-1683965092592)(//img-blog.csdn.net/20180320175734719?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
np.corrcoef(a)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Es6pFJXi-1683965092593)(//img-blog.csdn.net/2018032017574239?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
np.corrcoef(a,rowvar=0)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjkH7CD4-1683965092594)(//img-blog.csdn.net/20180320175750803?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
应用公式0.5*value+0.5可以将相关系数矩阵的值域由[-1,1]映射为[0,1]
np.corrcoef(a,rowvar=0)*0.5+0.5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPG1cQ1i-1683965092595)(//img-blog.csdn.net/20180320175844902?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
##
热力图 |
利用热力图可以看数据表里多个特征两两的相似度。参考官方API参数及地址:
## seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt=‘.2g’, annot_kws=None, linewidths=0, linecolor=‘white’, cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels=‘auto’, yticklabels=‘auto’, mask=None, ax=None, **kwargs)
http://seaborn.pydata.org/generated/seaborn.heatmap.html#seaborn.heatmap
热力图输入数据参数:
data:矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则df的index/column信息会分别对应到heatmap的columns和rows,即pt.index是热力图的行标,pt.columns是热力图的列标
热力图矩阵块颜色参数:
vmax,vmin:分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定
cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;改参数默认值:根据center参数设定
center:数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变
robust:默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定
热力图矩阵块注释参数:
annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据
fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字
annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置;官方文档:https://matplotlib.org/api/text_api.html#matplotlib.text.Text
热力图矩阵块之间间隔及间隔线参数:
linewidths:定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小
linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是’white’
热力图颜色刻度条参数:
cbar:是否在热力图侧边绘制颜色刻度条,默认值是True
cbar_kws:热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None
cbar_ax:热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None
square:设置热力图矩阵小块形状,默认值是False
xticklabels, yticklabels:xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。 如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出
mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉
ax:设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值
**kwargs:All other keyword arguments are passed to ax.pcolormesh
###首先造一个数据表:
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline
region = ['Azerbaijan','Bahamas', 'Bangladesh', 'Belize', 'Bhutan',
'Cambodia', 'Cameroon', 'Cape Verde', 'Chile', 'China'] #10个
kind = ['Afforestation & reforestation', 'Biofuels', 'Biogas', 'Biomass', 'Cement'] #5个
np.random.seed(20180316)
arr_region = np.random.choice(region, size=(200,))
list_region = list(arr_region)
arr_kind = np.random.choice(kind, size=(200,))
list_kind = list(arr_kind)
values = np.random.randint(100, 200, 200)
list_values = list(values)
df = pd.DataFrame({'region':list_region,'kind': list_kind,'values':list_values})
df
df['kind'].value_counts()
###将DataFrame数据表转化成“数据透视表”
import pandas as pd
pt = df.pivot_table(index='kind', columns='region', values='values', aggfunc=np.sum) #数据透视表
pt #index是行,columns是列,values是表中展示的数据,aggfunc是表中展示每组数据使用的运算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUwGKWHo-1683965092596)(//img-blog.csdn.net/20180316100449681?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
####热力图矩阵块颜色参数
#cmap(颜色)
import matplotlib.pyplot as plt
% matplotlib inline
f, (ax1,ax2) = plt.subplots(figsize = (6,4),nrows=2)
# cmap用cubehelix map颜色
cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)
sns.heatmap(pt, linewidths = 0.05, ax = ax1, vmax=900, vmin=0, cmap=cmap)
ax1.set_title('cubehelix map')
ax1.set_xlabel('')
ax1.set_xticklabels([]) #设置x轴图例为空值
ax1.set_ylabel('kind')
# cmap用matplotlib colormap
sns.heatmap(pt, linewidths = 0.05, ax = ax2, vmax=900, vmin=0, cmap='rainbow')
# rainbow为 matplotlib 的colormap名称
ax2.set_title('matplotlib colormap')
ax2.set_xlabel('region')
ax2.set_ylabel('kind')
#center的用法(颜色)
f, (ax1,ax2) = plt.subplots(figsize = (6, 4),nrows=2)
cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)
sns.heatmap(pt, linewidths = 0.05, ax = ax1, cmap=cmap, center=None )
ax1.set_title('center=None')
ax1.set_xlabel('')
ax1.set_xticklabels([]) #设置x轴图例为空值
ax1.set_ylabel('kind')
# 当center设置小于数据的均值时,生成的图片颜色要向0值代表的颜色一段偏移
sns.heatmap(pt, linewidths = 0.05, ax = ax2, cmap=cmap, center=200)
ax2.set_title('center=3000')
ax2.set_xlabel('region')
ax2.set_ylabel('kind')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SbUmrad-1683965092597)(//img-blog.csdn.net/20180316100623961?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2N5bXkwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
#robust的用法(颜色)
f, (ax1,ax2) = plt.subplots(figsize = (6,4),nrows=2)
cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)
sns.heatmap(pt, linewidths = 0.05, ax = ax1, cmap=cmap, center=None, robust=False )
ax1.set_title('robust=False')
ax1.set_xlabel('')
ax1.set_xticklabels([]) #设置x轴图例为空值
ax1.set_ylabel('kind')
sns.heatmap(pt, linewidths = 0.05, ax = ax2, cmap=cmap, center=None, robust=True )
ax2.set_title('robust=True')
ax2.set_xlabel('region')
ax2.set_ylabel('kind')
###热力图矩阵块注释参数
#annot(矩阵上数字),annot_kws(矩阵上数字的大小颜色字体)matplotlib包text类下的字体设置
import numpy as np
np.random.seed(20180316)
x = np.random.randn(4, 4)
f, (ax1, ax2) = plt.subplots(figsize=(6,6),nrows=2)
sns.heatmap(x, annot=True, ax=ax1)
sns.heatmap(x, annot=True, ax=ax2, annot_kws={'size':9,'weight':'bold', 'color':'blue'})
# Keyword arguments for ax.text when annot is True. http://stackoverflow.com/questions/35024475/seaborn-heatmap-key-words
#fmt(字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字)
import numpy as np
np.random.seed(0)
x = np.random.randn(4,4)
f, (ax1, ax2) = plt.subplots(figsize=(6,6),nrows=2)
sns.heatmap(x, annot=True, ax=ax1)
sns.heatmap(x, annot=True, fmt='.1f', ax=ax2)
###热力图矩阵块之间间隔及间隔线参数
#linewidths(矩阵小块的间隔),linecolor(切分热力图矩阵小块的线的颜色)
import matplotlib.pyplot as plt
f, ax = plt.subplots(figsize = (6,4))
cmap = sns.cubehelix_palette(start = 1, rot = 3, gamma=0.8, as_cmap = True)
sns.heatmap(pt, cmap = cmap, linewidths = 0.05, linecolor= 'red', ax = ax)
ax.set_title('Amounts per kind and region')
ax.set_xlabel('region')
ax.set_ylabel('kind')
#xticklabels,yticklabels横轴和纵轴的标签名输出
import matplotlib.pyplot as plt
f, (ax1,ax2) = plt.subplots(figsize = (5,5),nrows=2)
cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)
p1 = sns.heatmap(pt, ax=ax1, cmap=cmap, center=None, xticklabels=False)
ax1.set_title('xticklabels=None',fontsize=8)
p2 = sns.heatmap(pt, ax=ax2, cmap=cmap, center=None, xticklabels=2, yticklabels=list(range(5)))
ax2.set_title('xticklabels=2, yticklabels is a list',fontsize=8)
ax2.set_xlabel('region')
#mask对某些矩阵块的显示进行覆盖
f, (ax1,ax2) = plt.subplots(figsize = (5,5),nrows=2)
cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)
p1 = sns.heatmap(pt, ax=ax1, cmap=cmap, xticklabels=False, mask=None)
ax1.set_title('mask=None')
ax1.set_ylabel('kind')
p2 = sns.heatmap(pt, ax=ax2, cmap=cmap, xticklabels=True, mask=(pt<800))
#mask对pt进行布尔型转化,结果为True的位置用白色覆盖
ax2.set_title('mask: boolean DataFrame')
ax2.set_xlabel('region')
ax2.set_ylabel('kind')
####用mask实现:突出显示某些数据
f,(ax1,ax2) = plt.subplots(figsize=(4,6),nrows=2)
x = np.array([[1,2,3],[2,0,1],[-1,-2,0]])
sns.heatmap(x, annot=True, ax=ax1)
sns.heatmap(x, mask=x < 1, ax=ax2, annot=True, annot_kws={"weight": "bold"}) #把小于1的区域覆盖掉
扫码关注公众号:瑞行AI,欢迎交流AI算法、数据分析等技术,提供技术方案咨询和就业指导服务!