数据挖掘05-偏相关分析【原理、案例、python实现】

人工智能28

数据挖掘05-偏相关分析【原理、案例、python实现】

*
- 一、需求场景
- 二、偏相关分析简介
-
+ 2.1 引入偏相关分析的原因
+ 2.2 什么是偏相关分析
+ 2.3 偏相关分析的步骤
+
* (1)计算样本的偏相关系数
* (2)对上一步求得的偏相关系数进行检验
- 三、【案例分析】行驶里程与影响因素的偏相关分析
-
+ 3.1 速度
+ 3.2 温度
+ 3.3 电压
+ 3.4 总电流
+ 3.5 小结
- 四、python偏相关分析
-
+ 4.1 数据源
+ 4.2 pandas
+
* 4.2.1 一阶相关系数
* 4.2.2 pcorr()
+ 4.3 numpy
+ 4.4 sicpy
+ 4.5 自己写公式

参考资料:
基于数据驱动的电动汽车行驶里程模型建立与分析
python怎么计算相关系数、偏相关系数?
利用PYTHON计算偏相关系数(Partial correlation coefficient)

一、需求场景

新能源电动车剩余里程预测

众所周知,影响续航里程的因素很多,包括电池的剩余电量、电池性能(电池组的总放电电压、电池组的不一致性、单电压、电池组的内阻)、车辆参数、车辆载荷、车辆行驶特性和温度。

[En]

As we all know, there are many factors that affect the mileage, including the remaining charge of the battery, battery performance (total discharge voltage of the battery pack, inconsistency of the battery pack, single voltage, internal resistance of the battery pack), vehicle parameters, vehicle load, vehicle driving characteristics and temperature.

针对电池性能(SOC、电压、电流和电池温度)和车辆行驶特性(速度)几个方面进行深入研究,实现行驶里程估计,从而达到预测剩余里程的目的。

二、偏相关分析简介

2.1 引入偏相关分析的原因

相关分析是处理变量与变量之间关系的一种统计方法,
所处理的变量多少来看,
如果研究的是两个变量间的关系称为简单相关;
如果研究的是两个以上变 量间的关系称为多元相关。
变量之间的关系形式上看,有
线性相关分析;
非线性相关分析。
统计思想和方法来看,
线性相关是最基本的方法。

在相关分析中, 研究两事物之间的线性相关性是通过 计算相关系数等方式实现,并通过相关系数值的大小来判定事物之间的线性相关强弱。

详细内容:
数据挖掘01-相关性分析及可视化【Pearson, Spearman, Kendall】

然而,当简单相关系数受其他因素的影响,它 所反映的往往是表面的非本质的联系。此时要准确地反映两个变量之间的内在联系,就不能简单的计算相关系数,而是需要考虑 偏相关系数

2.2 什么是偏相关分析

偏相关分析也称 净相关分析,它 在控制其他变量的线性影啊的条件下分析两变量间的线性关系,通常用 偏相关系数(即 净相关系数)表示。

当控制变量个数为 时,偏相关系数称为 一阶偏相关
当控制变量个数为 时,偏相关系数称为 二阶偏相关
当控制变量个数为 时,偏相关系数称为 零阶偏相关,即 简单相关系数

偏相关系数是 在对其他变量的影响进行控制的条件下,衡量多个变量中某两个变量之间的线性相关程度的指标。所以,用偏相关系数来描述两个经济 变量之间的内在线性联系会更合理、更可靠。

偏相关系数不同于简单的相关系数,在计算偏相关系数时需要掌握多变量的数据。

[En]

The partial correlation coefficient is different from the simple correlation coefficient, so it is necessary to master the data of multiple variables when calculating the partial correlation coefficient.

一方面,我们考虑了多个变量的可能影响,另一方面,我们使用一定的方法来控制其他变量,特别是考察两个特定变量之间的净相关性。

[En]

