精华内容
下载资源
问答
  • 计算字段文本区分度公式: select COUNT(DISTINCT left(column_name,length))/COUNT(*) from table_name 其中column_name是需要建立索引的字段,而length则是选择这个字段用来建立索引的长度。 公式的作用就是,...

    有时候需要为字段创建索引时,但是字段太长,为整个字段创建索引的话,太浪费存储空间了,所以需要计算出字段区分度,选择合适的索引长度。

    计算字段文本区分度的公式:

    select  COUNT(DISTINCT left(column_name,length))/COUNT(*) from table_name
    

    其中column_name是需要建立索引的字段,而length则是选择这个字段用来建立索引的长度。

    公式的作用就是,选择出字段长度,去重求总,这时候就可以知道使用这个长度来建立索引,大概会有多少值,然后再把这个值除以总数,得到的值越接近1,则表示用这个长度来建立索引的区分度越大,自然就越适合。

    测试表USER_ROLE的数据如下:
    在这里插入图片描述

    比如要对字段USER_NAME建立索引,代入上述公式

    先选择这个字段的1个长度来建立索引,看下区分度:

    select  COUNT(DISTINCT left(USER_NAME,1))/COUNT(*) from USER_ROLE
    

    区分度如下:
    在这里插入图片描述
    再选择这个字段的3个长度来建立索引:

    select  COUNT(DISTINCT left(USER_NAME,1))/COUNT(*) from USER_ROLE
    

    看下区分度:
    在这里插入图片描述
    再选择这个字段的4个长度来建立索引:

    select  COUNT(DISTINCT left(USER_NAME,4))/COUNT(*) from USER_ROLE
    

    看下区分度:
    在这里插入图片描述
    最后选择这个字段的5个长度来建立索引

    select  COUNT(DISTINCT left(USER_NAME,5))/COUNT(*) from USER_ROLE
    

    看下区分度:
    在这里插入图片描述

    可以发现长度4和长度5的区分度都是1,那自然选择占用空间小的方案了。

    总结

    要建立大字段的索引时,可以配合计算字段文本区分度的公式,选出合适的字段长度来建立索引。

    展开全文
  • 为得到蒙东地区无软弱覆岩层地质条件下特厚煤层综放开采导水断裂带的准确测算方法,以神华大雁矿业公司敏东一矿02工作面为例,分别采用煤矿防治水经验公式、"三下"采煤计算公式等方法计算导水断裂带高度;同时,采用FLAC...
  • 界定了焦元"有效信容量"和"识别一致性", 阐明了分配证据冲突的依据,构建了分配系数计算公式,修改了证据合成规则.对比实验表明:改进的证据合成方法在处理高度冲突证据合成时,具有更好的收敛性和鲁棒性.
  • 浮力计算一般是中考的重点知识,同时也是力学部分比较有区分度的一类试题,为了大家能在考试中轻松应对这类试题,小编在此精心总结了4种浮力的计算方法,下面我们一起来学习吧! 1、称重法 图示及公式: 适用...

    浮力计算一般是中考的重点知识,同时也是力学部分比较有区分度的一类试题,为了大家能在考试中轻松应对这类试题,小编在此精心总结了4种浮力的计算方法,下面我们一起来学习吧!

    1、称重法

    图示及公式:

    称重法

    适用范围:在已知物体的重力及液体中的物体受到向上的拉力时。

    2、压力差法

    图示及公式:

    压力差法

    适用范围:(1)已知上、下表面的压强及表面积;(2)已知两个压力

    注:上述两条中满足一条即可。

    3、阿基米德原理

    图示及公式:

    阿基米德原理

    适用范围:在已知物体排开液体的体积和液体的密度时。

    注意:在计算时要注意统一单位、分清V排与V物。

    4、平衡法

    图示及公式:

    平衡法

    适用范围:适用于漂浮或悬浮的物体。

    以上讲解的4种浮力计算方法,相信对同学们的物理知识都会有或多或少的帮助,那同学们就做几道题来测试一下吧!

    【课后练习】

    1、某物体重为0.5N,把它放在盛有水的烧杯中,溢出0.3N的水,则它受到的浮力(     )

    A、一定为0.3N           B、可能为0.2N

    C、一定为0.5N           D、可能为0.4N

    2、物体在液体中受到的浮力大小(    )

    A、和物体本身的重力大小有关

    B、和物体的体积大小有关

    C、和物体的密度大小有关

    D、和物体排开液体的体积大小有关

    3、一个重5N的石块,挂在弹簧测力计上,将它浸没在盛满水的溢水杯中时弹簧测力计的示数是3N,则石块受到的浮力是___N,溢出水的重力是___N。

    4、将一恰能在水中悬浮的实心小物块投入装满水的烧杯,则烧杯底部受到水的压强将 _____(选填“增大”、“减小”或“不变”)。用与物块相同的材料制成一个l0dm3 的实心物体,则物体质量为_____kg。

    5、把重10N,体积为1.2×103cm3的物体投入水中,当物体静止时,物体的状态是______。(填“漂浮”、“悬浮”、“沉到水底”)

    【答案】:

    1、D 2、D 3、18. 2;2 4、不变;10 5、漂浮

    转载于:https://www.cnblogs.com/geili/p/10780071.html

    展开全文
  • 1.2.6 改变公式计算方式 13 1.3 在公式中使用函数 14 1.3.1 为什么使用函数 14 1.3.2 函数的类型 14 1.3.3 函数的参数 15 1.3.4 在公式中输入函数 16 1.4 在公式中使用名称 18 1.4.1 名称的作用范围 19 ...
  • 针对常规测井方法很难区分基质孔隙和次生孔隙的问题,采用阿尔奇公式将电成像测井资料转换为井周孔隙谱,研究分析了不同孔径大小的孔隙分布情况,定性区分出基质孔隙和次生孔隙;利用铸体薄片数据和核磁共振数据刻度...
  • 轻质原油和重质原油如何区分

    千次阅读 2018-03-08 21:02:48
    轻质和重质原油的分类通常有两个标准。 一是按照原油的相对密度来划分。原油的相对密度,在我国是 ...其计算公式为: API=(141.5/原油在60℉的 相对密度)-131.5,其中,原油在60℉的相对密度是指,在压
    轻质和重质原油的分类通常有两个标准。
    一是按照原油的相对密度来划分。原油的相对密度,在我国是
    指在一个标准大气压下, 20℃原油与4℃纯水单位体积的质量
    比。一般来说,相对密度在0.91.0称为重质原油,相对密度小
    0.9称为轻质原油。
    二是用API度来衡量。其计算公式为: API=(141.5/原油在60℉的
    相对密度)-131.5,其中,原油在60℉的相对密度是指,在压强为
    101325Pa下, 60℉( 15.6℃)原油与4℃纯水单位体积的质量比。
    按照国际上通行的分类标准,超轻原油API≥50,轻质原油35≤API
    50,中质原油26≤API35,重质原油10≤API26。不同国家
    和公司对密度的划分标准可能会有所差异,现实中并不完全机
    械地遵循这些标准,往往还会考虑定价基准等其他因素。

    展开全文
  • 目标:LDA关心的是能够最大化类间区分度的坐标轴成分 将特征空间(数据集中的多维样本)投影到一个维度更小的 k 维子空间中,同时保持区分类别的信息 原理:投影到维度更低的空间中,使得投影后的点,会形成按类别...
  • 太阳方位角计算程序

    2013-07-15 17:42:07
     太阳高度(h⊙)的计算公式为 sinh⊙=sinδsinφ+cosδcosφcosτ(8) 式中,δ就是太阳赤纬角,即式(5)中的Ed,φ为当地的地理纬度,τ为当时的太阳时角。φ值不难获得,且一旦确定,不会改变。δ值的计算...
  • 为什么要做降维: 提高计算效率 留存有用的特征,为后续建模使用 在项目中实际拿到的数据,可能会有几百个维度(特征)的数据集,这样的...目标:LDA关心的是能够最大化类间区分度的坐标轴成分 将特征空间(数...

    为什么要做降维:

    1. 提高计算效率
    2. 留存有用的特征,为后续建模使用

    在项目中实际拿到的数据,可能会有几百个维度(特征)的数据集,这样的数据集在建模使用时,非常消耗计算资源,所以需要通过使用降维方法来优化数据集

    线性判别分析(Linear Discriminant Analysis)

    • 用途:数据预处理中的降维,分类任务(有监督问题)

    • 目标:LDA关心的是能够最大化类间区分度的坐标轴成分
      将特征空间(数据集中的多维样本)投影到一个维度更小的 k 维子空间中,同时保持区分类别的信息

    • 原理:投影到维度更低的空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况,相同类别的点,将会在投影后的空间中更接近

    • 投影:找到更合适分类的空间

    • 监督性:LDA是“有监督”的,它计算的是另一类特定的方向

    线性判别分析要优化的目标:
    数学原理:

    原始数据:
    在这里插入图片描述
    变换数据:
    在这里插入图片描述
    目标:找到该投影
    y=wTxy = w^Tx

    重点:如何求解 ww

    LDA分类的一个目标是使得不同类别之间的距离越远越好,另一个目标是使得同一类别之中的距离越近越好

    如何算不同簇之间的距离?

    在算簇之间的距离时,因为一个簇中,各个点的分布并不均匀,不能按照其中某一个点或几个点之间的距离来计算,可能存在选中的点偏离簇的点聚集区域,因此需要对簇算平均值再计算簇之间的距离

    投影前的每类样例(簇)的均值:
    μi=1Nixwix \mu _i = \frac{1}{N_i}\sum_{x\in w_i}x

    投影后的每类样例(簇)的均值:
    μi~=1Niywiy=1NixwiwTx=wTμi \tilde{\mu _i} = \frac{1}{N_i}\sum_{y\in w_i}y= \frac{1}{N_i}\sum_{x\in w_i}w^T x=w^T \mu _i

    投影后要使两类样本中心点尽量分离,其目标函数为:
    j(w)=μ1~μ2~=wT(μ1μ2) j(w)=|\tilde{\mu _1}-\tilde{\mu _2}|=|w^T(\mu_1-\mu_2)|
    得到了目标函数,还有一个问题,是不是使 j(w)j(w) 最大化就可以了呢?
    在这里插入图片描述
    通过这张图可以看到,在 x1x_1 轴方向的 μ\mu_* 的差值比在 x2x_2 轴方向的大,但在 x1x_1 轴方向显然比在 x2x_2 轴方向的分类效果差,所以就有了上面那个目标2,不仅要使得不同类别之间的距离越远越好,还要使得同一类别之中的距离越近越好

    因此我们需要引入新的方法 — 散列值

    散列值:样本点的密集程度,值越大,越分散,反之,越集中
    st~2=ywi(yμi~)2 \tilde{s_t}^2 = \sum_{y\in w_i}(y-\tilde{\mu_i})^2

    对于离散值描述的散列值越小,越集中,那么对此函数的要求就是越小越好

    对一个二分类问题,即希望 s1+s2s_1+s_2 越小越好

    因此我们得到了符合两个标准的目标函数:

    j(w)=μ1~μ2~s1~2s2~2 j(w)=\frac{|\tilde{\mu_1}-\tilde{\mu_2}|}{\tilde{s_1}^2-\tilde{s_2}^2}

    对于此目标函数的优化方向是 j(w)j(w) 越大越好

    散列值公式展开:
    st~=ywi(yμi~)2=xwi(wTxwTμi)2=xwiwT(xμi)(xμi)Tw \tilde{s_t} = \sum_{y\in w_i}(y-\tilde{\mu_i})^2=\sum_{x\in w_i}(w^Tx-w^T\mu_i)^2 = \sum_{x\in w_i}w^T(x-\mu_i)(x-\mu_i)^Tw

    散列矩阵(scatter matrices):
    Si=xwi(xμi)(xμi)T S_i =\sum_{x\in w_i}(x-\mu_i)(x-\mu_i)^T

    类内散布矩阵:
    Sw=S1+S2si~2=wTSiws1~2+s2~2=wTSww \begin{aligned} S_w &= S_1+S_2 \\ \tilde{s_i}^2&=w^TS_iw \\ \tilde{s_1}^2 + \tilde{s_2}^2 &= w^TS_ww \end{aligned}

    目标函数分子展开:
    (μ1~μ2~)=(wTμ1wTμ2)2=wT(μ1μ2)(μ1μ2)Tw (\tilde{\mu_1}-\tilde{\mu_2})=(w^T\mu_1-w^T\mu_2)^2=w^T(\mu_1-\mu_2)(\mu_1-\mu_2)^Tw
    SB=(μ1μ2)(μ1μ2)TS_B=(\mu_1-\mu_2)(\mu_1-\mu_2)^T,类间散布矩阵:
    wT(μ1μ2)(μ1μ2)Tw=wTSBw w^T(\mu_1-\mu_2)(\mu_1-\mu_2)^Tw = w^TS_Bw

    得到最终目标函数:
    j(w)=wTSBwwTSww j(w) = \frac{w^TS_Bw}{w^TS_ww}

    线性判别分析求解:

    使用拉格朗日乘子法求导求解

    分母进行归一化:如果分子、分母是都可以取任意值的,那就会使得有无穷解,我们将分母限制为长度为1
    c(w)=wtSBwλ(wtSww1)dcdw=2SBw2λSww=0SBw=λSww \begin{aligned} &c(w)=w^tS_Bw-\lambda(w^tS_ww-1) \\ &\Rightarrow \frac{d_c}{d_w}=2S_Bw-2\lambda S_ww=0 \\ &\Rightarrow S_Bw=\lambda S_ww \end{aligned}

    两边都乘以Sw的逆:
    Sw1SBw=λw S_w^{-1}S_Bw=\lambda w

    至此,ww 就是矩阵 Sw1SBS_w^{-1}S_B 的特征向量了,得到 Sw1S_w^{-1}SBS_Bww 就可以求出来了

    LDA算法代码练习

    这里使用的是鸢尾花数据,先导入数据,看一下,这个数据集现在是4维的,这里将通过LDA将其改变为2维:

    import pandas as pd
    # 创建标签
    feature_dict = {i:label for i,label in zip(
                    range(4),
                      ('sepal length in cm',
                      'sepal width in cm',
                      'petal length in cm',
                      'petal width in cm', ))}
    # 导入数据
    df = pd.io.parsers.read_csv(
        filepath_or_buffer='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',
        header=None,
        sep=',',
        )
    # 修改列名
    df.columns = [l for i,l in sorted(feature_dict.items())] + ['class label']
    df.dropna(how="all", inplace=True) # to drop the empty line at file-end
    # 展示
    df.tail()
    

    在这里插入图片描述
    数据集结构如下:

    X=[x1sepallengthx1sepalwidthx1petallengthx1petalwidthx2sepallengthx2sepalwidthx2petallengthx2petalwidth...x150sepallengthx150sepalwidthx150petallengthx150petalwidth],y=[wsetosawsetosa...wvirginica] X= \begin{bmatrix} x_{1sepal length} & x_{1sepal width} & x_{1petal length} & x_{1petal width} \\ x_{2sepal length} & x_{2sepal width} & x_{2petal length} & x_{2petal width} \\ ... & & & \\ x_{150sepal length} & x_{150sepal width} & x_{150petal length} & x_{150petal width} \end{bmatrix} ,y= \begin{bmatrix} w_{setosa}\\ w_{setosa}\\ ...\\ w_{virginica} \end{bmatrix}

    看完数据集发现,标签是字符串的形式,需要将其改为数字才可以,这里我们使用 sklearnLabelEncoder 方法进行转换,使得 label_dict = {1: 'Setosa', 2: 'Versicolor', 3:'Virginica'}

    from sklearn.preprocessing import LabelEncoder
    
    X = df[['sepal length in cm','sepal width in cm','petal length in cm','petal width in cm']].values
    y = df['class label'].values
    # 实例化
    enc = LabelEncoder()
    # 执行操作
    label_encoder = enc.fit(y)
    y = label_encoder.transform(y) + 1
    

    变换标签后,是这样的形式:

    y=[wsetosawsetosa...wvirginica][11...3] y= \begin{bmatrix} w_{setosa}\\ w_{setosa}\\ ...\\ w_{virginica} \end{bmatrix} \Rightarrow \begin{bmatrix} 1\\ 1\\ ...\\ 3 \end{bmatrix}

    分别求三种鸢尾花数据在不同特征维度上的均值向量 mim _i

    mi=[μwi(sepallength)μwi(sepalwidth)μwi(petallength)μwi(petalwidth)],withi=1,2,3 m_i= \begin{bmatrix} \mu_{w_i(sepal length)}\\ \mu_{w_i(sepal width)}\\ \mu_{w_i(petal length)}\\ \mu_{w_i(petal width)} \end{bmatrix},with i=1,2,3

    import numpy as np
    np.set_printoptions(precision=4)
    
    mean_vectors = []
    for cl in range(1,4):
        mean_vectors.append(np.mean(X[y==cl], axis=0))
        print('Mean Vector class %s: %s\n' %(cl, mean_vectors[cl-1]))
    
    Mean Vector class 1: [5.006 3.418 1.464 0.244]
    Mean Vector class 2: [5.936 2.77  4.26  1.326]
    Mean Vector class 3: [6.588 2.974 5.552 2.026]
    

    因为在上述公式推导中,最后与 ww 有关的是类内散布矩阵类间散布矩阵,那么只需要计算这两个结果即可

    类内散布矩阵
    Sw=i=1cSiSi=xDin(xmi)(xmi)Tmi=1nixDinxk \begin{aligned} S_w &= \sum_{i=1}^{c}S_i \\ S_i &=\sum_{x\in D_i}^{n}(x-m_i)(x-m_i)^T \\ m_i &=\frac{1}{n_i}\sum_{x\in D_i}^{n}x_k \end{aligned}

    # 构造矩阵 4*4
    S_W = np.zeros((4,4))
    for cl,mv in zip(range(1,4), mean_vectors):
        class_sc_mat = np.zeros((4,4))                  # 每个类的散布矩阵
        for row in X[y == cl]:
            row, mv = row.reshape(4,1), mv.reshape(4,1) # 生成列向量
            class_sc_mat += (row-mv).dot((row-mv).T)
        S_W += class_sc_mat                             # 求和
    print('类内散布矩阵:\n', S_W)
    
    类内散布矩阵:
     [[38.9562 13.683  24.614   5.6556]
     [13.683  17.035   8.12    4.9132]
     [24.614   8.12   27.22    6.2536]
     [ 5.6556  4.9132  6.2536  6.1756]]
    

    类间散布矩阵
    在原推导流程里面,是由两个类之间的均值相减,这里为了简化算法,提高计算速度,使用每个类别与全局均值的差值计算
    SB=i=1cNi(mim)(mim)T S_B=\sum _{i=1}^{c}N_i(m_i-m)(m_i-m)^T

    mm 是全局均值,而 mim_iNiN_i 是每类样本的均值和样本数

    overall_mean = np.mean(X, axis=0)
    S_B = np.zeros((4,4))
    for i,mean_vec in enumerate(mean_vectors):  
        n = X[y==i+1,:].shape[0]
        mean_vec = mean_vec.reshape(4,1)
        overall_mean = overall_mean.reshape(4,1)
        S_B += n * (mean_vec - overall_mean).dot((mean_vec - overall_mean).T)
    print('类间散布矩阵:\n', S_B)
    
    类间散布矩阵:
     [[ 63.2121 -19.534  165.1647  71.3631]
     [-19.534   10.9776 -56.0552 -22.4924]
     [165.1647 -56.0552 436.6437 186.9081]
     [ 71.3631 -22.4924 186.9081  80.6041]]
    
    求解矩阵的特征值与特征向量:

    Sw1SB S_w^{-1}S_B

    特征值与特征向量

    • 特征向量:表示映射方向
    • 特征值:特征向量的重要程度
    # 拿到特征值和特征向量
    eig_vals, eig_vecs = np.linalg.eig(np.linalg.inv(S_W).dot(S_B))
    # 展示特征值与特征向量
    for i in range(len(eig_vals)):
        eigvec_sc = eig_vecs[:,i].reshape(4,1)   
        print('\nEigenvector {}: \n{}'.format(i+1, eigvec_sc.real))
        print('Eigenvalue {:}: {:.2e}'.format(i+1, eig_vals[i].real))
    
    Eigenvector 1: 
    [[ 0.2049]
     [ 0.3871]
     [-0.5465]
     [-0.7138]]
    Eigenvalue 1: 3.23e+01
    
    Eigenvector 2: 
    [[-0.009 ]
     [-0.589 ]
     [ 0.2543]
     [-0.767 ]]
    Eigenvalue 2: 2.78e-01
    
    Eigenvector 3: 
    [[-0.7113]
     [ 0.0353]
     [-0.0267]
     [ 0.7015]]
    Eigenvalue 3: -5.76e-15
    
    Eigenvector 4: 
    [[ 0.422 ]
     [-0.4364]
     [-0.4851]
     [ 0.6294]]
    Eigenvalue 4: 7.80e-15
    

    目前为止,还是4个维度的数据,接下来要将其降维至两个维度,从四个维度中选择两个维度映射至其上

    # 列出(特征值,特征向量)元组
    eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]
    # 将(特征值,特征向量)元组从高到低排序
    eig_pairs = sorted(eig_pairs, key=lambda k: k[0], reverse=True)
    # 通过降低特征值来直观地确认列表已正确排序
    print('降阶特征值:\n')
    for i in eig_pairs:
        print(i[0])
    
    降阶特征值:
    32.27195779972981
    0.27756686384003953
    1.1483362279322388e-14
    3.422458920849769e-15
    
    print('差异百分比:\n')
    eigv_sum = sum(eig_vals)
    for i,j in enumerate(eig_pairs):
        print('特征值 {0:}: {1:.2%}'.format(i+1, (j[0]/eigv_sum).real))
    
    差异百分比:
    特征值 1: 99.15%
    特征值 2: 0.85%
    特征值 3: 0.00%
    特征值 4: 0.00%
    

    看完特征差异后,就确定了重要性最大的前两个维度,选择前两个维度特征,作为降维的目标

    组合重要性排序的前两个维度:

    W = np.hstack((eig_pairs[0][1].reshape(4,1), eig_pairs[1][1].reshape(4,1)))
    print('矩阵 W:\n', W.real)
    
    矩阵 W:
     [[-0.2049 -0.009 ]
     [-0.3871 -0.589 ]
     [ 0.5465  0.2543]
     [ 0.7138 -0.767 ]]
    

    到这里就得到了我们前面公式推导中的 ww,接下来就可以做降维任务了

    # 降维
    X_lda = X.dot(W) # [150,4]*[4,2] → [150,2]
    # 判断结果
    assert X_lda.shape == (150,2), "The matrix is not 150x2 dimensional."
    

    画图查看结果:

    from matplotlib import pyplot as plt
    
    label_dict = {1: 'Setosa', 2: 'Versicolor', 3:'Virginica'}
    
    def plot_step_lda():
        for label,marker,color in zip(
            range(1,4),('^', 's', 'o'),('blue', 'red', 'green')):
            plt.scatter(x=X_lda[:,0].real[y == label],
                    y=X_lda[:,1].real[y == label],
                    marker=marker,
                    color=color,
                    alpha=0.5,
                    label=label_dict[label]
                    )
        plt.xlabel('LD1')
        plt.ylabel('LD2')
        leg = plt.legend(loc='upper right', fancybox=True)
        leg.get_frame().set_alpha(0.5)
        plt.title('LDA: Iris projection onto the first 2 linear discriminants')
        plt.grid()
        plt.tight_layout
        plt.show()
    # 执行
    plot_step_lda()
    

    原始数据分布:
    在这里插入图片描述
    降维数据分布:
    在这里插入图片描述

    在Sklearn中也有相对应的 LDA 算法的 API
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
    # LDA 实例化 降低为2维
    sklearn_lda = LDA(n_components=2)
    # 执行
    X_lda_sklearn = sklearn_lda.fit_transform(X, y)
    

    查看结果:
    在这里插入图片描述在这里插入图片描述
    对比这两个结果,Sklearn 与 我们自己写的代码效果差不多

    主成分分析(Principal Component Analysis)

    • 用途:降维中最常用的一种手段
    • 目标:提取最有价值的信息(基于方差,无监督问题)
    • 意义:降维后的数据没有实际的意义
    向量的表示及基变换
    • 内积:

    (a1,a2,...,an)T(b1,b2,...,bn)T=a1b1+a2b2+...+anbn (a_1,a_2,...,a_n)^T \cdot (b_1,b_2,...,b_n)^T=a_1b_1+a_2b_2+...+a_nb_n

    解释:
    AB=ABcos(a) A \cdot B=|A||B|cos(a)

    向量可以表示为 (3,2)(3,2),实际上表示线性组合:
    x(1,0)T+y(0,1)T x(1,0)^T+y(0,1)^T

    • 基:(1,0)(1,0)(0,1)(0,1) 叫做二维空间中的一组基

    基是正交的,即内积为0,或直观说相互垂直,线性无关

    • 基变换

    变换:数据与一个基做内积运算,结果作为第一个新的坐标分量,然后与第二个基做内积运算,结果作为第二个新坐标的分量

    数据 (3,2)(3,2) 映射到基中坐标:

    (12121212)(32)=(5212) \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{pmatrix} \binom{3}{2} =\binom{\frac{5}{\sqrt{2}}}{-\frac{1}{\sqrt{2}}}

    基变换公式完整表达:
    (p1p2...pR)(a1a2...aM)=(p1a1p1a2...p1aMp2a1p2a2...p2aM............pRa1pRa2...pRaM) \begin{pmatrix} p_1\\ p_2\\ ...\\ p_R \end{pmatrix} \begin{pmatrix} a_1 & a_2 & ... & a_M \end{pmatrix}= \begin{pmatrix} p_1a_1 & p_1a_2 & ... & p_1a_M\\ p_2a_1 & p_2a_2 & ... & p_2a_M\\ ... & ... & ... & ...\\ p_Ra_1 & p_Ra_2 & ... & p_Ra_M \end{pmatrix}
    两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去

    怎么找基? — 协方差矩阵
    • 方向:如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?
      一种直观的看法是:希望投影后的投影值尽可能分散
    • 方差:
      Var(a)=1mi=1m(aiμ)2 Var(a) = \frac{1}{m}\sum_{i=1}^{m}(a_i-\mu)^2
    • 目标:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大
    • 协方差(假设均值为0时,数据归一化):
      方差是一个特征的分散程度,协方差是表示两个特征之间的相关性,两个特征变化越相似的则协方差越大
      Cov(a,b)=1mi=1maibi Cov(a,b)=\frac{1}{m}\sum_{i=1}^{m}a_ib_i

    如果单纯只选择方差最大的方向,后续方向应该会和方差最大的方向接近重合,那么这样就会使得它们之间存在(线性)相关性的,为了让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,那么我们需要找到相互垂直的基,这时候就要使用协方差解决,协方差可以用来表示其相关性

    当协方差为0时,表示两个字段完全独立。为了让协方差为0,选择第二个基时
    只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的

    优化目标:

    将一组N维向量降为K维(K大于0,小于N),目标是选择K个单位正交基,使原始数据变换到这组基上后,各字段两两间协方差为0,字段的方差则尽可能大

    协方差矩阵:
    X=(a1a2...amb1b2...bm) X= \begin{pmatrix} a_1 & a_2 & ... & a_m\\ b_1 & b_2 & ... & b_m \end{pmatrix}
    1mXXT=(1mi=1mai21mi=1maibi1mi=1maibi1mi=1mbi2) \frac{1}{m}XX^T= \begin{pmatrix} \frac{1}{m}\sum_{i=1}^{m}a_i^2 & \frac{1}{m}\sum_{i=1}^{m}a_ib_i \\ \frac{1}{m}\sum_{i=1}^{m}a_ib_i & \frac{1}{m}\sum_{i=1}^{m}b_i^2 \end{pmatrix}
    矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差

    我们的目标是想要使得协方差为0,那就是说要使得协方差矩阵中非对角线的位置处处为0,接下来操作就是进行协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列

    协方差矩阵对角化:
    PCPT=Λ=(λ1λ2λn) PCP^T=\Lambda = \begin{pmatrix} \lambda_1 & & & \\ & \lambda_2 & & \\ & & \ddots & \\ & & & \lambda_n \end{pmatrix}

    进行协方差矩阵对角化时,我们要用到实对称矩阵方法

    实对称矩阵:一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量
    E=(e1e2...en) E= \begin{pmatrix} e_1 & e_2 & ... & e_n \end{pmatrix}

    实对称阵可进行对角化:
    ETCE=Λ=(λ1λ2λn) E^TCE=\Lambda = \begin{pmatrix} \lambda_1 & & & \\ & \lambda_2 & & \\ & & \ddots & \\ & & & \lambda_n \end{pmatrix}

    根据特征值的从大到小,将特征向量从上到下排列,则用前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y

    PCA实例:

    假设数据为两个特征的五条数据(二维化一维)

    数据(1102020011)\begin{pmatrix} -1 & -1 & 0 & 2 & 0\\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}

    协方差矩阵C=15(1102020011)(1210002101)=(65454565)C=\frac{1}{5}\begin{pmatrix} -1 & -1 & 0 & 2 & 0\\ -2 & 0 & 0 & 1 & 1 \end{pmatrix} \begin{pmatrix} -1 & -2\\ -1 & 0\\ 0 & 0\\ 2 & 1\\ 0 & 1 \end{pmatrix}= \begin{pmatrix} \frac{6}{5} & \frac{4}{5}\\ \frac{4}{5} & \frac{6}{5} \end{pmatrix}

    特征值λ1=2,λ2=25\lambda_1=2,\lambda_2=\frac{2}{5}

    特征向量c1(11),c2(11)c_1\binom{1}{1},c_2\binom{-1}{1}

    对角化PCPT=(12121212)(65454565)(12121212)=(20025)PCP^T= \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{pmatrix} \begin{pmatrix} \frac{6}{5} & \frac{4}{5}\\ \frac{4}{5} & \frac{6}{5} \end{pmatrix} \begin{pmatrix} \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{pmatrix}= \begin{pmatrix} 2 & 0\\ 0 & \frac{2}{5} \end{pmatrix}

    降维:Y=(1212)(1102020011)=(321203212)Y=\begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{pmatrix} \begin{pmatrix} -1 & -1 & 0 & 2 & 0\\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}= \begin{pmatrix} -\frac{3}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 & \frac{3}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}

    PCA算法代码练习

    # 读取数据
    import numpy as np
    import pandas as pd
    df = pd.read_csv('iris.data')
    # 指定列名
    df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
    # 将数据表拆分为数据X和类标签y
    X = df.ix[:,0:4].values
    y = df.ix[:,4].values
    

    数据可视化展示

    from matplotlib import pyplot as plt
    import math
    label_dict = {1: 'Iris-Setosa',
                  2: 'Iris-Versicolor',
                  3: 'Iris-Virgnica'}
    feature_dict = {0: 'sepal length [cm]',
                    1: 'sepal width [cm]',
                    2: 'petal length [cm]',
                    3: 'petal width [cm]'}
    plt.figure(figsize=(8, 6))
    for cnt in range(4):
        plt.subplot(2, 2, cnt+1)
        for lab in ('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'):
            plt.hist(X[y==lab, cnt],
                         label=lab,
                         bins=10,
                         alpha=0.3,)
        plt.xlabel(feature_dict[cnt])
        plt.legend(loc='upper right', fancybox=True, fontsize=8)
    plt.tight_layout()
    plt.show()
    

    在这里插入图片描述
    对数据进行标准化:

    from sklearn.preprocessing import StandardScaler
    X_std = StandardScaler().fit_transform(X)
    
    mean_vec = np.mean(X_std, axis=0)
    cov_mat = (X_std - mean_vec).T.dot((X_std - mean_vec)) / (X_std.shape[0]-1)
    print('协方差矩阵 \n%s' %cov_mat)
    
    协方差矩阵 
    [[ 1.00675676 -0.10448539  0.87716999  0.82249094]
     [-0.10448539  1.00675676 -0.41802325 -0.35310295]
     [ 0.87716999 -0.41802325  1.00675676  0.96881642]
     [ 0.82249094 -0.35310295  0.96881642  1.00675676]]
    

    计算特征值和特征向量:

    cov_mat = np.cov(X_std.T)
    eig_vals, eig_vecs = np.linalg.eig(cov_mat)
    print('特征向量 \n%s' %eig_vecs)
    print('\n特征值 \n%s' %eig_vals)
    
    特征向量 
    [[ 0.52308496 -0.36956962 -0.72154279  0.26301409]
     [-0.25956935 -0.92681168  0.2411952  -0.12437342]
     [ 0.58184289 -0.01912775  0.13962963 -0.80099722]
     [ 0.56609604 -0.06381646  0.63380158  0.52321917]]
    
    特征值 
    [2.92442837 0.93215233 0.14946373 0.02098259]
    

    将特征值与特征向量进行对应:

    # 列出(特征值,特征向量)元组
    eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]
    print (eig_pairs)
    # 将(特征值,特征向量)元组从高到低排序
    eig_pairs.sort(key=lambda x: x[0], reverse=True)
    # 通过降序特征值来直观地确认列表已正确排序
    print('\n降序特征值:')
    for i in eig_pairs:
        print(i[0])
    
    [(2.9244283691111144, array([ 0.52308496, -0.25956935,  0.58184289,  0.56609604])), (0.9321523302535064, array([-0.36956962, -0.92681168, -0.01912775, -0.06381646])), (0.14946373489813314, array([-0.72154279,  0.2411952 ,  0.13962963,  0.63380158])), (0.020982592764270606, array([ 0.26301409, -0.12437342, -0.80099722,  0.52321917]))]
    
    降序特征值:
    2.9244283691111144
    0.9321523302535064
    0.14946373489813314
    0.020982592764270606
    

    做特征值的百分占比,看各特征值的重要性

    tot = sum(eig_vals)
    # 求特征值的百分占比
    var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)]
    print (var_exp)
    # 做累加
    cum_var_exp = np.cumsum(var_exp)
    cum_var_exp
    
    [72.62003332692034, 23.147406858644135, 3.7115155645845164, 0.5210442498510154]
    array([ 72.62003333,  95.76744019,  99.47895575, 100.        ])
    

    画特征值的百分占比及重要性趋势图

    from matplotlib import pyplot as plt
    
    plt.figure(figsize=(6, 4))
    
    plt.bar(range(4), var_exp, alpha=0.5, align='center',
                label='individual explained variance')
    plt.step(range(4), cum_var_exp, where='mid',
                 label='cumulative explained variance')
    plt.ylabel('Explained variance ratio')
    plt.xlabel('Principal components')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    

    在这里插入图片描述
    至此可以看出,前两维度的特征已经是占了95%以上的重要性,后面两个维度对结果的影响不大,那么这里就可以降到两维

    # 拿到前两个特征向量
    matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),
                          eig_pairs[1][1].reshape(4,1)))
    print('矩阵 W:\n', matrix_w)
    # 执行降维:原数据*特征向量
    Y = X_std.dot(matrix_w)
    
    完成降维后,来看一下分类结果:

    原始数据:

    plt.figure(figsize=(6, 4))
    for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),
                            ('blue', 'red', 'green')):
         plt.scatter(X[y==lab, 0],
                    X[y==lab, 1],
                    label=lab,
                    c=col)
    plt.xlabel('sepal_len')
    plt.ylabel('sepal_wid')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    

    在这里插入图片描述
    降维后的数据:

    plt.figure(figsize=(6, 4))
    for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),
                            ('blue', 'red', 'green')):
         plt.scatter(Y[y==lab, 0],
                    Y[y==lab, 1],
                    label=lab,
                    c=col)
    plt.xlabel('Principal Component 1')
    plt.ylabel('Principal Component 2')
    plt.legend(loc='lower center')
    plt.tight_layout()
    plt.show()
    
    使用数据标准化的降维结果:

    在这里插入图片描述

    使用数据归一化的降维结果:

    在这里插入图片描述
    结果显示,对于此数据来说,进行归一化能够更好的将数据进行分类

    在Sklearn中也有相对应的 PCA 算法的 API
    from sklearn.decomposition import PCA
    # LDA 实例化 降低为2维
    sklearn_lda = PCA(n_components=2)
    # 执行
    X_pca_sklearn = sklearn_lda.fit_transform(X)
    

    查看结果:

    plt.figure(figsize=(6, 4))
    for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),
                            ('blue', 'red', 'green')):
         plt.scatter(X_pca_sklearn[y==lab, 0],
                    X_pca_sklearn[y==lab, 1],
                    label=lab,
                    c=col)
    plt.xlabel('Principal Component 1')
    plt.ylabel('Principal Component 2')
    plt.legend(loc='lower center')
    plt.tight_layout()
    plt.show()
    

    在这里插入图片描述
    对比这几个结果,Sklearn 与 我们自己写的代码效果差不多

    展开全文
  • 视频测试信号的幅度和饱和

    千次阅读 2015-05-19 22:08:58
    信号幅度彩条的幅度可以由以下公式计算得到: 式中 分子为对应彩条的最大分量,分母为基准白色的最大分量。75%和100%的彩条选定基准白色为(255,255,255),则100%幅度的彩条如下表: 75%幅度的彩条如
  • 由前面介绍的换算公式当我们要设置rem值时,就是 <p><code>Y = X / 37.5</code> (浏览器在计算的时候,实际是 37.5 * x / 37.5) <h3>2.1 lib-flexible 对0.5像素的支持 查看<code>lib...
  • 如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现(即代表它有明显的区分度),则认为此词或者短语具有很好的类别区分能力,适合分类 一些基础概念:文章画像是描述每篇文章以给定一些词。主要...
  • mysql索引和锁

    2018-11-05 16:49:33
    索引总结 ...2,尽量选择区分度高的列作为索引,区分度公式是 COUNT(DISTINCT col) / COUNT(*)。表示字段不重复的比率,比率越大我们扫描的记录数就越少。 3,索引列不能参与计算,尽量保持列“干...
  • OTSU算法原理简述: 最大类间方差是由日本学者大津(Nobuyuki...然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。 公式: 记M = 256 单通道灰度分级 Sum = 像素总数 背景像素占比 前景像素占比 ...
  • OTSU算法原理简述: 最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。...然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。 公式:  记...
  • 参照网上的一个案例“参照的为绘制的是一个动态的圆环”,现在我的需求...首先根据图可以看到起点和重点,看坐标知道起点是-240,这个正负还是要区分的,每一弧度的计算公式 将角度转换为弧度: var radians = degree
  • MATLAB实现OTSU

    2019-12-08 10:32:50
    文章目录1.OTSU算法原理简述:2.MATLAB实现代码 1.OTSU算法原理简述: 最大类间方差是由日本学者大津...然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。 公式: 记 M = 256 单通道灰度分级 S...
  • 他的5条公式是其核心内容,结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式. 用一个简单的小例子:假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的, 也...
  • 协同过滤算法总结篇

    2019-09-18 06:39:51
    1.1Jaccard距离使用集合中的不同元素的比例来衡量两个集合的区分度,但是存在比较明显的问题无法关注到集合中元素的权重值(评分) 1.2余弦相似度利用向量空间解决了权重值(评分)带入相似度计算的问题,非常常用的...
  • 数据库索引规约

    2020-08-05 21:46:18
    本文学习自阿里巴巴编码规范,只作为学习笔记,如需详细了解请自行查看阿里编码规范 1.业务上具有唯一特性的字段,哪怕是多个字段的组合,也必须要建成唯一...计算公式是:count(distinct left(c_address,20))/count(*)
  • OTSU算法原理

    千次阅读 2015-08-02 22:42:33
    OTSU算法原理及实现: 最大类间方差是由日本学者大津...然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大【用方差表达,具体公式见后】。OTSU的扩展算法,可进行多级阈值处理,称为“Multi Otsu met
  • 内容参考原文《A Threshold Selection ...然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大【用方差表达,具体公式见后】。OTSU的扩展算法,可进行多级阈值处理,称为“Multi Otsu method”【题外话】
  • 顾客需求既是方案设计的起点,也是方案设计的终点,...计算结果表明,与传统PROMETHEE群决策方法相比,所提方法无须确定专家权重,且避免了各方案净流量值区分度变小的问题,有效提高了方案排序结果的客观性和准确性。
  • 卡尔曼滤波一

    2018-07-23 10:56:25
    他的5条公式是其核心内容,结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式. 用一个简单的小例子:假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的, 也...
  • 简单理解Kalman滤波

    2019-01-09 11:39:36
    他的5条公式是其核心内容,结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式. 用一个简单的小例子:假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的, 也...
  • LR 算法特点: 优点: 计算代价不高,易于理解和实现;... 导致很多区间的变量变化对目标概率的影响没有区分度,不容易确定阀值。       公式推导:       模型解释: 1. 最大似然估计: ...
  • 1.计算盒子大小公式: 盒子的总宽度= width+左右padding+左右border 盒子的总高度= width+上下padding+上下border 做个测试:给两个div盒子加同样大小的padding和border,并给两个盒子不同的背景颜色(background-...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
热门标签
关键字:

区分度计算公式