精华内容
下载资源
问答
  • R语言马氏距离判别法

    2021-01-06 07:19:14
    没啥好解释的,就放个代码和运行结果吧 #数据准备 x1<-c(3,3,2,3,3,3,3,3,2,2,1,3,2,1,2,2,2,3,3,2,2,2,2,2) x2<-c(28,45,55,55,50,70,75,80,50,35,40,50,35,50,40,45,25,40,50,70,70,45,25,25) ...
  • R语言学习| 马氏距离mahanobis函数

    千次阅读 2021-01-24 13:47:08
    1. 马氏距离定义 2. 源代码 输入mahanobis 即可得到代码: > mahalanobis function (x, center, cov, inverted = FALSE, ...) { x <- if (is.vector(x)) matrix(x, ncol = length(x)) else as.matrix(x...

    1. 马氏距离定义

    在这里插入图片描述

    2. 源代码

    输入mahanobis 即可得到代码:

    > mahalanobis
    function (x, center, cov, inverted = FALSE, ...) 
    {
        x <- if (is.vector(x)) 
            matrix(x, ncol = length(x))
        else as.matrix(x)
        if (!isFALSE(center)) 
            x <- sweep(x, 2L, center)
        if (!inverted) 
            cov <- solve(cov, ...)
        setNames(rowSums(x %*% cov * x), rownames(x))
    }
    <bytecode: 0x0000000003e30778>
    <environment: namespace:stats>
    

    3. 案例操作

    数据:7个变量(x1,x2,……x7);12个样本
    目标:计算每个样本到总体的马氏距离

    数据录入:

    classX1<-data.frame(
      x1=c(6.60, 6.60, 6.10, 6.10, 8.40, 7.2, 8.40, 7.50,
           7.50, 8.30, 7.80, 7.80),
      x2=c(39.00,39.00, 47.00, 47.00, 32.00, 6.0, 113.00, 52.00,
           52.00,113.00,172.00,172.00),
      x3=c(1.00, 1.00, 1.00, 1.00, 2.00, 1.0, 3.50, 1.00,
           3.50, 0.00, 1.00, 1.50),
      x4=c(6.00, 6.00, 6.00, 6.00, 7.50, 7.0, 6.00, 6.00,
           7.50, 7.50, 3.50, 3.00),
      x5=c(6.00, 12.00, 6.00, 12.00, 19.00, 28.0, 18.00, 12.00,
           6.00, 35.00, 14.00, 15.00),
      x6=c(0.12, 0.12, 0.08, 0.08, 0.35, 0.3, 0.15, 0.16,0.16, 0.12, 0.21, 0.21), 
      x7=c(20.00,20.00, 12.00, 12.00, 75.00, 30.0, 75.00, 40.00,
           40.00,180.00, 45.00, 45.00)
    )
    

    1. 直接带入函数计算马氏距离:

    classX1 <- as.matrix(classX1) # 源代码中有把数据转化为矩阵的步骤,这里重新定义classX1,只是用来计算均值和方差.
    n1 <- nrow(classX1)
    S  <- (n1-1)*var(classX1)
    mu1<-colMeans(classX1)
    mahalanobis(classX1,mu1,S)
     [1] 0.3018766 0.1541574 0.2973262 0.3084365 0.7051001 0.7761428 0.7316278 0.6880709 0.6616244 0.9029164 0.7775262 0.6951945
    

    2. 源代码 主要步骤学习:

    function (x, center, cov, inverted = FALSE, ...)  
    {
        # cov <- make.positive.definite (cov) 若矩阵不可逆
        x <- if (is.vector(x))    
            matrix(x, ncol = length(x))
        else as.matrix(x)  # 将X转换为矩阵形式
        
        if (!isFALSE(center))  # 如果样本不是均值(中心),则用sweep函数计算(x-mu)
            x <- sweep(x, 2L, center) #2L:按照列的方向计算 12列
        if (!inverted)  # 默认值为 inverted = FALSE
            cov <- solve(cov, ...)   
        setNames(rowSums(x %*% cov * x), rownames(x))
    }
    
    

    【注释】 sweep () 函数 :

     > classX1
           x1  x2  x3  x4 x5   x6  x7
     [1,] 6.6  39 1.0 6.0  6 0.12  20
     [2,] 6.6  39 1.0 6.0 12 0.12  20
     [3,] 6.1  47 1.0 6.0  6 0.08  12
     [4,] 6.1  47 1.0 6.0 12 0.08  12
     [5,] 8.4  32 2.0 7.5 19 0.35  75
     [6,] 7.2   6 1.0 7.0 28 0.30  30
     [7,] 8.4 113 3.5 6.0 18 0.15  75
     [8,] 7.5  52 1.0 6.0 12 0.16  40
     [9,] 7.5  52 3.5 7.5  6 0.16  40
    [10,] 8.3 113 0.0 7.5 35 0.12 180
    [11,] 7.8 172 1.0 3.5 14 0.21  45
    [12,] 7.8 172 1.5 3.0 15 0.21  45
    > mu1 = colMeans(classX1)
     x1         x2         x3         x4         x5         x6          
     7.3583333 73.6666667  1.4583333  6.0000000 15.2500000  0.1716667 
    x7
    49.5000000 
    > x<-sweep(TrnX1,2L,mu1)  #用classX1的每一个值 减去mu1  
    > x
                  x1        x2          x3   x4    x5          x6    x7
     [1,] -0.7583333 -34.66667 -0.45833333  0.0 -9.25 -0.05166667 -29.5
     [2,] -0.7583333 -34.66667 -0.45833333  0.0 -3.25 -0.05166667 -29.5
     [3,] -1.2583333 -26.66667 -0.45833333  0.0 -9.25 -0.09166667 -37.5
     [4,] -1.2583333 -26.66667 -0.45833333  0.0 -3.25 -0.09166667 -37.5
     [5,]  1.0416667 -41.66667  0.54166667  1.5  3.75  0.17833333  25.5
     [6,] -0.1583333 -67.66667 -0.45833333  1.0 12.75  0.12833333 -19.5
     [7,]  1.0416667  39.33333  2.04166667  0.0  2.75 -0.02166667  25.5
     [8,]  0.1416667 -21.66667 -0.45833333  0.0 -3.25 -0.01166667  -9.5
     [9,]  0.1416667 -21.66667  2.04166667  1.5 -9.25 -0.01166667  -9.5
    [10,]  0.9416667  39.33333 -1.45833333  1.5 19.75 -0.05166667 130.5
    [11,]  0.4416667  98.33333 -0.45833333 -2.5 -1.25  0.03833333  -4.5
    [12,]  0.4416667  98.33333  0.04166667 -3.0 -0.25  0.03833333  -4.5
    

    【注释】 对于不可逆矩阵,使其正定:

    方法1(稍稍改变矩阵的eigen value 使其正定):

    # Method by Higham 1988  
    make.positive.definite = function(m, tol)
    {
      if (!is.matrix(m))
        m = as.matrix(m)
      
      d = dim(m)[1]
      if (dim(m)[2] != d)
        stop("Input matrix is not square!") #判断是否是方阵
      
      es = eigen(m, symmetric = TRUE)
      esv = es$values
      
      if (missing(tol))
        tol = d * max(abs(esv)) * .Machine$double.eps
      delta =  2 * tol
      
      tau = pmax(0, delta - esv)
      dm = es$vectors %*% diag(tau, d) %*% t(es$vectors)
      
      return(m +  dm)
    

    【注释】计算马氏距离

      setNames(rowSums(x %*% cov * x), rownames(x))
    

    这里我们是计算,x中每一个样本到总体的距离,所以相当于要把每一个一位向量抽离出来,与方差矩阵相乘。因此后面一个乘号不是矩阵相乘,最后在用加法按照行的方向进行求和,得出12个(样本)距离总体的距离。

    原理解析:
    在这里插入图片描述

    上面的公式计算的是一个样本x到总体X的距离,我们假设:
    在这里插入图片描述
    可以得到原方程(一个距离值) =
    在这里插入图片描述
    当我们把两个的样本放在同一个矩阵中时,我们假设:
    在这里插入图片描述
    我们会发现,如果完全按照矩阵相乘,我们最后会得到一个2*2的矩阵,然而我们的计算步骤应该是这样的:
    在这里插入图片描述
    由此我们会发现,

      setNames(rowSums(x %*% cov * x), rownames(x))
    

    对代码的改动以及步骤是:(此处x=t(x))

    1. 不要再对第二个x进行转置
    2. 不要对第二个乘号*进行举证运算
    3. 按照行的方向,对列进行求和
    展开全文
  • round(ED,2) Result: 1 2 3 4 2 10.54 3 9.49 5.74 4 13.30 21.77 18.08 5 9.11 16.85 13.08 7.21 (2) 马氏距离 简单讲解一下以下代码:前4行其实是将协方差矩阵 (Σ1/2)−1(\Sigma^{1/2})^{-1}(Σ1/2)−1做了个谱...

    前言: 将多元统计分析课程上学到的知识以编程的形式展现。

    • 本篇博客使用到的数据如下:
    "Wind" "Solar radiation" "CO" "NO" "NO2" "O3" "HC"
    8 98 7 2 12 8 2
    7 107 4 3 9 5 3
    7 103 4 3 5 6 3
    10 88 5 2 8 15 4
    6 91 4 2 8 10 3
    8 90 5 2 12 12 4
    9 84 7 4 12 15 5
    5 72 6 4 21 14 4
    7 82 5 1 11 11 3
    8 64 5 2 13 9 4
    6 71 5 4 10 3 3
    6 91 4 2 12 7 3
    7 72 7 4 18 10 3
    10 70 4 2 11 7 3
    10 72 4 1 8 10 3
    9 77 4 1 9 10 3
    8 76 4 1 7 7 3
    8 71 5 3 16 4 4
    9 67 4 2 13 2 3
    9 69 3 3 9 5 3
    10 62 5 3 14 4 4
    9 88 4 2 7 6 3
    8 80 4 2 13 11 4
    5 30 3 3 5 2 3
    6 83 5 1 10 23 4
    8 84 3 2 7 6 3
    6 78 4 2 11 11 3
    8 79 2 1 7 10 3
    6 62 4 3 9 8 3
    10 37 3 1 7 2 3
    8 71 4 1 10 7 3
    7 52 4 1 12 8 4
    5 48 6 5 8 4 3
    6 75 4 1 10 24 3
    10 35 4 1 6 9 2
    8 85 4 1 9 10 2
    5 86 3 1 6 12 2
    5 86 7 2 13 18 2
    7 79 7 4 9 25 3
    7 79 5 2 8 6 2
    6 68 6 2 11 14 3
    8 40 4 3 6 5 2
    
    • 数据读取及初步分析
    AirPollution <- read.table('DATA_pollution.txt',header = TRUE)
    pairs(AirPollution,main='Scatterplot Matrix for Airpollution ')
    

    结果:
    在这里插入图片描述
    变量是离散的。 在⼤多数变量对中,散点图变成⼏条平⾏线,并且⽆法观察到趋势。 根据图表,以下变量之间彼此存在线性趋势:

    1. Solar radiation and N O 2 NO_2 NO2
    2. Solar radiation and O 3 O_3 O3
    • 初步统计特征分析

    (1) 均值向量

    # 均值
    Mean = colMeans(AirPollution);   # 对每一列取平均值
    round(Mean,2)    # 四舍五入并保留两位小数
    
    Result:
               Wind Solar.radiation              CO              NO 
               7.50           73.86            4.55            2.19 
                NO2              O3              HC 
              10.05            9.40            3.10 
    

    (2) 协方差矩阵

    # 协方差矩阵
    Cov <- cov(AirPollution)
    round(Cov,2)
    
    Result:
                     Wind Solar.radiation    CO    NO   NO2    O3   HC
    Wind             2.50           -2.78 -0.38 -0.46 -0.59 -2.23 0.17
    Solar.radiation -2.78          300.52  3.91 -1.39  6.76 30.79 0.62
    CO              -0.38            3.91  1.52  0.67  2.31  2.82 0.14
    NO              -0.46           -1.39  0.67  1.18  1.09 -0.81 0.18
    NO2             -0.59            6.76  2.31  1.09 11.36  3.13 1.04
    O3              -2.23           30.79  2.82 -0.81  3.13 30.98 0.59
    HC               0.17            0.62  0.14  0.18  1.04  0.59 0.48
    

    (3) 相关系数矩阵

    # 相关系数矩阵
    Cor <- cor(AirPollution)
    round(Cor,2)
    
    Result:
                     Wind Solar.radiation    CO    NO   NO2    O3   HC
    Wind             1.00           -0.10 -0.19 -0.27 -0.11 -0.25 0.16
    Solar.radiation -0.10            1.00  0.18 -0.07  0.12  0.32 0.05
    CO              -0.19            0.18  1.00  0.50  0.56  0.41 0.17
    NO              -0.27           -0.07  0.50  1.00  0.30 -0.13 0.23
    NO2             -0.11            0.12  0.56  0.30  1.00  0.17 0.45
    O3              -0.25            0.32  0.41 -0.13  0.17  1.00 0.15
    HC               0.16            0.05  0.17  0.23  0.45  0.15 1.00
    

    第i⾏和第j列中的数字表⽰第i个和第j个变量之间的样本相关性。 例如,以下相关矩阵的第⼀⾏和第三列中的数字 R[1,3] 表⽰Wind和CO之间的相关性。

    • 欧式与马氏距离的计算

    (1) 欧式距离

    # 前5天数据之间的欧式距离
    ED <- dist(AirPollution[1:5,]);
    round(ED,2)
    
    Result:
          1     2     3     4
    2 10.54                  
    3  9.49  5.74            
    4 13.30 21.77 18.08      
    5  9.11 16.85 13.08  7.21
    

    (2) 马氏距离

    简单讲解一下以下代码:前4行其实是将协方差矩阵 ( Σ 1 / 2 ) − 1 (\Sigma^{1/2})^{-1} (Σ1/2)1做了个谱分解,拿这个矩阵去乘以其他矩阵可以起到标准化的作用。而我们知道,各分量不相关的马氏距离即为各分量经标准化后的欧氏距离。值得注意的是, ( Σ 1 / 2 ) − 1 (\Sigma^{1/2})^{-1} (Σ1/2)1左乘或者右乘数据矩阵得到的马氏距离是一样的,说明标准化的结果是一样的。

    # 马氏距离
    eCov <- eigen(Cov)   # 计算Cov矩阵的特征值与特征向量
    SrDIV <- diag(eCov$values^(-1/2)) # 用特征值的-1/2次方生成对角矩阵
    U <- eCov$vectors   # Cov矩阵的特征向量
    SrDIV <- U %*% SrDIV %*% t(U)
    Y <- as.matrix(AirPollution[1:5,]) %*% SrDIV
    MD <- dist(Y)
    round(MD,2)
    
    Result:
         1    2    3    4
    2 4.22               
    3 4.52 1.63          
    4 4.69 3.81 3.40     
    5 4.10 2.06 2.10 3.31
    

    通过标准化,⻢⽒距离消除了变量规模差异及其相关性的影响。

    • 广义方差与总方差

    (1) 广义方差

    # 行列式
    Gv <- det(Cov)
    round(Gv,2)
    
    Result:
    35307.53
    

    (2) 总方差

    # 迹
    Tv <- sum(diag(Cov));
    round(Tv,2)
    
    Result:
    348.54
    

    污染数据具有较⼤的⼴义⽅差和较⼤的总⽅差。这主要是由于太阳辐射的相对较⼤的变化。

    • 矩阵的谱分解与Cholesky分解

    目前我学的是将这两种方法应用到多元正态分布的标准化与多元正态分布等高线的计算。
    (1) 谱分解
    这个其实就是用特征值和特征向量的组合表示矩阵,就不写代码了。谱分解的表达式如下:

    Σ = ∑ j = 1 p λ j e j e j ′ \Sigma = \sum_{j=1}^{p} \lambda_j e_j e_j' Σ=j=1pλjejej
    其中 e j ( j = 1 , 2 , ⋯   , p ) e_j(j=1,2,\cdots,p) ej(j=1,2,,p)为正交单位向量组,且 Σ 1 / 2 \Sigma^{1/2} Σ1/2 Σ \Sigma Σ的特征向量相同,且都为对称矩阵。

    关于谱分解我有几点想说的:

    • 谱分解其实就是利用相似对角化的定义得来的, P − 1 Σ P = Λ P^{-1}\Sigma P=\Lambda P1ΣP=Λ => Σ = P Λ P − 1 \Sigma = P \Lambda P^{-1} Σ=PΛP1,再将 P Λ P − 1 P \Lambda P^{-1} PΛP1展开便可得到谱分解的表达式。
    • 做谱分解的前提是矩阵为对称矩阵,因为这样肯定可以相似对角化。

    (2) Cholesky分解
    Cholesky分解的表达式为:
    Σ = T ′ T \Sigma = T'T Σ=TT
    其中 T T T Σ \Sigma Σ的Cholesky分解得到的非奇异上三角矩阵。此时平方根矩阵可以表示为 Σ 1 / 2 = T ′ \Sigma^{1/2}=T' Σ1/2=T

    关于Cholesky分解我有几点想说的:

    • Cholesky分解适用于正定矩阵,且得到的 T T T对角线元素为正数(正定矩阵一定为对称矩阵)。
    • Cholesky分解类似于平方的定义,因此也好理解为什么Cholesky分解适用于正定矩阵。至于为什么对角线元素都为正数,我的理解是Cholesky表达式两边的行列式想等,左边为正数,右边自然也得为正数。
    # Cholesky分解
    PP <- chol(Cov);
    round(PP,2)
    
    Result:
                    Wind Solar.radiation    CO    NO   NO2    O3   HC
    Wind            1.58           -1.76 -0.24 -0.29 -0.37 -1.41 0.11
    Solar.radiation 0.00           17.25  0.20 -0.11  0.35  1.64 0.05
    CO              0.00            0.00  1.19  0.52  1.81  1.80 0.13
    NO              0.00            0.00  0.00  0.90  0.08 -2.21 0.16
    NO2             0.00            0.00  0.00  0.00  2.80 -0.38 0.29
    O3              0.00            0.00  0.00  0.00  0.00  4.24 0.21
    HC              0.00            0.00  0.00  0.00  0.00  0.00 0.54
    

    谱分解利⽤特征值和特征向量,它可以应⽤于任何对称矩阵.Cholesky分解要求矩阵是正定的,并且获得的矩阵是⾮奇异的上三⻆矩阵。

    展开全文
  • 马氏距离代码

    2013-08-06 23:30:20
    计算光谱之间的马氏距离,达到聚类和模式识别的功能!
  • R语言:计算各种距离

    2021-10-11 18:58:08
    R语言:计算各种距离 MATLAB 版本的 http://blog.csdn.net/sinat_26917383/article/details/52101425 PYTHON版本的 http://book.2cto.com/201511/58274.html ===================================================...

    R语言:计算各种距离

    MATLAB 版本的
    http://blog.csdn.net/sinat_26917383/article/details/52101425

    PYTHON版本的
    http://book.2cto.com/201511/58274.html

    =================================================================================================================================================

    在做分类时常常需要估算不同样本之间的相似性(Similarity Measurement),这时通常采用的方法就是计算样本间”距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。

    本文的目的就是对常用的相似性度量做一个总结。

    本文目录:

    闵可夫斯基距离
    欧氏距离
    曼哈顿距离
    切比雪夫距离
    标准化欧式距离
    马氏距离
    夹角余弦
    汉明距离
    杰卡德距离&杰卡德相似系数
    相关系数&相关距离
    信息熵
    kl散度(Kullback-Leible散度)
    兰式距离(Lance and Williams distance,或Canberra Distance)

    ================================================
    1、欧式距离(Euclidean Distance)
    欧式距离是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式。
    两个n维向量a与b间的欧式距离:

    用R语言计算距离主要是dist函数。若X是一个M×N的矩阵,则dist(X)将X矩阵M行的每一行作为一个N维向量,然后计算这M个向量两两间的距离。

     

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
               [,1]       [,2]        [,3]       [,4]       [,5]
    [1,] -1.6486207 -0.2149357 -0.02125219  0.0211059 -2.4320995
    [2,] -0.2600026 -1.0145245 -0.24380395 -1.4597659 -0.8684985
    [3,]  0.3500116  1.0524999  0.67703932  4.0102187  0.5309405
    > dist(aa,p=2)
             1        2
    2 2.693503         
    3 5.548077 6.113250

    第一个行与第二行的距离为2.693503;第二行与第三行的距离为6.113250;第一行与第三行的距离为5.548077

    2、曼哈顿距离(Manhattan Distance)

    从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)。

    两个n维向量a(a1;a2;…;an)与 b(b1;b2;…;bn)间的曼哈顿距离


    R语言计算曼哈顿距离

     

    > aa=matrix(rnorm(15,0,1),c(3,5))


    > dist(aa,"manhattan")
             1        2
    2 7.888601         
    3 5.944147 5.029586

    第一行与第二行的距离为7.888601,第二行与第三行的距离为5.029586。第一行与第二行的距离为5.944147。

    3、切比雪夫距离(Chebyshev Distance)

    国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。
    两个n维向量a(a1;a2;…;an)与 b(b1;b2;…;bn)间的曼哈顿距离

     R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
              [,1]       [,2]       [,3]       [,4]       [,5]
    [1,] 0.3186289  0.8924295 -1.4619398  2.0500080 -0.9411515
    [2,] 0.1582820  0.9655279 -0.9702412 -0.8561219  0.2322826
    [3,] 0.7457046 -2.2780280 -0.7043906 -0.1458262  1.0166551
    > dist(aa,"maximum")
             1        2
    2 2.906130         
    3 3.170458 3.243556

    4、闵可夫斯基距离(Minkowski Distance)
    闵可夫斯基距离不是一种距离,而是一组距离的定义
    (1)闵可夫斯基距离的定义
    两个n维变量a(a1;a2;...;an)a(a1;a2;...;an)与b(b1;b2;...;bn)b(b1;b2;...;bn)间的闵可夫斯基距离的定义为:

    其中p为一个变参数
    - 当p=1p=1时,就是曼哈顿距离;
    - 当p=2p=2时,就是欧式距离;
    - 当p→∞p→∞时,就是切比雪夫距离;

     

    (2)闵可夫斯基距离的缺点
    闵可夫斯基距离,包含曼哈顿距离、欧式距离和切比雪夫距离都存在明显的缺点。

    举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。
    简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

    dist函数默认p=2
    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
               [,1]       [,2]      [,3]        [,4]         [,5]
    [1,] -1.0308810 -0.8312748  2.155180 -0.03742647 -0.009221875
    [2,]  0.4809107  0.2089795  1.036577 -0.18443966 -0.739891640
    [3,]  0.2201239  0.9085380 -2.424723 -1.41154591  0.310477668
    > dist(aa,"minkowski")
             1        2
    2 2.274732         
    3 5.249560 3.891922

    5、标准化欧氏距离 (Standardized Euclidean distance )
    (1)标准欧氏距离的定义
      标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:
      而且标准化变量的数学期望为0,方差为1。因此样本集的标准化过程(standardization)用公式描述就是:

     

    标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差
      经过简单的推导就可以得到两个n维向量a(a1,a2,…,an)与 b(b1,b2,…,bn)间的标准化欧氏距离的公式:
      如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。

    R语言代码:

     

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
              [,1]       [,2]       [,3]      [,4]       [,5]
    [1,] 0.7233675 -2.2366853  0.2925270  0.145778 2.21037802
    [2,] 0.6626326  1.1180383 -0.9277047 -1.632137 0.05656014
    [3,] 1.7862817  0.2219847 -1.3089391  1.317257 1.44481446
    > aa1 = scale(t(aa), center=T,scale=T)
    > aa1
                [,1]       [,2]       [,3]
    [1,]  0.30986940  0.7139633  0.8662527
    [2,] -1.53828705  1.1167893 -0.3723890
    [3,]  0.04086725 -0.6927588 -1.5846052
    [4,] -0.05075789 -1.3158598  0.4948694
    [5,]  1.23830828  0.1778660  0.5958721
    attr(,"scaled:center")
    [1]  0.2270730 -0.1445221  0.6922797
    attr(,"scaled:scale")
    [1] 1.601625 1.130527 1.262913
    > aaa <- matrix(rep(0,9),3,3)
    > aaa
         [,1] [,2] [,3]
    [1,]    0    0    0
    [2,]    0    0    0
    [3,]    0    0    0
    > bb <-c(1,1,1,1,1)#方差
    > bb
    [1] 1 1 1 1 1
    > for (i in 1:3)
    +     for (j in 1:3)
    +         if (i<j)
    +             aaa[i,j] <- sqrt(sum(((aa1[,j] - aa1[,i])/bb)^2))
    > aaa
         [,1]     [,2]     [,3]
    [1,]    0 3.236657 2.240865
    [2,]    0 0.000000 2.547490
    [3,]    0 0.000000 0.000000


    6、马氏距离(Mahalanobis Distance)
    (1)马氏距离定义
    有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量Xi到u的马氏距离表示为:

    而其中向量Xi与Xj之间的马氏距离定义为:

     


    若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:


    也就是欧氏距离了。
    若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

     

    (2)马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。

    R语言代码:

    mashi <-function(a,b)
    {
    #a,b均为向量
    return (((a-b)%*% t(t(a-b))) / cov(a,b))
    }

    例子:

    > a=rnorm(5,0,1)
    > b=rnorm(5,1,1)
    > a
    [1] -1.2162212  0.3688722  0.3144903  0.5182250  0.4402706
    > b
    [1] 0.07437722 1.29657555 1.97632344 0.51883332 0.26438674
    > mashi(a,b)
             [,1]
    [1,] 20.39844

    7、夹角余弦(Cosine)
    有没有搞错,又不是学几何,怎么扯到夹角余弦了?各位看官稍安勿躁。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。
    (1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

    (2) 两个n维样本点a(a1;a2;…;an)与 b(b1;b2;…;bn)的夹角余弦

     


    夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。
    夹角余弦的具体应用可以参阅参考文献[1]。

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
              [,1]       [,2]       [,3]       [,4]       [,5]
    [1,]  1.390935  0.2061215 -0.4412572 -0.1490162 -0.6332618
    [2,] -1.404099  1.7485971  1.0966853  0.7876016  1.0543667
    [3,]  1.571527 -0.5391710  0.1622600  0.6927980 -1.1825320
    > bb <- matrix(rep(0,9),3,3)
    > bb
         [,1] [,2] [,3]
    [1,]    0    0    0
    [2,]    0    0    0
    [3,]    0    0    0
    > for (i in 1:3)
    +   for (j in 1:3)
    +     if (i < j)
    +       bb[i,j] = sum(t(aa[i,])*aa[j,])/sqrt((sum(aa[i,]^2))*sum(aa[j,]^2))
    > bb
         [,1]       [,2]       [,3]
    [1,]    0 -0.6294542  0.7612659
    [2,]    0  0.0000000 -0.6025365
    [3,]    0  0.0000000  0.0000000

    8、汉明距离(Hamming distance)
    (1)汉明距离的定义
    两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。
    应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

    > library(e1071)
    > x <- c(1, 0, 0)
    > y <- c(1, 0, 1)
    > hamming.distance(x, y)
    [1] 1

    9、杰卡德相似系数(Jaccard similarity coefficient)
    (1) 杰卡德相似系数
    两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。


    杰卡德相似系数是衡量两个集合的相似度一种指标。

     

    (2) 杰卡德距离
    与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:


    杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
    (3) 杰卡德相似系数与杰卡德距离的应用
    可将杰卡德相似系数用在衡量样本的相似度上。
       样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。
    p :样本A与B都是1的维度的个数
    q :样本A是1,样本B是0的维度的个数
    r :样本A是0,样本B是1的维度的个数
    s :样本A与B都是0的维度的个数
    那么样本A与B的杰卡德相似系数可以表示为:
    这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。
    而样本A与B的杰卡德距离表示为:


    R语言代码:

     

    library(proxy)
    > x <- matrix(sample(c(FALSE, TRUE), 8, rep = TRUE), ncol = 2)
    > x
          [,1]  [,2]
    [1,]  TRUE  TRUE
    [2,] FALSE  TRUE
    [3,] FALSE FALSE
    [4,] FALSE FALSE
    > dist(x, method = "Jaccard")
        1   2   3
    2 0.5        
    3 1.0 1.0    
    4 1.0 1.0 0.0

    10、相关系数 ( Correlation coefficient )与相关距离(Correlation distance)

    (1) 相关系数的定义


    相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。
    相关系数的绝对值越大,则表明X与Y相关度越高。
    当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

     

    (2)相关距离的定义:


    R语言代码:

     

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
               [,1]       [,2]        [,3]        [,4]       [,5]
    [1,] -0.5186859  0.8688277 -0.60667129 -0.93180447 -1.4665178
    [2,]  0.1623851  0.4467074 -0.80715445 -0.34559516  0.1938283
    [3,] -0.8910159 -0.5494911  0.00393534 -0.04257953  0.3308673
    > 1-cor(t(aa))
              [,1]      [,2]     [,3]
    [1,] 0.0000000 0.6291852 1.637603
    [2,] 0.6291852 0.0000000 1.404476
    [3,] 1.6376026 1.4044762 0.000000

    11、信息熵(Information Entropy)
    信息熵并不属于一种相似性度量。那为什么放在这篇文章中啊?这个。。。我也不知道。 (╯▽╰)
    信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。
    计算给定的样本集X的信息熵的公式:


    参数的含义:
    C:样本集X的分类数
    pi:X中第i类元素出现的概率
    信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中C个分类出现的概率一样大时(都是1/C),信息熵取最大值log2(C)。当X只有一个分类时,信息熵取最小值0

     

    test.entropy <- function(d){

    print(d)
    res <- 0
    for(i in 1:length(d))
    {
      if(d[i]!=0)
            res <- res + d[i]*log(d[i])
        }
    return (-res)
    }
    1
    12、kl散度

    刻画两个分布的差异。


    D(spec1||spec2)=∑(spec1∗log(spec1spec2))
    D(spec1||spec2)=∑(spec1∗log(spec1spec2))
    library(seewave)
    data(tico)
    str(tico)
    tico1 <- spec(tico, at=0.65, plot=FALSE)
    tico2 <- spec(tico, at=1.1, plot=FALSE)
    kl.dist(tico1, tico2)    # log2 (binary logarithm)
    kl.dist(tico1, tico2, base=exp(1))  # ln (natural logarithm)

    13、兰式距离

     


    与马氏距离一样,兰氏距离对数据的量纲不敏感。不过兰氏距离假定变量之间相互独立,没有考虑变量之间的相关性。

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
                [,1]         [,2]       [,3]       [,4]       [,5]
    [1,]  0.02289905 -0.007154829 -1.1331360  0.7498863  1.1254641
    [2,] -1.06508101 -0.316642339  0.7597450  0.3327373 -1.4923720
    [3,] -0.67681654  0.188728888 -0.6868684 -0.4417319  0.4783747
    > dist(aa, method = "canberra")
              1         2
    2 14.589357          
    3  6.664461 33.073080

    展开全文
  • R语言--计算各种距离

    万次阅读 2018-03-30 17:29:10
    有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量Xi到u的马氏距离表示为: d ( X i ) = ( X i − u ) T S − 1 ( X i − u ) − − − − − − − − − − − − − − − − − − √ 而...
    
    

    =================================================================================================================================================

    在做分类时常常需要估算不同样本之间的相似性(Similarity Measurement),这时通常采用的方法就是计算样本间”距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。

    本文的目的就是对常用的相似性度量做一个总结。

    本文目录:

    • 闵可夫斯基距离
    • 欧氏距离
    • 曼哈顿距离
    • 切比雪夫距离
    • 标准化欧式距离
    • 马氏距离
    • 夹角余弦
    • 汉明距离
    • 杰卡德距离&杰卡德相似系数
    • 相关系数&相关距离
    • 信息熵
    • kl散度(Kullback-Leible散度)
    • 兰式距离(Lance and Williams distance,或Canberra Distance)

    ================================================
    1、欧式距离(Euclidean Distance)
    欧式距离是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式。
    两个n维向量a与b间的欧式距离:

    d=(ab)T(ab)2

    用R语言计算距离主要是dist函数。若X是一个M×N的矩阵,则dist(X)将X矩阵M行的每一行作为一个N维向量,然后计算这M个向量两两间的距离。

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
               [,1]       [,2]        [,3]       [,4]       [,5]
    [1,] -1.6486207 -0.2149357 -0.02125219  0.0211059 -2.4320995
    [2,] -0.2600026 -1.0145245 -0.24380395 -1.4597659 -0.8684985
    [3,]  0.3500116  1.0524999  0.67703932  4.0102187  0.5309405
    > dist(aa,p=2)
             1        2
    2 2.693503         
    3 5.548077 6.113250

    第一个行与第二行的距离为2.693503;第二行与第三行的距离为6.113250;第一行与第三行的距离为5.548077

    2、曼哈顿距离(Manhattan Distance)

    从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)。

    两个n维向量a(a1;a2;…;an)与 b(b1;b2;…;bn)间的曼哈顿距离

    d=k=1n|akbk|

    R语言计算曼哈顿距离

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > 
    > 
    > dist(aa,"manhattan")
             1        2
    2 7.888601         
    3 5.944147 5.029586
    

    第一行与第二行的距离为7.888601,第二行与第三行的距离为5.029586。第一行与第二行的距离为5.944147。

    3、切比雪夫距离(Chebyshev Distance)

    国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。
    两个n维向量a(a1;a2;…;an)与 b(b1;b2;…;bn)间的曼哈顿距离

    d=maxk|akbk|


    d=limp(k=1n|akbk|p)1/p

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
              [,1]       [,2]       [,3]       [,4]       [,5]
    [1,] 0.3186289  0.8924295 -1.4619398  2.0500080 -0.9411515
    [2,] 0.1582820  0.9655279 -0.9702412 -0.8561219  0.2322826
    [3,] 0.7457046 -2.2780280 -0.7043906 -0.1458262  1.0166551
    > dist(aa,"maximum")
             1        2
    2 2.906130         
    3 3.170458 3.243556

    4、闵可夫斯基距离(Minkowski Distance)
    闵可夫斯基距离不是一种距离,而是一组距离的定义
    (1)闵可夫斯基距离的定义
    两个n维变量a(a1;a2;...;an)

    b(b1;b2;...;bn)

    间的闵可夫斯基距离的定义为:

    d=k=1n|akbk|pp

    其中p为一个变参数
    - 当p=1

    时,就是曼哈顿距离;
    - 当 p=2时,就是欧式距离;
    - 当 p

    时,就是切比雪夫距离;

    (2)闵可夫斯基距离的缺点
    闵可夫斯基距离,包含曼哈顿距离、欧式距离和切比雪夫距离都存在明显的缺点。

    举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。
    简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

    dist函数默认p=2
    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
               [,1]       [,2]      [,3]        [,4]         [,5]
    [1,] -1.0308810 -0.8312748  2.155180 -0.03742647 -0.009221875
    [2,]  0.4809107  0.2089795  1.036577 -0.18443966 -0.739891640
    [3,]  0.2201239  0.9085380 -2.424723 -1.41154591  0.310477668
    > dist(aa,"minkowski")
             1        2
    2 2.274732         
    3 5.249560 3.891922

    5、标准化欧氏距离 (Standardized Euclidean distance )
    (1)标准欧氏距离的定义
      标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:
      而且标准化变量的数学期望为0,方差为1。因此样本集的标准化过程(standardization)用公式描述就是:

    x=xμδ

    标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差
      经过简单的推导就可以得到两个n维向量a(a1,a2,…,an)与 b(b1,b2,…,bn)间的标准化欧氏距离的公式:
      如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。
    d=k=1n(akbkδk)2

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
              [,1]       [,2]       [,3]      [,4]       [,5]
    [1,] 0.7233675 -2.2366853  0.2925270  0.145778 2.21037802
    [2,] 0.6626326  1.1180383 -0.9277047 -1.632137 0.05656014
    [3,] 1.7862817  0.2219847 -1.3089391  1.317257 1.44481446
    > aa1 = scale(t(aa), center=T,scale=T)
    > aa1
                [,1]       [,2]       [,3]
    [1,]  0.30986940  0.7139633  0.8662527
    [2,] -1.53828705  1.1167893 -0.3723890
    [3,]  0.04086725 -0.6927588 -1.5846052
    [4,] -0.05075789 -1.3158598  0.4948694
    [5,]  1.23830828  0.1778660  0.5958721
    attr(,"scaled:center")
    [1]  0.2270730 -0.1445221  0.6922797
    attr(,"scaled:scale")
    [1] 1.601625 1.130527 1.262913
    > aaa <- matrix(rep(0,9),3,3)
    > aaa
         [,1] [,2] [,3]
    [1,]    0    0    0
    [2,]    0    0    0
    [3,]    0    0    0
    > bb <-c(1,1,1,1,1)#方差
    > bb
    [1] 1 1 1 1 1
    > for (i in 1:3)
    +     for (j in 1:3)
    +         if (i<j)
    +             aaa[i,j] <- sqrt(sum(((aa1[,j] - aa1[,i])/bb)^2))
    > aaa
         [,1]     [,2]     [,3]
    [1,]    0 3.236657 2.240865
    [2,]    0 0.000000 2.547490
    [3,]    0 0.000000 0.000000

    6、马氏距离(Mahalanobis Distance)
    (1)马氏距离定义
    有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量Xi到u的马氏距离表示为:

    d(Xi)=(Xiu)TS1(Xiu)

    而其中向量Xi与Xj之间的马氏距离定义为:

    d(Xi,Xj)=(XiXj)TS1(XiXj)

    若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

    d(Xi,Xj)=(XiXj)T(XiXj)

    也就是欧氏距离了。
    若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

    (2)马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。

    R语言代码:

    mashi <-function(a,b)
    {
    #a,b均为向量
    return (((a-b)%*% t(t(a-b))) / cov(a,b))
    }

    例子:

    > a=rnorm(5,0,1)
    > b=rnorm(5,1,1)
    > a
    [1] -1.2162212  0.3688722  0.3144903  0.5182250  0.4402706
    > b
    [1] 0.07437722 1.29657555 1.97632344 0.51883332 0.26438674
    > mashi(a,b)
             [,1]
    [1,] 20.39844

    7、夹角余弦(Cosine)
    有没有搞错,又不是学几何,怎么扯到夹角余弦了?各位看官稍安勿躁。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。
    (1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

    cos(θ)=x1x2+y1y2x21+x22x22+y22

    (2) 两个n维样本点a(a1;a2;…;an)与 b(b1;b2;…;bn)的夹角余弦

    cos(θ)=aTb|a||b|

    夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。
    夹角余弦的具体应用可以参阅参考文献[1]。

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
              [,1]       [,2]       [,3]       [,4]       [,5]
    [1,]  1.390935  0.2061215 -0.4412572 -0.1490162 -0.6332618
    [2,] -1.404099  1.7485971  1.0966853  0.7876016  1.0543667
    [3,]  1.571527 -0.5391710  0.1622600  0.6927980 -1.1825320
    > bb <- matrix(rep(0,9),3,3)
    > bb
         [,1] [,2] [,3]
    [1,]    0    0    0
    [2,]    0    0    0
    [3,]    0    0    0
    > for (i in 1:3)
    +   for (j in 1:3)
    +     if (i < j)
    +       bb[i,j] = sum(t(aa[i,])*aa[j,])/sqrt((sum(aa[i,]^2))*sum(aa[j,]^2))
    > bb
         [,1]       [,2]       [,3]
    [1,]    0 -0.6294542  0.7612659
    [2,]    0  0.0000000 -0.6025365
    [3,]    0  0.0000000  0.0000000

    8、汉明距离(Hamming distance)
    (1)汉明距离的定义
    两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。
    应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

    > library(e1071)
    > x <- c(1, 0, 0)
    > y <- c(1, 0, 1)
    > hamming.distance(x, y)
    [1] 1

    9、杰卡德相似系数(Jaccard similarity coefficient)
    (1) 杰卡德相似系数
    两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

    J(A,B)=|AB||AB|

    杰卡德相似系数是衡量两个集合的相似度一种指标。

    (2) 杰卡德距离
    与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:

    Jδ(A,B)=1J(A,B)=|AB||AB||AB|

    杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
    (3) 杰卡德相似系数与杰卡德距离的应用
    可将杰卡德相似系数用在衡量样本的相似度上。
       样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。
    p :样本A与B都是1的维度的个数
    q :样本A是1,样本B是0的维度的个数
    r :样本A是0,样本B是1的维度的个数
    s :样本A与B都是0的维度的个数
    那么样本A与B的杰卡德相似系数可以表示为:
    这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。
    而样本A与B的杰卡德距离表示为:

    J=pp+q+r

    R语言代码:

    library(proxy)
    > x <- matrix(sample(c(FALSE, TRUE), 8, rep = TRUE), ncol = 2)
    > x
          [,1]  [,2]
    [1,]  TRUE  TRUE
    [2,] FALSE  TRUE
    [3,] FALSE FALSE
    [4,] FALSE FALSE
    > dist(x, method = "Jaccard")
        1   2   3
    2 0.5        
    3 1.0 1.0    
    4 1.0 1.0 0.0

    10、相关系数 ( Correlation coefficient )与相关距离(Correlation distance)

    (1) 相关系数的定义

    ρXY=cov(X,Y)d(X)d(X)=E((XEX)(YEY))d(x)d(X)

    相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。
    相关系数的绝对值越大,则表明X与Y相关度越高。
    当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

    (2)相关距离的定义:

    DXY=1ρXY

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
               [,1]       [,2]        [,3]        [,4]       [,5]
    [1,] -0.5186859  0.8688277 -0.60667129 -0.93180447 -1.4665178
    [2,]  0.1623851  0.4467074 -0.80715445 -0.34559516  0.1938283
    [3,] -0.8910159 -0.5494911  0.00393534 -0.04257953  0.3308673
    > 1-cor(t(aa))
              [,1]      [,2]     [,3]
    [1,] 0.0000000 0.6291852 1.637603
    [2,] 0.6291852 0.0000000 1.404476
    [3,] 1.6376026 1.4044762 0.000000

    11、信息熵(Information Entropy)
    信息熵并不属于一种相似性度量。那为什么放在这篇文章中啊?这个。。。我也不知道。 (╯▽╰)
    信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。
    计算给定的样本集X的信息熵的公式:

    entropy=i=1Cpilog2(pi)

    参数的含义:
    C:样本集X的分类数
    pi:X中第i类元素出现的概率
    信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中C个分类出现的概率一样大时(都是1/C),信息熵取最大值log2(C)。当X只有一个分类时,信息熵取最小值0

    test.entropy <- function(d){
    
    print(d)
    res <- 0
    for(i in 1:length(d))
    {
      if(d[i]!=0)
            res <- res + d[i]*log(d[i])
        }
    return (-res)
    }
    

    12、kl散度

    刻画两个分布的差异。

    D(spec1||spec2)=(spec1log(spec1spec2))

    library(seewave)
    data(tico)
    str(tico)
    tico1 <- spec(tico, at=0.65, plot=FALSE)
    tico2 <- spec(tico, at=1.1, plot=FALSE)
    kl.dist(tico1, tico2)    # log2 (binary logarithm)
    kl.dist(tico1, tico2, base=exp(1))  # ln (natural logarithm)

    13、兰式距离

    dij=k=1n|xikxjk|xik+xjk

    与马氏距离一样,兰氏距离对数据的量纲不敏感。不过兰氏距离假定变量之间相互独立,没有考虑变量之间的相关性。

    R语言代码:

    > aa=matrix(rnorm(15,0,1),c(3,5))
    > aa
                [,1]         [,2]       [,3]       [,4]       [,5]
    [1,]  0.02289905 -0.007154829 -1.1331360  0.7498863  1.1254641
    [2,] -1.06508101 -0.316642339  0.7597450  0.3327373 -1.4923720
    [3,] -0.67681654  0.188728888 -0.6868684 -0.4417319  0.4783747
    > dist(aa, method = "canberra")
              1         2
    2 14.589357          
    3  6.664461 33.073080
    文章转自: https://blog.csdn.net/xxzhangx/article/details/53153821              
    展开全文
  • 聚类马氏距离代码MATLAB 用R进行聚类分析 原始资料库该项目旨在学习机器学习和数据挖掘算法的基础知识。 所有代码都是使用纯R编程语言编写的。 该项目包含以下算法的实现。 马氏距离 明可夫斯基距离 堪培拉距离 k-...
  •   但是传统的马氏距离检测方法是不稳定的,因为个别异常值会把均值向量和协方差矩阵向自己方向吸引,这样算出来的样本马氏距离起不了检测异常值的所用。所以首先要利用迭代的思想构造一个稳健的均值和协方差矩阵...
  • 距离度量之马氏距离

    万次阅读 多人点赞 2017-09-02 16:08:50
    马氏距离 用来度量一个样本点P与数据分布为D的集合的距离。 假设样本点为: 数据集分布的均值为: 协方差矩阵为S。 则这个样本点P与数据集合的马氏距离为: 马氏距离也可以衡量两个...
  • 【-25,5】怎么来的 <p style="text-align:center"><img alt="" height="591" src="https://img-ask.csdnimg.cn/upload/1615246005921.png" width="330" /></p>    </p>
  • R语言聚类分析机器学习资料 英文版!
  • 马氏距离

    2014-05-11 15:15:54
    马氏距离是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高...
  • 欧氏距离是最直观最简单的,也就是两个点之间的几何距离,也就是原始数据各个维度上坐标值的差的平方之和 标准化欧式距离是针对简单欧式距离的缺点而作的一种改进方案。标准欧式距离的思路:既然数据各维分...
  • 1.距离判别原理分析 根据待判定样本与已知类别样本之间的距离远近做出判断.根据已知类别样本信息建立距离判别函数式,再将各待判定样本的属性数据逐一代入式中计算,得到距离值,再根据此将样本判入距离值最小的类别的...
  • R语言 聚类分析

    千次阅读 2017-02-18 14:04:38
    R语言:计算各种距离 】专门介绍,这里只简单的说一下有什么: 欧氏距离(Euclidean): D = ∑ p i = 1 ( x i − y i ) 2 − − − − − − − − − − − − √ D=\sqrt{\sum_{i=1}^{p}(x_i-y_i)^2} 切比雪夫...
  • 判别分析原理及R语言实现

    万次阅读 多人点赞 2018-08-07 00:08:54
    今天明明同学给大家讲讲《判别分析原理及R语言实现》。 目录: 1.线性判别分析 2.距离判别分析 3.二次判别分析 4.Bayes判别分析 1、线性判别分析 提出: 最早由fisher(1936)提出,用于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 560
精华内容 224
关键字:

马氏距离r语言