On the one hand, we consider the possible effects of multiple variables, on the other hand, we use certain methods to control other variables, specifically to investigate the net correlation between two specific variables.

在多变量相关的情况下,变量之间存在复杂的关系,因此部分相位相关数与简单相关系数之间可能存在很大差异,有时甚至符号可能是相反的。偏相关系数的范围与简单相关系数的范围相同,范围为-1~1 cm*。偏相关系数绝对值越大(越接近1),变量间的线性相关程度越高;偏相关系数绝对值越小(越接近0),变量间的线性相关程度越低。

[En]

In the case of multivariable correlation, there is a complex relationship between variables, so there may be a great difference between the partial phase correlation number and the simple correlation coefficient, and sometimes even the symbol may be opposite. The range of partial correlation coefficient is the same as that of simple correlation coefficient, which is from * -1 to 1cm . The greater the absolute value of partial correlation coefficient * (closer to 1) * , the higher the degree of linear correlation between variables * ; the smaller the absolute value of partial correlation coefficient * (the closer to 0) * , the lower the degree of linear correlation between variables * .

2.3 偏相关分析的步骤

利用部分相位相关数分析变量间的净关系通常需要完成以下两个步骤:

[En]

The use of partial phase correlation number to analyze the net relationship between variables usually needs to complete the following two steps:

(1)计算样本的偏相关系数

利用样本数据计算样本的 偏相关系数,它反映了 两变量间净相关的程度强弱。在分析变量x1和y1之间的净相关时,当控制了x2的线性作用后,x1和y1之间的一阶相关系数定义为:
数据挖掘05-偏相关分析【原理、案例、python实现】

ry1、ry2、r12分别表示y和x1的相关系数、y和x2的相关系数、x1和x2的简单相关系数

; (2)对上一步求得的偏相关系数进行检验

净相关分析检验的基本步骤是:

  1. 提出假设,假设偏相关系数与零无显著性差异,即两个变量之间不线性相关。
  2. 选择检验统计量。偏相关分析的检验统计量为t统计量,它的数学定义为:
    数据挖掘05-偏相关分析【原理、案例、python实现】
    r为偏相关系数,n为样本数,q为阶数。t统计量服从n-q-2个自由度的t分布。
  3. 计算检验统计量的观测值和对应的概率p值
  4. 决策。如果检验统计量的概率p值小于给定的显著性水平α(一般为0.05),应拒绝零假设,认为两总体的偏相关系数与零有显著性差异,即两变量之间有显著的线性相关关系;反之,如果检验统计量的概率p值大于给定的显著性水平α,则说明两变量之间没有显著线性相关关系。

三、【案例分析】行驶里程与影响因素的偏相关分析

数据挖掘05-偏相关分析【原理、案例、python实现】

由上表3-1可知, 行驶里程和电池SOCPearson相关系数为-0.976相关系数检验的概率p值都近似为0,说明 两者之间具有很强的负线性相关关系,而 其他变量与行驶里程之间的Pearson相关系数都偏小,说明 他们之间的线性相关性并不明显,说明 这些影响因素可能是通过非线性关系来影响行驶里程的变化的。

; 3.1 速度

为了分析电动车行驶速度和里程之间的关系,将【车速、soc、行驶里程】绘制曲线图进行分析:
数据挖掘05-偏相关分析【原理、案例、python实现】

图3-5为速度和形式里程的变化曲线图,从图中可以看出,速度的曲线上下波动较大。电池SOC从96%下降到47%的过程中,当速度为0时,行驶里程曲线为水平走向,说明此刻车辆处在停止状态,当速度不为0时,行驶里程开始逐渐增加,说明速度对行驶里程有很大影响。但是由之前的偏相关分析表3-1可知,速度和里程之间不是线性关系,因此采用每公里电量消耗百分比来分析。
数据挖掘05-偏相关分析【原理、案例、python实现】

