zoukankan      html  css  js  c++  java
  • 特征相似性度量

      在进行特征选择的时候我们要衡量特征和我们的目标之间的相似性,有很多的方法可以衡量,下面介绍一些使用filter特征选择方法的时候能够使用的方法,更多的特征选择方法可以参考我的另一个博客特征选择

      filter特征选择方法是:特征选择的过程和模型的训练过程没有直接关系,使用特征本身的信息来进行特征选择。

      参考这篇文章给出下图所示的特征度量方法:

    FS1

    1:相关系数(皮尔逊系数)

      对于两个变量$mathbf{x}$ 和$mathbf{y}$ 相关系数是这样定义的:

      $ ho(mathbf{x},mathbf{y}) = frac{   cov(mathbf{x},mathbf{y})  }   {   sqrt{D(mathbf{x})D(mathbf{y})}  }$

      其中$cov(mathbf{x},mathbf{y}) $是 $mathbf{x}$ 和$mathbf{y}$的协方差,$D(mathbf{x})D(mathbf{y})$是$mathbf{x}$ 和$mathbf{y}$的方差。

      当我们用采集到的数据来进行计算的时候,计算公式如下:

      $ ho(mathbf{x}, mathbf{y}) = frac{ sum limits_{i=1}^n [(x_i – ar x)  (y_i – ar y)] }{sqrt{ sum limits_{i=1}^n {(x_i – ar x)}^2   sum limits_{i=1}^n {(y_i – ar y)}^2  }}$

      相关系数的取值在-1和1之间。相关系数为1的时候表明两个变量是线性相关的,而取0的时候表示的是不相关的。当两个变量都是连续的数值类型的时候,可以使用相关系数来进行度量。

      关于相关系数的另一个解释是这样的:相关系数是去中心化以后数据的余弦值。中心化是数据减去他们的平均值以后得到的数据。

    python当中计算相关系数的方法:

    import scipy.stats as stats
    import numpy as np
    import pandas as pd
    
    a = [1.2, 1.5, 1.9]
    b = [2.2, 2.5, 3.1]
    
    print(stats.pearsonr(a, b))  
    '''
    使用scipy库来进行计算,返回两个值,第一个是相关系数,第二个是在不相关假设情况下的p值。
    
    (0.9941916256019201, 0.0686487855020298)
    '''
    
    print(np.corrcoef([a, b]))  
    '''
    使用numpy库来计算相关系数,返回一个数组的形式,为第i行第j行的相关系数
    
    [[1.         0.99419163]
     [0.99419163 1.        ]]
    '''
    
    df = pd.DataFrame()
    df['a'] = a
    df['b'] = b
    print(df.corr())    
    '''
    使用pandas库来进行计算,计算第i列和第j列(每一列都是一个Series)的相关系数。返回的结果为一个DataFrame。
    注:pandas是计算列的相关系数,numpy是计算行的相关系数。假如有一个df,那么如果用numpy来进行计算?
    使用的方法是 np.corrcoef(df.values.T),要进行转置一下。 a b a 1.000000 0.994192 b 0.994192 1.000000
    '''

    2:Anova(方差分析)

      Anova是方差分析(analysis of variance)的意思。 方差分析出现的背景是这样的:在实际的生产生活当中,一个结果会受到多个因素的影响,比如小麦产量受到光照、土壤的酸碱程度、温度等因素影响,化工生产当中产品受到原料成分、原料剂量、催化剂、反应温度、压力、溶液浓度、反应时间、机器设备的影响。如何能够判别哪种因素是对我们的结果影响最大的,这个时候就使用方差分析。我们把要考察的指标叫做试验指标,影响试验指标的条件叫做因素

      单变量的方差分析是只研究一个变量对于结果的影响。让这个变量取不同的值,得到不同值下的几组数据。比如要研究机器对于铝合金薄板厚度是否有影响,那么需要获得在不用的机器上面取得的薄板厚度的一组值。

      把这个问题转换为一个检验假设问题:在各组数据符合正态分布,而且正态分布的方差都相同的条件下,看各组数据的均值是否相同。如果结果在可接受的范围内相同,那么则说明这一因素对于试验指标没有太大的影响。如果不相同,那么说明这一因素对于试验指标影响很大。

      具体的计算过程当中是要求出这么几个值,最后可以列出一张单因素试验方差分析表。

    方差来源 平方和 自由度 均方 F比
    因素A $S_A$ s-1 $ar{S_A} = frac{S_A}{s-1}$ $F=frac{ar{S_A}}{ar{S_E}}$
    误差 $S_E$ n-s $ar{S_E} = frac{S_E}{n-s}$  
    总和 $S_T$ n-1    

    其中:$S_A$叫做因素A的效应平方和,反应的是在因素A的不同水平下,样本均值和总体数据均值差异的平方和。

    $S_E$叫做误差平方和,反应是在因素A的各个取值下,每组观察数据与这组数据均值的平方误差之和,反应的是随机误差的大小。

    n是总体样本个数,s表示因素A可以取s种情况。

    统计量$F=frac{S_A /(n-1)}{S_E/(n-s)}$ 叫做Anova F统计量,由它确定的检验也佳作Anova F检验。

    下面给出一个典型的例子:

    使用三台机器产生的铝合金薄板,看机器是否对薄板的厚度有显著的影响,数据集如下

    机器1      机器2      机器3

    0.236     0.257     0.258
    0.238     0.253     0.261
    0.248     0.255     0.259
    0.245     0.254     0.267
    0.243     0.261     0.262

    根据一定的计算方法(具体的计算方法可以参考《概率论与数理统计》这本书),得到的方差分析表如下:

    方差来源 平方和 自由度 均方 F比

    因素

    误差

    0.00105333

    0.000192

    2

    12

    0.00052667

    0.000016

    32.92

    总和 0.00124533 14    

    在显著性水平$alpha = 0.05$的情况下,$F_{0.05}(2,12) = 3.89 < 32.92$,拒绝假设。所以认为各台机器生产的薄板厚度有显著的差异。

    sklearn的feature_selection中的SelectKBest 结合 f_classif可以实现Anova的F值来选择特征。

    $chi^2$检验(Chi-Square  卡方检验)

      $chi^2$检测先假设特征和目标变量没有关系,然后利用公式

      $chi ^2 = sum frac{(A – T)^2}{T}$来计算$chi ^2$的值,其中A为实际值,T为理论值,是根据我们的假设推出来的。

    来看这么一个例子:

    在给出下列数据的情况下,是否认为不同性别的人对猫和狗有偏爱。

     
    207 282
    231 242

    首先,我们将各行各列相加得出一些数据:

       
    207 282 489
    231 242 473
      438 524 962

    然后我们算出理论值:即认为在性别对宠物偏爱没有影响的情况下,只和统计值有关的情况下,数据的理论值。

    猫的占比为 $frac{438}{962}$,狗的占比为$frac{524}{962}$,所以理论上:

    男人喜欢猫的人数应该为 $489 imes frac{438}{962} = 222.64$

    男人喜欢狗的人数应该为 $489 imes frac{524}{962} = 266.36$

    女人喜欢猫的人数应该为$473 imes frac{438}{962} = 215.36$

    女人喜欢狗的人数应该为$473 imes frac{524}{962} = 257.64$

    数据如下图所示:

     
    222.64 266.36
    215.36 257.64

    最后根据我们上面给出的公式来计算$chi ^2$值:

    $chi ^2 = frac{(207-222.64)^2}{222.64} + frac{(282-266.36)^2}{266.36} + frac{(231-215.36)^2}{215.36}+ frac{(242-257.64)^2}{257.64} = 4.102$

    在知道自由度的情况下,我们可以将$chi ^2$的值转换为p值,在这个问题当中自由度为1,计算出p=0.04283。p的值小于0.05(0.05是一个经典的显著性值),所以拒绝假设的依据很强,即认为不同性别的人对于宠物偏爱是不同的,即这两个变量不独立。

    sklearn.feature_selection中的SelectKBest结合chi2可以使用$chi^2$检测来进行特征的选择。

     

     

    关于假设检验的说明:

      我们上面介绍的Anova和$chi^2$检验,都是从检验问题引出来的,检验问题就是说,我们给定一个假设,那么我们观察到一定的样本后,我们是否相信这个假设,或者我们有多大的可能性来相信这个假设。假设问题可以转化为p-value问题,也就是把我们的假设问题转化为一个概率值来进行衡量。

      在$chi ^2$检测当中,我们假设我们的特征和目标变量没关系,所以得到的p值说明,在特征和目标变量没有关系的时候,我们能够相信观察到这些样本的概率。所以p值越小,说明我们越不相信,即特征和变量相关性越高。 所以p值越小,相关性越大。

      在Anova当中,我们得到F值,F值可以转化为p值,Anova的假设条件是各个因素水平的均值相等,即这个因素对于试验指标并没有影响。所以,在这一假设下,p值越小,说明我们约不相信因素对于试验指标没有影响。 所以p值越小,相关性越大。

     

    LDA

      LDA是Linear Discriminant Analysis(线性判别分析)。即是一种分类算法,也可以用在降维当中,经常和PCA并列。这需要另外写一篇博客来进行介绍。

    参考:

      盛骤  《概率论与数理统计》

      Python计算两个数组的相关系数

      1 - 基于卡方检验的特征选择 

      x2检验(chi-square test)或称卡方检验 

      卡方检验 

  • 相关阅读:
    Linnia学习记录
    漫漫考研路
    ENS的学习记录
    KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定
    KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定
    KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定
    KnockoutJS 3.X API 第四章 数据绑定(1) 文本及样式绑定
    KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
    KnockoutJS 3.X API 第三章 计算监控属性(4)Pure computed observables
    KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/8952850.html
Copyright © 2011-2022 走看看