图3-6为不同速度下的每公里电量消耗百分比散点图,从图中可以看出,速度从20km/h变化到90km/h的过程中,每公里电量消耗百分比是由大变小再变大,当速度为50%左右的时候,每公里电量消耗百分比会达到最小值。由此可以看出, 速度对每公里电量消耗百分比影响显著,并 通过影响每公里电量消耗百分比的形式影响行驶里程的。从图中可以看出速度对每公里电量消耗百分比的影响呈现非线性关系。

3.2 温度

数据挖掘05-偏相关分析【原理、案例、python实现】

图3-7为电动车的电池放电温度分布图,从图中可以看出,这段时间内电动车电池的工作温度处于0℃到 40℃之间。图中横轴对应有散点存在的,说明今天车辆有出行;没有散点对应的日期,说明车辆没有出行。尤其在2014年2月份附近,散点分布较少, 说明春节期间车辆出行活动少。

与速度同理,绘制其温度与每公里电量消耗百分比的散点图,如图3-8所示。
数据挖掘05-偏相关分析【原理、案例、python实现】

图3-8为不同温度下的每公里电量消耗百分比散点图,可以看出,电池的工作温度为20℃左右的情况比较多。并且不同温度下对应的每公里电量消耗百分比都位于0.5至1之间。从图中 并未发现温度对每公里电量消耗百分比存在明显的影响

; 3.3 电压

数据挖掘05-偏相关分析【原理、案例、python实现】

图3-9为电动车在一次放电过程中的行驶里程与总电压变化的曲线图。可以看出物理电动车在一次放电过程中,随着时间的推移总里程在增加,而总电压则是上下波动不定的,但是可以看出 总电压值随着里程的增加略微有下降的趋势
数据挖掘05-偏相关分析【原理、案例、python实现】

由图3-10可以看出,在一次放电过程中,单体电池的最高电压和最低电压也是上下波动的,波动的同时两条曲线的振动趋势具有很强的一致性,这应该是出于所有电池都串联在一起的缘故。另外, 同总电压一样,随着电池SOC的减少里程数的增加,最高电压和最低电压也有略微下降的走势

3.4 总电流

数据挖掘05-偏相关分析【原理、案例、python实现】

图3-11为电动车在出行过程中总电流和行驶里程的变化曲线图,从图中可以看出,车辆在放电过程中,电流并不是一直是正值,偶尔也会有负值的出现,这是因为电动车在出行状态时经常会踩刹车来减速,而 车辆在刹车的时候会把减少的机械能转化为电能并反馈给蓄电池,相当于对其进行短暂的充电, 此时的电流就是负值

; 3.5 小结

利用偏相关分析对行驶里程与其影响参数之间进行线性相关分析,然后定义每公里电量消耗百分比,并分析它与行驶里程影响参数之间的非线性关系目的为后面的模型建立时选择影响因素做基础

四、python偏相关分析

4.1 数据源

x1=np.random.rand(10)
x2=np.random.rand(10)
x3=np.random.rand(10)
print(x1)
print(x2)
print(x3)

4.2 pandas

4.2.1 一阶相关系数


df=pd.DataFrame([x1,x2,x3],index=['a','b','c']).T
print('数据:\n',df)
print('相关系数矩阵为:\n',df.corr())
r_ab=df.a.corr(df.b)
r_ac=df.a.corr(df.c)
r_bc=df.b.corr(df.c)
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**0.5)*((1-r_bc**2)**0.5))
print('ab_c的一阶偏相关系数为:',r_ab_c)

数据挖掘05-偏相关分析【原理、案例、python实现】

4.2.2 pcorr()

要一次性计算多个变量之间的部分相关性,可以使用.pcorr()函数:


df.pcorr().round(3)

         currentGrade   hours   examScore
currentGrade        1.000      -0.311       0.736
hours              -0.311   1.000       0.191
examScore       0.736   0.191       1.000

4.3 numpy


lst=[x1,x2,x3]
res=np.corrcoef(lst)
print('相关系数矩阵为:\n',res)
label=['a','b','c']
corr=dict()
for row in range(res.shape[0]):
    for col in range(res.shape[1]):
        corr['r_{}{}'.format(label[row],label[col])]=res[row][col]
r_ab=corr['r_ab']
r_ac=corr['r_ac']
r_bc=corr['r_bc']
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**0.5)*((1-r_bc**2)**0.5))
print('ab_c的一阶偏相关系数为:',r_ab_c)

数据挖掘05-偏相关分析【原理、案例、python实现】

4.4 sicpy


from scipy import stats
r_ab=stats.pearsonr(x1,x2)[0]
r_ac=stats.pearsonr(x1,x3)[0]
r_bc=stats.pearsonr(x2,x3)[0]
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**0.5)*((1-r_bc**2)**0.5))
print('ab_c的一阶偏相关系数为:',r_ab_c)

数据挖掘05-偏相关分析【原理、案例、python实现】

4.5 自己写公式


import math
def calc_corr(a,b):
    E_a = np.mean(a)
    E_b = np.mean(b)
    E_ab=np.mean(list(map(lambda x:x[0]*x[1],zip(a,b))))

    cov_ab = E_ab - E_a * E_b

    def square(lst):
        res=list(map(lambda x:x**2,lst))
        return res

    D_a=np.mean(square(a))-E_a**2
    D_b=np.mean(square(b))-E_b**2

    σ_a=np.sqrt(D_a)
    σ_b=np.sqrt(D_b)

    corr_factor = cov_ab / (σ_a*σ_b)
    return corr_factor

r_ab=calc_corr(x1,x2)
r_ac=calc_corr(x1,x3)
r_bc=calc_corr(x2,x3)
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**0.5)*((1-r_bc**2)**0.5))
print('ab_c的一阶偏相关系数为:',r_ab_c)

数据挖掘05-偏相关分析【原理、案例、python实现】

Original: https://blog.csdn.net/SeafyLiang/article/details/121667457
Author: SeafyLiang
Title: 数据挖掘05-偏相关分析【原理、案例、python实现】



相关阅读

Title: TensorFlow实现自注意力机制(Self-attention)

TensorFlow实现自注意力机制(Self-attention)

*
- 自注意力机制(Self-attention)
-
+ 计算机视觉中的自注意力
- Tensorflow实现自注意力模块

自注意力机制(Self-attention)

自注意力机制 (Self-attention) 随着自然语言处理 (Natural Language Processing, NLP) 模型(称为"Transformer")的引入而变得流行。在诸如语言翻译之类的NLP应用程序中,模型通常需要逐字阅读句子以理解它们,然后再产生输出。Transformer问世之前使用的神经网络是递归神经网络 (Recurrent Neural Network, RNN) 或者其变体,例如长短期记忆网络 (Long Short-Term Memory, LSTM)。 RNN 具有其内部状态,能够更好的处理序列信息,例如句子中前面的单词输入和后面的单词输入是有关系的。但是 RNN 也具有其缺陷,例如当单词数量增加时,那么第一个单词的梯度就可能消失。也就是说,随着RNN读取更多单词,句子开头的单词逐渐变得不那么重要。
Transformer 的处理方式有所不同。它会一次读取所有单词,并权衡每个单词的重要性。因此,更多的注意力集中在更重要的单词上,因此也称为注意力。
而自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。自注意力是最新的NLP模型 (例如BERT和GPT-3) 的基石。

计算机视觉中的自注意力

首先简单回顾下卷积神经网络 (Convolutional Neural Networks, CNN) 的要点:CNN 主要由卷积层组成。对于卷积核大小为 3×3 的卷积层,它仅查看输入激活中的 3×3 = 9 个特征(也可以将此区域称为卷积核的感受野)以计算每个输出特征,它并不会查看超出此范围的像素。为了捕获超出此范围的像素,我们可以将核大小略微增加到 5×5 或 7×7,但与特征图大小相比感受野仍然很小。
我们必须增加网络的深度,以使卷积核的感受野足够大以捕获我们想要的内容。与RNN一样,输入特征的相对重要性随着我们在网络层中的移动而下降。因此,我们可以利用自注意力来观察特征图中的每个像素,并注意力集中在更加重要的像素上。
现在,我们将研究自注意力机制的工作原理。自注意力的第一步是将每个输入特征投影到三个向量中,这些向量称为键 (key),查询 (query) 和值 (value),虽然这些术语在计算机视觉中较少出现,但是首先介绍有关这些术语的知识,以便可以更好地理解自注意力,Transformer或NLP有关的文献:

  1. 值 (value) 表示输入特征。我们不希望自注意力模块查看每个像素,因为这在计算上过于昂贵且不必要。相反,我们对输入激活的局部区域更感兴趣。因此,值在激活图尺寸(例如,它可以被下采样以具有较小的高度和宽度)和通道的数目方面都减小了来自输入特征的维数。 对于卷积层激活,通过使用1x1卷积来减少通道数,并通过最大池化或平均池化来减小空间大小。
  2. 键和查询 (Keys and queries) 用于计算自注意图中特征的重要性。为了计算位置x x x 处的输出特征,我们在位置x x x 处进行查询,并将其与所有位置处的键进行比较。
    为了进一步说明这一点,假设我们有一幅肖像,当网络处理该肖像的一只眼睛时,它首先进行具有语义意义的查询,并使用该肖像的其他区域中的关键字来检查它。如果其他区域中的一个关键是眼睛,那么网络知道它找到了另一只眼睛,这是网络应该关注的区域,以便网络可以进一步处理它。

    [En]

    To further illustrate this point, suppose we have a portrait that, when the network processes one eye of the portrait, it first makes a query that has the semantic meaning of "eye" and checks it using keys in other areas of the portrait. If one of the keys in other areas is the eye, then the network knows that it has found the other eye, which is the area that the network should pay attention to so that the network can process it further.

    更一般的,使用数学方程表达:对于特征0 0 0,我们计算向量q 0 × k 0 , q 0 × k 1 , q 0 × k 2 , q 0 × k N − 1 q_0×k_0, q_0×k_1, q_0×k_2, q_0×k_{N-1}q 0 ​×k 0 ​,q 0 ​×k 1 ​,q 0 ​×k 2 ​,q 0 ​×k N −1 ​。然后使用s o f t m a x softmax s o f t m a x 将向量归一化,因此它们的总和为 $1.0,这就是是我们要求的注意力得分。将注意力得分用作权重以执行值的逐元素乘法,以获取注意力输出。

下图说明了如何从查询中生成注意力图:

数据挖掘05-偏相关分析【原理、案例、python实现】
上图红,最左边一列的图是带有点标记的查询 (queries) 的图像。接下来的五个图像显示了通过查询获得的注意力图。顶部的第一个注意力图查询兔子的一只眼睛;注意图的两只眼睛周围有更多白色区域(指示重要区域),其他区域接近全黑(重要性较低)。

有多种实现自注意力的方法。下图显示了 SAGAN 中的所使用的注意力模块,其中 θ θθ,φ φφ 和 g g g 对应于键,查询和值:

数据挖掘05-偏相关分析【原理、案例、python实现】
深度学习中的大多数计算都是为了提高速度性能而矢量化的,而对于自注意力也没有什么不同。如果为简单起见忽略 batch 维度,则 1×1 卷积后的激活将具有 (H, W, C) 的形状。第一步是将其重塑为形状为 (H×W, C) 的2D矩阵,并使用 θ θθ 与 φ φφ 的矩阵相乘来计算注意力图。在SAGAN中使用的自注意力模块中,还有另一个1×1卷积,用于将通道数恢复到与输入通道数相同的数量,然后使用可学习的参数进行缩放操作。

; Tensorflow实现自注意力模块

首先在自定义层的build()中定义所有 1×1 卷积层和权重。这里,使用频谱归一化函数作为卷积层的核约束:

class SelfAttention(Layer):
    def __init__(self):
        super(SelfAttention, self).__init__()

    def build(self, input_shape):
        n,h,w,c = input_shape
        self.n_feats = h * w
        self.conv_theta = Conv2D(c//8, 1, padding='same', kernel_constraint=SpectralNorm(), name='Conv_Theta')
        self.conv_phi = Conv2D(c//8, 1, padding='same', kernel_constraint=SpectralNorm(), name='Conv_Phi')
        self.conv_g = Conv2D(c//8, 1, padding='same', kernel_constraint=SpectralNorm(), name='Conv_g')
        self.conv_attn_g = Conv2D(c//8, 1, padding='same', kernel_constraint=SpectralNorm(), name='Conv_AttnG')
        self.sigma = self.add_weight(shape=[1], initializer='zeros', trainable=True, name='sigma')

需要注意的是:

  1. 内部的激活可以减小尺寸,以使计算运行更快。
  2. 在每个卷积层之后,激活由形状 (H, W, C) 被重塑为形状为 (H*W, C) 的二维矩阵。然后,我们可以在矩阵上使用矩阵乘法。

接下来在 call() 函数中将各层进行连接,用于执行自注意力操作。首先计算 θ \theta θ,φ φφ 和 g g g:

    def call(self, x):
        n, h, w, c = x.shape
        theta = self.conv_theta(x)
        theta = tf.reshape(theta, (-1, self.n_feats, theta.shape[-1]))
        phi = self.conv_phi(x)
        phi = tf.nn.max_pool2d(phi, ksize=2, strides=2, padding='VALID')
        phi = tf.reshape(phi, (-1, self.n_feats//4, phi.shape[-1]))
        g = self.conv_g(x)
        g = tf.nn.max_pool2d(g, ksize=2, strides=2, padding='VALID')
        g = tf.reshape(g, (-1, self.n_feats//4, g.shape[-1]))

然后,将按以下方式计算注意力图:

        attn = tf.matmul(theta, phi, transpose_b=True)
        attn = tf.nn.softmax(attn)

最后,将注意力图与查询 g g g 相乘,并产生最终输出:

        attn_g = tf.matmul(attn, g)
        attn_g = tf.reshape(attn_g, (-1, h, w, attn_g.shape[-1]))
        attn_g = self.conv_attn_g(attn_g)
        output = x + self.sigma * attn_g
        return output

Original: https://blog.csdn.net/LOVEmy134611/article/details/118894270
Author: 盼小辉丶
Title: TensorFlow实现自注意力机制(Self-attention)

相关文章
【OpenCV图像处理9】图像金字塔 人工智能

【OpenCV图像处理9】图像金字塔

文章目录 九、图像金字塔 * 1、图像金字塔介绍 2、高斯金字塔 3、拉普拉斯金字塔 九、图像金字塔 1、图像金字塔介绍 图像金字塔是图像中多尺度表达的一种,最主要应用于图像分割,是一种以多分辨率来解...
云云云云云云云云EasyDL 语音(3) 人工智能

云云云云云云云云EasyDL 语音(3)

解释一下:就是用零代码自助训练语音识别语言模型,声音分类模型。提升业务领域专有名词识别准确率,区分不同声音类别,广泛适用于行业数据采集录入、语音指令、呼叫中心、声音类型检测等应用场景。 说白了就是基于...
语音识别之语音特征提取一 人工智能

语音识别之语音特征提取一

语音识别的第一步就是语音特征提取,语音信号是在人体中肺、喉、声道等器官构成的语音产生系统中产生的,它是一个高度不平稳的信号,它的幅度谱和功率谱也随着时间不停的变化,但是在足够短的时间内,其频谱特征相当...