• Posts tagged "R"
  • (Page 2)

Blog Archives

R语言统计特征描述包descriptr

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员/Quant: Java,R,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-descriptr

前言

我们获得数据后需要了解数据,通常会用到统计特征来观察数据,比如字段类型,数据集长度,均值,方差,数据分布,概率密度等。

descriptr包,为了我们提供了一套用来观察数据统计特征的工具集,主要特性包括统计特征计算,离散度,频率表,交叉表,分组摘要和多个单/双向表的度量,可以让我们非常方便的观察的数据特征。

目录

  1. descriptr包介绍
  2. descriptr包函数列表
  3. descriptr包函数使用

1. descriptr包介绍

descriptr包,主要用于生成描述性统计信息。它提供了3种数据处理视角,连续变量、类别变量(离散变量)和可视化。descriptr包的统计特征计算部分的源代码,结构非常工整,大量用到dplyr包来构建。

开发环境所使用的系统环境

  • Win10 64bit
  • R: 3.4.2 x86_64-w64-mingw32/x64 b4bit

descriptr包的安装比较简单,直接用install.pacakges()函数就行。


> install.packages("descriptr")
> library(descriptr)

2. descriptr包函数列表

descriptr包,提供了3种处理视角,连续变量、类别变量、和可视化。我们将分别介绍这3种处理视角的函数。

descriptr包,提供了2个数据集,我们可以基于这2个数据集进行学习和测试。文中的例子,都是基于mtcarz的数据集进行构建的。

数据集:

  • hsb, 高中数据集
  • mtcarz, 汽车数据集,复制系统的mtcars数据集

2.1 连续变量
2.1.1 统计概览

  • ds_summary_stats, 统计概率
  • ds_auto_summary_stats, 自动统计概率
  • ds_group_summary, 分组描述性统计
  • ds_auto_group_summary, 自动描述性统计
  • ds_tidy_stats, 多变精简统计概率
  • ds_multi_stats,已弃用函数,用ds_tidy_stats()替代

2.1.2 统计特征计算

  • ds_mode, 计算众数
  • ds_extreme_obs, 计算极端值
  • ds_freq_cont, 计算频数
  • ds_freq_table, 计算频率分布表
  • ds_percentiles,计算分位数
  • ds_range, 计算宽度, max(x)-min(x)
  • ds_kurtosis, 计算峰度
  • ds_skewness, 计算偏度
  • ds_gmean, 计算几何平均值, prod(x)^(1/length(x))
  • ds_hmean, 计算谐波均值, length(x)/sum(sapply(x, function(x) {1/x} ))
  • ds_css, 计算修正平方和, sum((x1-mean)^2+(x2-mean)^2+…)
  • ds_mdev, 计算平均绝对差, sum( abs(x1-mean) + abs(x2-mean) + …)
  • ds_cvar, 计算变异系数, sd(x)/mean(x) * 100%
  • ds_std_error, 计算标准误差, sd(x)/(length(x)^0.5)
  • ds_tailobs,计算最大最小的多个值

2.1.3 度量特征

  • ds_measures_location,位置的度量,包括均值,中位数和众数
  • ds_measures_symmetry, 对称性的度量,包括峰度和偏度
  • ds_measures_variation,变异的度量,包括宽度,方差,标准差

2.1.4 其他函数

  • ds_rindex, 计算值的索引,同which
  • ds_screener, 以表格展示数据

2.2 类别变量

  • ds_twoway_table,计算双向表
  • ds_cross_table, 展示双向表
  • ds_auto_freq_table, 展示多个单向表
  • ds_auto_cross_table, 展示多个双向表
  • ds_tway_tables, 已弃用函数,用ds_auto_cross_table()替换
  • ds_oway_tables,已弃用函数,用ds_auto_freq_table()替换

2.3 可视化
2.3.1 画图函数

  • ds_plot_bar Generate bar plots
  • ds_plot_bar_grouped Generate grouped bar plots
  • ds_plot_bar_stacked Generate stacked bar plots
  • ds_plot_box_group Compare distributions
  • ds_plot_box_single Generate box plots
  • ds_plot_density Generate density plots
  • ds_plot_histogram Generate histograms
  • ds_plot_scatter Generate scatter plots

2.3.2 已弃用函数,调用vistributions包

  • dist_binom_perc, 可视化二项分布
  • dist_binom_plot, 可视化二项分布
  • dist_binom_prob,可视化二项分布
  • dist_chi_perc, 可视化卡方分布
  • dist_chi_plot, 可视化卡方分布
  • dist_chi_prob, 可视化卡方分布
  • dist_f_perc, 可视化F分布
  • dist_f_plot, 可视化F分布
  • dist_f_prob, 可视化F分布
  • dist_norm_perc, 可视化正态分布
  • dist_norm_plot, 可视化正态分布
  • dist_norm_prob, 可视化正态分布
  • dist_t_perc, 可视化T分布
  • dist_t_plot, 可视化T分布
  • dist_t_prob, 可视化T分布

2.4 演示小程序
一个演示的小程序,可以快速看到功能界面,使用shiny来构建的。

  • ds_launch_shiny_app, Shiny演示小程序

3. descriptr包函数使用

接下来,我们找一些对于我们观察数据非常方便的函数进行列举。

首先,我们先了解一个我们要使用的数据集mtcarz


> mtcarz
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

3.1 数据展示
通过ds_screener()函数进行静态数据集展示,替代函数原系统的str()函数。


# 查看数据静态结构
> ds_screener(mtcarz)
-----------------------------------------------------------------------
|  Column Name  |  Data Type  |  Levels   |  Missing  |  Missing (%)  |
-----------------------------------------------------------------------
|      mpg      |   numeric   |    NA     |     0     |       0       |
|      cyl      |   factor    |   4 6 8   |     0     |       0       |
|     disp      |   numeric   |    NA     |     0     |       0       |
|      hp       |   numeric   |    NA     |     0     |       0       |
|     drat      |   numeric   |    NA     |     0     |       0       |
|      wt       |   numeric   |    NA     |     0     |       0       |
|     qsec      |   numeric   |    NA     |     0     |       0       |
|      vs       |   factor    |    0 1    |     0     |       0       |
|      am       |   factor    |    0 1    |     0     |       0       |
|     gear      |   factor    |   3 4 5   |     0     |       0       |
|     carb      |   factor    |1 2 3 4 6 8|     0     |       0       |
-----------------------------------------------------------------------

 Overall Missing Values           0 
 Percentage of Missing Values     0 %
 Rows with Missing Values         0 
 Columns With Missing Values      0 

# str()函数的静态结构
> str(mtcarz)
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : Factor w/ 2 levels "0","1": 1 1 2 2 1 2 1 2 2 2 ...
 $ am  : Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 1 1 ...
 $ gear: Factor w/ 3 levels "3","4","5": 2 2 2 1 1 1 1 2 2 2 ...
 $ carb: Factor w/ 6 levels "1","2","3","4",..: 4 4 1 1 2 1 4 2 2 4 ... 

3.2 统计概览
通过ds_summary_stats()函数,查看数据集中某个连续型变量的所有统计特征值。


# 统计概览
> ds_summary_stats(mtcarz,mpg)
-------------------------------------------- Variable: mpg --------------------------------------------

                        Univariate Analysis                          
 N                       32.00      Variance                36.32 
 Missing                  0.00      Std Deviation            6.03 
 Mean                    20.09      Range                   23.50 
 Median                  19.20      Interquartile Range      7.38 
 Mode                    10.40      Uncorrected SS       14042.31 
 Trimmed Mean            19.95      Corrected SS          1126.05 
 Skewness                 0.67      Coeff Variation         30.00 
 Kurtosis                -0.02      Std Error Mean           1.07 

                              Quantiles                               
              Quantile                            Value                
             Max                                  33.90                
             99%                                  33.44                
             95%                                  31.30                
             90%                                  30.09                
             Q3                                   22.80                
             Median                               19.20                
             Q1                                   15.43                
             10%                                  14.34                
             5%                                   12.00                
             1%                                   10.40                
             Min                                  10.40                

                            Extreme Values                            
                Low                                High                
  Obs                        Value       Obs                        Value 
  15                         10.4        20                         33.9  
  16                         10.4        18                         32.4  
  24                         13.3        19                         30.4  
   7                         14.3        28                         30.4  
  17                         14.7        26                         27.3  

输出分成了3个部分:Univariate Analysis(单变量分析),Quantiles(分位数),Extreme Values(极值)。

  • Univariate Analysis(单变量分析),包括N(个数),Missing(缺失值),Mean(均值),Median(中位数),Mode(众数),Trimmed Mean(修正均值),Skewness(偏度),Kurtosis(峰度),Variance(方差),Std Deviation(标准差),Range(范围,最大-最小),Interquartile Range(四分位数范围),Uncorrected SS(未修正平方和),Corrected SS(修正平方和), Coeff Variation(变异系数,标准差/均值),Std Error Mean(标准误差均值)
  • Quantiles(分位数),从最小值到最小值,按顺序排列,对应的数值。
  • Extreme Values(极值),包括最小值前5个,最大值前5个。

3.3 统计特征快速查看
通过ds_tidy_stats()函数,查看数据集中各变量的统计特征,维度比较少。


# 多变量统计
> ds_tidy_stats(mtcarz, mpg, disp, hp)
# A tibble: 3 x 16
  vars    min   max  mean t_mean median  mode range variance  stdev  skew kurtosis coeff_var
  <chr> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>    <dbl>  <dbl> <dbl>    <dbl>     <dbl>
1 disp   71.1 472   231.   228    196.  276.  401.   15361.  124.   0.420  -1.07        53.7
2 hp     52   335   147.   144.   123   110   283     4701.   68.6  0.799   0.275       46.7
3 mpg    10.4  33.9  20.1   20.0   19.2  10.4  23.5     36.3   6.03 0.672  -0.0220      30.0
# ... with 3 more variables: q1 <dbl>, q3 <dbl>, iqrange <dbl>

3.4 频率表
通过ds_freq_table()函数,把数据集中某个连续型变量,进行等宽划分,形成频率表。


# 划分成5个等宽的频率
> ds_freq_table(mtcarz,mpg,5)
                              Variable: mpg                               
|-----------------------------------------------------------------------|
|    Bins     | Frequency | Cum Frequency |   Percent    | Cum Percent  |
|-----------------------------------------------------------------------|
| 10.4 - 15.1 |     6     |       6       |    18.75     |    18.75     |
|-----------------------------------------------------------------------|
| 15.1 - 19.8 |    12     |      18       |     37.5     |    56.25     |
|-----------------------------------------------------------------------|
| 19.8 - 24.5 |     8     |      26       |      25      |    81.25     |
|-----------------------------------------------------------------------|
| 24.5 - 29.2 |     2     |      28       |     6.25     |     87.5     |
|-----------------------------------------------------------------------|
| 29.2 - 33.9 |     4     |      32       |     12.5     |     100      |
|-----------------------------------------------------------------------|
|    Total    |    32     |       -       |    100.00    |      -       |
|-----------------------------------------------------------------------|

3.5 分组统计
通过ds_group_summary()函数,把数据集中变量进行分组,再分别计算统计特征。


> k<-ds_group_summary(mtcarz,cyl,mpg);k
                                       mpg by cyl                                         
-----------------------------------------------------------------------------------------
|     Statistic/Levels|                    4|                    6|                    8|
-----------------------------------------------------------------------------------------
|                  Obs|                   11|                    7|                   14|
|              Minimum|                 21.4|                 17.8|                 10.4|
|              Maximum|                 33.9|                 21.4|                 19.2|
|                 Mean|                26.66|                19.74|                 15.1|
|               Median|                   26|                 19.7|                 15.2|
|                 Mode|                 22.8|                   21|                 10.4|
|       Std. Deviation|                 4.51|                 1.45|                 2.56|
|             Variance|                20.34|                 2.11|                 6.55|
|             Skewness|                 0.35|                -0.26|                -0.46|
|             Kurtosis|                -1.43|                -1.83|                 0.33|
|       Uncorrected SS|              8023.83|              2741.14|              3277.34|
|         Corrected SS|               203.39|                12.68|                 85.2|
|      Coeff Variation|                16.91|                 7.36|                16.95|
|      Std. Error Mean|                 1.36|                 0.55|                 0.68|
|                Range|                 12.5|                  3.6|                  8.8|
|  Interquartile Range|                  7.6|                 2.35|                 1.85|
-----------------------------------------------------------------------------------------

3.6 分组分类统计
通过ds_auto_group_summary()函数,把数据集中变量进行分组,再分别两两计算统计特征。


# 分组分类
> ds_auto_group_summary(mtcarz, cyl, gear, mpg)
                                       mpg by cyl                                         
-----------------------------------------------------------------------------------------
|     Statistic/Levels|                    4|                    6|                    8|
-----------------------------------------------------------------------------------------
|                  Obs|                   11|                    7|                   14|
|              Minimum|                 21.4|                 17.8|                 10.4|
|              Maximum|                 33.9|                 21.4|                 19.2|
|                 Mean|                26.66|                19.74|                 15.1|
|               Median|                   26|                 19.7|                 15.2|
|                 Mode|                 22.8|                   21|                 10.4|
|       Std. Deviation|                 4.51|                 1.45|                 2.56|
|             Variance|                20.34|                 2.11|                 6.55|
|             Skewness|                 0.35|                -0.26|                -0.46|
|             Kurtosis|                -1.43|                -1.83|                 0.33|
|       Uncorrected SS|              8023.83|              2741.14|              3277.34|
|         Corrected SS|               203.39|                12.68|                 85.2|
|      Coeff Variation|                16.91|                 7.36|                16.95|
|      Std. Error Mean|                 1.36|                 0.55|                 0.68|
|                Range|                 12.5|                  3.6|                  8.8|
|  Interquartile Range|                  7.6|                 2.35|                 1.85|
-----------------------------------------------------------------------------------------

                                       mpg by gear                                        
-----------------------------------------------------------------------------------------
|     Statistic/Levels|                    3|                    4|                    5|
-----------------------------------------------------------------------------------------
|                  Obs|                   15|                   12|                    5|
|              Minimum|                 10.4|                 17.8|                   15|
|              Maximum|                 21.5|                 33.9|                 30.4|
|                 Mean|                16.11|                24.53|                21.38|
|               Median|                 15.5|                 22.8|                 19.7|
|                 Mode|                 10.4|                   21|                   15|
|       Std. Deviation|                 3.37|                 5.28|                 6.66|
|             Variance|                11.37|                27.84|                44.34|
|             Skewness|                -0.09|                  0.7|                 0.56|
|             Kurtosis|                -0.38|                -0.77|                -1.83|
|       Uncorrected SS|              4050.52|               7528.9|              2462.89|
|         Corrected SS|               159.15|               306.29|               177.37|
|      Coeff Variation|                20.93|                21.51|                31.15|
|      Std. Error Mean|                 0.87|                 1.52|                 2.98|
|                Range|                 11.1|                 16.1|                 15.4|
|  Interquartile Range|                  3.9|                 7.08|                 10.2|
-----------------------------------------------------------------------------------------

3.7 测量
通过ds_measures_xxx()的几个函数,把数据集中变量,分别进行不同维度的统计特征。如果您想要查看位置,变化,对称性,百分位数和极端观测值的度量,请使用以下函数。 除了ds_extreme_obs()之外,所有这些都将使用单个或多个变量。 如果未指定变量,则它们将返回数据集中所有连续变量的结果。

数据集变化分析:范围,四分位范围,方差,标准差,变异系数,标准误差


> ds_measures_variation(mtcarz)
# A tibble: 6 x 7
  var    range     iqr  variance      sd coeff_var std_error
  <chr>  <dbl>   <dbl>     <dbl>   <dbl>     <dbl>     <dbl>
1 disp  401.   205.    15361.    124.         53.7   21.9   
2 drat    2.17   0.840     0.286   0.535      14.9    0.0945
3 hp    283     83.5    4701.     68.6        46.7   12.1   
4 mpg    23.5    7.38     36.3     6.03       30.0    1.07  
5 qsec    8.40   2.01      3.19    1.79       10.0    0.316 
6 wt      3.91   1.03      0.957   0.978      30.4    0.173 

数据集数值分析:均值,修正均值,中位数,众数


> ds_measures_location(mtcarz)
# A tibble: 6 x 5
  var     mean trim_mean median   mode
  <chr>  <dbl>     <dbl>  <dbl>  <dbl>
1 disp  231.      228    196.   276.  
2 drat    3.60      3.58   3.70   3.07
3 hp    147.      144.   123    110   
4 mpg    20.1      20.0   19.2   10.4 
5 qsec   17.8      17.8   17.7   17.0 
6 wt      3.22      3.20   3.32   3.44

数据集分位数分析:从最小值到最大值排序


> ds_percentiles(mtcarz)
# A tibble: 6 x 12
  var     min  per1  per5 per10     q1 median     q3  per95  per90  per99    max
  <chr> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 disp  71.1  72.5  77.4  80.6  121.   196.   326    449    396.   468.   472   
2 drat   2.76  2.76  2.85  3.01   3.08   3.70   3.92   4.31   4.21   4.78   4.93
3 hp    52    55.1  63.6  66     96.5  123    180    254.   244.   313.   335   
4 mpg   10.4  10.4  12.0  14.3   15.4   19.2   22.8   31.3   30.1   33.4   33.9 
5 qsec  14.5  14.5  15.0  15.5   16.9   17.7   18.9   20.1   20.0   22.1   22.9 
6 wt     1.51  1.54  1.74  1.96   2.58   3.32   3.61   5.29   4.05   5.40   5.42

极值分析


> ds_extreme_obs(mtcarz,mpg)
# A tibble: 10 x 3
   type  value index
   <chr> <dbl> <int>
 1 high   33.9    20
 2 high   32.4    18
 3 high   30.4    19
 4 high   30.4    28
 5 high   27.3    26
 6 low    10.4    15
 7 low    10.4    16
 8 low    13.3    24
 9 low    14.3     7
10 low    14.7    17

3.8 类别变量频率表
通过ds_cross_table()函数,查看数据集中类别变量的双向表。


> ds_cross_table(mtcarz, cyl, gear)
    Cell Contents
 |---------------|
 |     Frequency |
 |       Percent |
 |       Row Pct |
 |       Col Pct |
 |---------------|

 Total Observations:  32 

----------------------------------------------------------------------------
|              |                           gear                            |
----------------------------------------------------------------------------
|          cyl |            3 |            4 |            5 |    Row Total |
----------------------------------------------------------------------------
|            4 |            1 |            8 |            2 |           11 |
|              |        0.031 |         0.25 |        0.062 |              |
|              |         0.09 |         0.73 |         0.18 |         0.34 |
|              |         0.07 |         0.67 |          0.4 |              |
----------------------------------------------------------------------------
|            6 |            2 |            4 |            1 |            7 |
|              |        0.062 |        0.125 |        0.031 |              |
|              |         0.29 |         0.57 |         0.14 |         0.22 |
|              |         0.13 |         0.33 |          0.2 |              |
----------------------------------------------------------------------------
|            8 |           12 |            0 |            2 |           14 |
|              |        0.375 |            0 |        0.062 |              |
|              |         0.86 |            0 |         0.14 |         0.44 |
|              |          0.8 |            0 |          0.4 |              |
----------------------------------------------------------------------------
| Column Total |           15 |           12 |            5 |           32 |
|              |        0.468 |        0.375 |        0.155 |              |
----------------------------------------------------------------------------

3.9 类别变量的双向表
通过ds_twoway_table()函数,查看数据集中类别变量的分组后的情况。


> ds_twoway_table(mtcarz, cyl, gear)
Joining, by = c("cyl", "gear", "count")
# A tibble: 8 x 6
  cyl   gear  count percent row_percent col_percent
  <fct> <fct> <int>   <dbl>       <dbl>       <dbl>
1 4     3         1  0.0312      0.0909      0.0667
2 4     4         8  0.25        0.727       0.667 
3 4     5         2  0.0625      0.182       0.4   
4 6     3         2  0.0625      0.286       0.133 
5 6     4         4  0.125       0.571       0.333 
6 6     5         1  0.0312      0.143       0.2   
7 8     3        12  0.375       0.857       0.8   
8 8     5         2  0.0625      0.143       0.4   

3.10 可视化连续型数据
分别以柱状图,密度图,分箱图,散点图,对连续型数据进行可视化,从左到右的4个图。


> ds_plot_histogram(mtcarz, mpg, disp)
> ds_plot_density(mtcarz, mpg, disp)
> ds_plot_box_single(mtcarz, mpg, disp)
> ds_plot_scatter(mtcarz, mpg, disp)

3.11 可视化类别型数据
分别以bar图对类别型数据可视化,从左到右的4个图。


> ds_plot_bar(mtcarz,cyl, gear)
> ds_plot_bar_stacked(mtcarz, cyl, gear)
> ds_plot_bar_grouped(mtcarz, cyl, gear)
> ds_plot_box_group(mtcarz, cyl, gear, mpg)

3.12 可视化分布图

5种统计分布的可视化效果,由于使用时提示已弃用,改为调用vistributions包的对应函数,所以大家可以改用vistributions包。

二项分布


> dist_binom_prob(10, 0.3, 4, type = 'exact')

卡方分布


> dist_chi_perc(0.22, 13, 'upper')

F分布


> dist_f_perc(0.125, 9, 35, 'upper')

正态分布


> dist_norm_perc(0.95, mean = 2, sd = 1.36, type = 'both')

T分布


> dist_t_prob(1.445, 7, 'interval')

3.13 启动shiny小程序

提供了一个界面,方便小白进行操作,其实没什么用。>_<

本文对于descriptr包进行的完整的介绍,descriptr主要用于统计特征的快速查看,一个方便的工具包,对于初识数据集是非常有帮助的。

转载请注明出处:
http://blog.fens.me/r-descriptr

打赏作者

2019中国R大会北京 : 凯利公式-用胜率和赔率量化你的投资

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹(Conan), 程序员/Quant: Java,R,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/meeting-r-20190526

前言

本次R语言(北京)大会由统计之都主办,主题围绕着“数据科学”的展开,1个主会场和19个分会场,涉及70多个分享主题。

本次大会结合了学术界、产业界,跨领域跨专业的交流,通过碰撞形成了新的火花,会议覆盖统计学、大数据、人工智能相关理论及其在各行各业的具体应用,包括医疗健康、生物信息、医疗大数据、心理学、量化金融、工业工程、智能制造、软件工具、计算平台、概率统计、统计理论、机器学习、人工智能、大数据应用、自然语言、新闻传播、社交网络、商务统计、人文科学等数据科学话题。

目录

  1. 我分享的主题:凯利公式-用胜率和赔率量化你的投资
  2. 会议体验和照片分享

1. 我分享的主题:凯利公式-用胜率和赔率量化你的投资

本次大会我被安排在量化金融专场,从理论到落地,有公式有代码。以“故事”为切入点做为开场,用简单的话语把复杂的金融逻辑讲明白。我的分享的PPT下载,本次活动的官方介绍的链接

我的分享是最后一天,在人民大学第三教学楼教室,100人的会场完全坐满。 我分享主题:凯利公式-用胜率和赔率量化你的投资,核心内容基于我写的一篇文章,用R语言解读凯利公式

我主要为分三个部分进行介绍:

  • 故事开始:通过一个故事,带个场景。
  • 凯利公式:原理,公式,变型。
  • 赌局最优解:通过公式结合真实市场,定义不同场景下最优解。
  • 让时间帮我们赚钱:用R语言程序,按假设条件进行仿真。

由于时间有限,还请有问题的朋友,给我留言再进行沟通。

2. 会议体验和照片分享

本次大会场次真多,涉及的内容真是保罗万象,不仅是R语言相关,还有很多行为应用,极大地拓宽的R语言会议的视野。

2.1 会议体验证和总结
我的分享依然保持着一惯风格,有理论,有公式,有代码,有落地,会后总体的反馈还是不错的,大家纷纷表示都听懂了,金融模型很有意思。

我的分享。

满座的会场。

我要招人

2.2 相关照片

会场介绍

会后的大家交流

李孟育博士,南华期货

部分工作人员大合照:

新朋友,老朋友,跨界的朋友,台湾的朋友,用过R语言让我们有共同的话题,感谢人民大学和统计之都,所有主办方的小伙们,辛苦了!明年再见。

转载请注明出处:
http://blog.fens.me/meeting-r-20190526

打赏作者

R语言实现聚类kmeans

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员/Quant: Java,R,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-cluster-kmeans

前言

聚类属于无监督学习中的一种方法,k-means作为数据挖掘的十大算法之一,是一种最广泛使用的聚类算法。我们使用聚类算法将数据集的点,分到特定的组中,同一组的数据点具有相似的特征,而不同类中的数据点特征差异很大。PAM是对k-means的一种改进算法,能降低异常值对于聚类效果的影响。

聚类可以帮助我们认识未知的数据,发现新的规律。

目录

  1. k-means实现
  2. PAM实现
  3. 可视化和段剖面图

1. k-means实现

k-means算法,是一种最广泛使用的聚类算法。k-means以k作为参数,把数据分为k个组,通过迭代计算过程,将各个分组内的所有数据样本的均值作为该类的中心点,使得组内数据具有较高的相似度,而组间的相似度最低。

k-means工作原理:

  1. 初始化数据,选择k个对象作为中心点。
  2. 遍历整个数据集,计算每个点与每个中心点的距离,将它分配给距离中心最近的组。
  3. 重新计算每个组的平均值,作为新的聚类中心。
  4. 上面2-3步,过程不断重复,直到函数收敛,不再新的分组情况出现。

k-means聚类,适用于连续型数据集。在计算数据样本之间的距离时,通常使用欧式距离作为相似性度量。k-means支持多种距离计算,还包括maximum, manhattan, pearson, correlation, spearman, kendall等。各种的距离算法的介绍,请参考文章R语言实现46种距离算法

1.1 kmeans()函数实现

在R语言中,我们可以直接调用系统中自带的kmeans()函数,就可以实现k-means的聚类。同时,有很多第三方算法包也提供了k-means的计算函数。当我们需要使用kmeans算法,可以使用第三方扩展的包,比如flexclust, amap等包。

本文的系统环境为:

  • Win10 64bit
  • R: 3.4.4 x86_64-w64-mingw32

接下来,让我们做一个k-means聚类的例子。首先,创建数据集。

# 创建数据集
> set.seed(0)
> df <- rbind(matrix(rnorm(100, 0.5, 4.5), ncol = 2),
+             matrix(rnorm(100, 0.5, 0.1), ncol = 2))
> colnames(df) <- c("x", "y")
> head(df)
              x          y
[1,]  6.1832943  1.6976181
[2,] -0.9680501 -1.1951622
[3,]  6.4840967 11.4861408
[4,]  6.2259319 -3.0790260
[5,]  2.3658865  0.2530514
[6,] -6.4297752  1.6256360

使用stats::kmeans()函数,进行聚类。


> cl <- kmeans(df,2); cl
K-means clustering with 2 clusters of sizes 14, 86

Cluster means:                   # 中心点坐标
          x         y
1  5.821526 2.7343127
2 -0.315946 0.1992429

Clustering vector:               # 分组的索引
  [1] 1 2 1 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 2 2 2 2 2 2 2 2 1 1 2 1 2 1 2 2 2 2 2 2 1 1 2
 [51] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Within cluster sum of squares by cluster:   
[1] 316.0216 716.4009                       # withinss,分组内平方和  
 (between_SS / total_SS =  34.0 %)          # 组间的平方和/总平方和,用于衡量点聚集程度

Available components:            # 对象属性
[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"   
[7] "size"         "iter"         "ifault"      

# 查看数据分组情况,第1组86个,第2组14个
> cl$size
[1] 86 14

对象属性解读:

  • cluster,每个点的分组
  • centers,聚类的中心点坐标
  • totss,总平方和
  • withinss,每个分组内的平方和
  • tot.withinss,分组总和,sum(withinss)
  • betweenss,组间的平方和,totss – tot.withinss
  • size,每个组中的数据点数量
  • iter,迭代次数。
  • ifault,可能有问题的指标

1.2 kcca()函数实现
我们再使用flexclust::kcca()函数,进行聚类。


# 安装flexclust包
> # install.packages("flexclust")
> library(flexclust)

# 进行聚类
> clk<-kcca(df,k=2);clk
kcca object of family ‘kmeans’ 

call:
kcca(x = df, k = 2)

cluster sizes:  # 聚类的分组大小
 1  2 
84 16 

# 聚类的中心
> clk@centers
              x         y
[1,] -0.3976465 0.2015319
[2,]  5.4832702 2.4054118

# 查看聚类的概览信息
> summary(clk)
kcca object of family ‘kmeans’ 

call:
kcca(x = df, k = 2)

cluster info:         # 每个组的基本信息,包括分组数量,平均距离、最大距离、分割值
  size  av_dist max_dist separation
1   84 2.102458 9.748136   3.368939
2   16 3.972920 9.576635   3.189891

convergence after 5 iterations                   # 5次迭代
sum of within cluster distances: 240.1732        # 聚类距离之和

我们比较2个不同包的k-means算法,所得到的分组数据都是一样的,中心点位置略有一点偏差。接下来,我们可以把聚类画图。

> plot(df, col = cl$cluster, main="Kmeans Cluster")
> points(cl$centers, col = 1:3, pch = 10, cex = 4) # 画出kmeans()函数效果

从上图中看到k-means的总分2组,每个组的中心点分别用红色十字圆圈和黑色十字圆圈表示,为组内的所有数据样本的均值。再叠加上kcca()函数聚类后的中心点画图。

> points(clk@centers, col = 3:4, pch = 10, cex = 4)  # 画出kcca()函数效果


新的中心点,分别用别用绿色十字圆圈和蓝色十字圆圈表示。虽然我们使用了相同的算法,分组个数也相同,但中心点还有一些不同的。

这里其实就要对聚类的稳定性进行判断了,有可能是聚类迭代次数过少,就会出现不同的聚类结果,就需要增加迭代次数,达到每次计算结果是一致的。也有可能是因为不同的包,实现的代码有所区别导致的。

k-means算法,也有一些缺点就是对于孤立点是敏感的,会被一些极端值影响聚类的效果。一种改进的算法是PAM,用于解决这个问题。PAM不使用分组平均值作为计算的参照点,而是直接使用每个组内最中心的对象作为中心点。

2. PAM实现

PAM(Partitioning Around Medoids),又叫k-medoids,它可以将数据分组为k个组,k为数量是要事前定义的。PAM与k-means一样,找到距离中心点最小点组成同一类。PAM对噪声和异常值更具鲁棒性,该算法的目标是最小化对象与其最接近的所选对象的平均差异。PAM可以支持混合的数据类型,不仅限于连续变量。

PAM算法分为两个阶段:

  1. 第1阶段BUILD,为初始集合S选择k个对象的集合。
  2. 第2阶段SWAP,尝试用未选择的对象,交换选定的中心点,来提高聚类的质量。

PAM的工作原理:

  1. 初始化数据集,选择k个对象作为中心。
  2. 遍历数据点,把每个数据点关联到最近中心点m。
  3. 随机选择一个非中心对象,与中心对象交换,计算交换后的距离成本
  4. 如果总成本增加,则撤销交换的动作。
  5. 上面2-4步,过程不断重复,直到函数收敛,中心不再改变为止。

优点与缺点:

  • 消除了k-means算法对于孤立点的敏感性。
  • 比k-means的计算的复杂度要高。
  • 与k-means一样,必须设置k的值。
  • 对小的数据集非常有效,对大数据集效率不高。

在R语言中,我们可以通过cluster包来使用pam算法函数。cluster包的安装很简单,一条命令就安装完了。


> install.packages("cluster")
> library(cluster)

pam()函数定义:


pam(x, k, diss = inherits(x, "dist"), metric = "euclidean",
    medoids = NULL, stand = FALSE, cluster.only = FALSE,
    do.swap = TRUE,
    keep.diss = !diss && !cluster.only && n < 100,
    keep.data = !diss && !cluster.only,
    pamonce = FALSE, trace.lev = 0)

参数列表:

  • x,数据框或矩阵,允许有空值(NA)
  • k,设置分组数量
  • diss,为TRUE时,x为距离矩阵;为FALSE时,x是变量矩阵。默认为FALSE
  • metric,设置距离算法,默认为euclidean,距离矩阵忽略此项
  • medoids,指定初始的中心,默认为不指定。
  • stand,为TRUE时进行标准化,距离矩阵忽略此项。
  • cluster.only,为TRUE时,仅计算聚类结果,默认为FALSE
  • do.swap,是否进行中心点交换,默认为TRUE;对于超大的数据集,可以不进行交换。
  • keep.diss,是否保存距离矩阵数据
  • keep.data,是否保存原始数据
  • pamonce,一种加速算法,接受值为TRUE,FALSE,0,1,2
  • trace.lev,日志打印,默认为0,不打印

我们使用上面已创建好的数据集df,进行pam聚类,设置k=2。

> kclus <- pam(df,2)

# 查看kclus对象
> kclus
Medoids:                                     # 中心点
     ID         x         y
[1,] 27 5.3859621 1.1469717
[2,] 89 0.4130217 0.4798659

Clustering vector:                           # 分组
  [1] 1 2 1 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 2 2 2 2 2 2 2 1 1 1 2 1 2 1 2 2 2 2 2 2 1 1 2
 [51] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Objective function:                          # 目标函数的局部最小值
   build     swap                           
2.126918 2.124185 

Available components:                        # 聚类对象的属性
 [1] "medoids"    "id.med"     "clustering" "objective"  "isolation"  "clusinfo"   "silinfo"   
 [8] "diss"       "call"       "data"      

> kclus$clusinfo        # 聚类的分组数量,每个组的平均距离、最大距离、分割值
     size  max_diss  av_diss diameter separation
[1,]   15 10.397323 4.033095 17.35984   1.556862
[2,]   85  9.987604 1.787318 15.83646   1.556862

属性解读:

  • medoids,中心点的数据值
  • id.med,中心点的索引
  • clustering,每个点的分组
  • objective,目标函数的局部最小值
  • isolation,孤立的聚类(用L或L*表示)
  • clusinfo,每个组的基本信息
  • silinfo,存储各观测所属的类、其邻居类以及轮宽(silhouette)值
  • diss,不相似度
  • call,执行函数和参数
  • data,原始数据集

把聚类画图输出。

# 画图
> plot(df, col = kclus$clustering, main="Kmedoids Cluster")
> points(kclus$medoids, col = 1:3, pch = 10, cex = 4)

图中,PAM聚类后分为2组,红色一组,黑色一组,用十字圆圈表示2个中心点,可以清晰地看到中心点就是数据点。

我们可以在开始计算时,设置聚类的中心点,为索引1,2坐标点,打印聚类的日志,查看计算过程。


# 设置聚类的中心为1,2
> kclus2<-pam(df,2,medoids=c(1,2),trace.lev=20)
C pam(): computing 4951 dissimilarities from  100 x 2  matrix: [Ok]
pam()'s bswap(*, s=21.837, pamonce=0): medoids given
  after build: medoids are   1   2
  and min.dist dysma[1:n] are
      0      0   9.79   4.78   3.63   6.15   5.23  0.929   8.44   8.59
   2.29   2.69   4.48   1.19   1.98   2.81   5.39    4.2   3.72   4.56
   1.84   3.99    2.4    2.7   4.84   5.08  0.969   2.01   4.94   5.06
   1.94    7.4   5.19   1.62   3.94   3.12   3.51   0.65   4.46   4.61
   5.16   4.57   1.82   3.21   5.79   4.01   5.59   5.38   1.95    6.2
   2.41   2.09    2.2   2.43   2.24   2.26   2.09   2.39   2.21   2.33
   2.24   2.14   2.45   2.37    2.2   2.37   2.13   2.33   2.25   2.18
   2.38   2.19   2.15   2.14    2.1   2.39   2.24   2.24   2.12   2.14
   2.34   2.18   2.25   2.26   2.33   2.17   2.18   2.12   2.17   2.27
   2.29   2.26   2.38   2.12   2.25   2.33   2.09   2.21   2.24   2.13
   swp new  89 <->   2 old; decreasing diss. 306.742 by -93.214
   swp new  27 <->   1 old; decreasing diss. 213.528 by -1.10916
end{bswap()}, end{cstat()}

# 查看中心
> kclus2$id.med
[1] 27 89

通过日志查看,我们可以清楚地看到,2个中心的选择过程,分别用89替换1,距离成本减少93.214,用27替换2,距离成本减少1.1。

PAM作为k-means的一种改进算法,到底结果是否更合理,还要看最终哪种结果能够准确地表达业务的含义,被业务人员所认可,就需要不断地和业务人员来沟通。

3. 可视化和段剖面图

我们实现了聚类计算后,通常需要把复杂的数据逻辑,用简单的语言和图形来解释给业务人员,聚类的可视化就很重要的。如果数据量不太大,参与聚类的指标维度不太多的时候,我们可以用2维散点图,把指标两两画出来。

我们对iris数据集,进行k-means聚类分成3组,画出聚类后的2维散点图结果。

> res <- kmeans(iris[,1:4], centers=3)
> pairs(iris, col = res$cluster + 1)


每2个维度就会生成一张图, 我们可以全面直观的看到聚类的效果。

高级画图工具,使用GGally包中的ggpairs()函数。

> library(GGally)
> ggpairs(iris,columns = 1:5,mapping=aes(colour=as.character(res$cluster)))


图更漂亮了而且包含更多的信息,除了2维散点图,还包括了相关性检查,分布图,分箱图,频率图等。用这样的可视化效果图与业务人员沟通,一定会非常愉快的。

但是如果数据维度,不止3个而是30个,数据量也不是几百个点,而是几百万个点,再用2维散点图画出来就会很难看了,而且也表达不清,还会失去重点,计算的复杂度也是非常的高。

当数据量和数据维度多起来,我们就需要用段剖面图来做展示了,放弃个体特征,反应的群体特征和规律。

使用flexclust包中的barchart()函数,画出段剖面图,我们还是用iris数据集进行举例。


> library(flexclust)
> clk2 <- cclust(iris[,-5], k=3);clk2
kcca object of family ‘kmeans’ 

call:
cclust(x = iris[, -5], k = 3)

cluster sizes:
 1  2  3 
39 61 50 

# 画出段剖面图
> barchart(clk2,legend=TRUE)

如上图所示,每一区块是一个类别,每行是不同的指标。红点表示均值,柱状是这个类别每个指标的情况,透明色表示不重要指标。

查看段剖面图,可以清楚的看到,每个分组中特征是非常明显的。

  • Cluster1中,有39个数据点占26%,Sepal.Width指标在均值附近,其他指标都大于均值。
  • Cluster2中,有61个数据点占41%,Sepal.Width指标略小于均值,其他指标在均值附近。
  • Cluster3中,有50个数据点占33%,Sepal.Width略大于均值,其他指标都小于均值。

从段剖面图,我们可以一眼就能直观地发现数据聚类后的每个分组的总体特征,而不是每个分组中数据的个体特征,对于数据的解读是非常有帮助的。

对于段剖面图,原来我并不知道是什么效果。在和业务人员沟通中,发现他们使用SAS软件做出了很漂亮的段剖面图,而且他们都能理解,后来我发现R语言也有这个工具函数,图确实能极大地帮助进行数据解读,所以写了这篇文章记录一下。

本文介绍了k-means的聚类计算方法和具体的使用方法,也是对最近做了一个聚类模型的总结。作为数据分析师,我们不仅自己能发现数据的规律,还要让业务人员看明白你的思路,看懂数据的价值,这也是算法本身的价值。

转载请注明出处:
http://blog.fens.me/r-cluster-kmeans

打赏作者

用R语言实现信息度量

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员/Quant: Java,R,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-entropy

前言

香农的《通信的数学理论》是20世纪非常伟大的著作,被认为是现代信息论研究的开端。信息论定义了信息熵,用于把信息进行度量,以比特(bit)作为量纲单位,为如今发达的信息产业和互联网产业奠定了基础。本文接上一篇文章R语言实现46种距离算法,继续philentropy包的介绍,包括信息度量函数的使用。

目录

  1. 信息熵介绍
  2. 关键概念
  3. 信息度量函数
  4. 应用举例

1.信息熵介绍

信息论(Information Theory)是概率论与数理统计的一个分枝,用于研究信息处理、信息熵、通信系统、数据传输、率失真理论、密码学、信噪比、数据压缩等问题的应用数学学科。信息论将信息的传递作为一种统计现象来考虑,给出了估算通信信道容量的方法。信息传输和信息压缩是信息论研究中的两大领域。

香农被称为是“信息论之父”,香农于1948年10月发表的A Mathematical Theory of Communication,通信的数学理论(中文版),通常被认为是现代信息论研究的开端。

信息熵,是对信息随机性的量度,又指信息能被压缩的极限,用bit作为衡量信息的最小单位。一切信息所包含的信息量,都是1bit的正整数倍。计算机系统中常采用二进制编码,一个0或1就是1bit。

举例来说明一下信息熵的计算原理,假设小明最喜欢5种水果,苹果、香蕉、西瓜、草莓、樱桃中的一种,如果小明没有偏爱,选择每种水果的概率都是20%,那么这一信息的信息熵为

H(A) = -1*(0.2*log2(0.2)*5)
= 2.321928 bits

如果小明偏爱香蕉,选择这5种水果的概率分别是10%,20%,45%,15%,10%,那么这一信息信息熵为


H(B)=-1*(0.1*log2(0.1)+0.2*log2(0.2)+0.45*log2(0.45)+0.15*log2(0.15)+0.1*log2(0.1))
= 2.057717 bits

从结果得到H(A)大于H(B),信息熵越大表示越不确定。对于B的情况,对某一种水果的偏好,比A增加了确定性的因素,所以H(B)小于H(A)是符合对于信息熵的定义的。

2. 关键概念

我们从一幅图来认识信息熵,图中显示了随机变量X和Y的2个集合,在信息熵的概念里的所有可能逻辑关系。两个圆所包含的面积为联合熵H(X,Y), 左边的整个圆表示X的熵H(X),左边半圆是条件熵H(X|Y)。 右边的整个圆表示Y的熵H(Y),右边半圆条件熵H(Y|X),中间交集的部分是互信息I(X; Y)

信息熵(Entropy):是对信息随机性的量度,用于计算信息能被压缩的极限。对随机变量X,不确定性越大,X的信息熵H(X)也就越大。

公式定义:

H(x)的取值范围,0<=H(x)<=log(n), 其中n是随机变量x取值的种类数。需要注意的是,熵只依赖于随机变量的分布,与随机变量取值无关。

条件熵(Conditional Entropy):表示两个随机变量X和Y,在已知Y的情况下对随机变量X的不确定性,称之为条件熵H(X|Y),

公式定义:

联合熵(Joint Entropy):表示为两个随机事件X和Y的熵的并集,联合熵解决将一维随机变量分布推广到多维随机变量分布。

公式定义:

互信息(Mutual Information, 信息增益):两个随机变量X和Y,Y对X的互信息,为后验概率与先验概率比值的对数,即原始的熵H(X)和已知Y的情况下的条件熵H(X|Y)的比值的对数,信息增益越大表示条件Y对于确定性的贡献越大。互信息,也可以用来衡量相似性。

公式定义:

当MI(X,Y)=0时,表示两个事件X和Y完全不相关。决策树ID3算法就是使用信息增益来划分特征,信息增益大时,说明对数据划分帮助很大,优先选择该特征进行决策树的划分。

信息增益比率:是信息增益与该特征的信息熵之比,用于解决信息增益对多维度特征的选择,决策树C4.5算法使用信息增益比率进行特征划分。

KL散度(Kullback–Leibler Divergence, 相对熵):随机变量x取值的两个概率分布p和q,用来衡量这2个分布的差异,通常用p表示真实分布,用q表示预测分布。

公式定义:

n为事件的所有可能性,如果两个分布完全相同,那么它们的相关熵为0。如果相对熵KL越大,说明它们之间的差异越大,反之相对熵KL越小,说明它们之间的差异越小。

交叉熵(Cross Entropy):是对KL散度的一种变型,把KL散度log(p(x)/q(x))进行拆分,前面部分就是p的熵H(p),后面就是交叉熵H(p,q)。

公式定义:

交叉熵可以用来计算学习模型分布与训练分布之间的差异,一般在机器学习中直接用交叉熵做损失函数,用于评估模型。

信息论是通信理论的基础,也是xx的基础,关于信息论的理论,等后面有时时间再做分享,本文重要研究信息熵的函数计算问题。

3. 信息度量函数

philentropy包的函数,主要分为3种类别的函数,第一类是距离测量的函数,第二类是相关性分析,第三类是信息度量函数,本文重点介绍这些信息度量的函数。有关于距离测量函数和相关性分析函数,请参考文章R语言实现46种距离算法

我们来看一下,philentropy包里信息度量的函数:

  • H(): 香农熵, Shannon’s Entropy H(X)
  • JE() : 联合熵, Joint-Entropy H(X,Y)
  • CE() : 条件熵, Conditional-Entropy H(X|Y)
  • MI() : 互信息, Shannon’s Mutual Information I(X,Y)
  • KL() : KL散度, Kullback–Leibler Divergence
  • JSD() : JS散度,Jensen-Shannon Divergence
  • gJSD() : 通用JS散度,Generalized Jensen-Shannon Divergence

本文的系统环境为:

  • Win10 64bit
  • R: 3.4.2 x86_64-w64-mingw32

3.1 H()香农熵
H()函数,可用于快速计算任何给定概率向量的香农熵。

H()函数定义:

H (x, unit = "log2") 

参数列表:

  • x, 概率向量
  • unit,对数化的单位,默认为log2

函数使用:


# 创建数据x
> x<-1:10;x
 [1]  1  2  3  4  5  6  7  8  9 10
> px<-x/sum(x);x1
 [1] 0.01818182 0.03636364 0.05454545 0.07272727
 [5] 0.09090909 0.10909091 0.12727273 0.14545455
 [9] 0.16363636 0.18181818

# 计算香农熵
> H(px)
[1] 3.103643

同样地,我们也可以用程序实现公式自己算一下。


# 创建数据x
> x<-1:10
#计算x的概率密度px
> px<-x/sum(x)  

# 根据公式计算香农熵
> -1*sum(px*log2(px))
[1] 3.103643

我们动手的计算结果,用于H()函数的计算结果是一致的。

3.2 CE()条件熵

CE()函数,基于给定的联合概率向量P(X,Y)和概率向量P(Y),根据公式 H(X|Y)= H(X,Y)-H(Y)计算香农的条件熵。

函数定义:

CE(xy, y, unit = "log2")

参数列表:

  • xy, 联合概率向量
  • y, 概率向量,必须是随机变量y的概率分布
  • unit,对数化的单位,默认为log2

函数使用:


> x3<- 1:10/sum(1:10)
> y3<- 30:40/sum(30:40)

# 计算条件熵
> CE(x3, y3)
[1] -0.3498852

3.3 JE()联合熵

JE()函数,基于给定的联合概率向量P(X,Y)计算香农的联合熵H(X,Y)。

JE()函数定义:

JE (x, unit = "log2") 

参数列表:

  • x, 联合概率向量
  • unit,对数化的单位,默认为log2

函数使用:

# 创建数据x
> x2 <- 1:100/sum(1:100)

# 联合熵
> JE(x2)
[1] 6.372236

3.4 MI()互信息
MI()函数,根据给定联合概率向量P(X,Y)、概率向量P(X)和概率向量P(X),按公式I(X,Y)= H(X)+ H(Y)-H(X,Y)计算。

函数定义:

MI(x, y, xy, unit = "log2")

参数列表:

  • x, 概率向量
  • x, 概率向量
  • xy, 联合概率向量
  • unit,对数化的单位,默认为log2

函数使用:


# 创建数据集
> x3 <- 1:10/sum(1:10)
> y3<- 20:29/sum(20:29)
> xy3 <- 1:10/sum(1:10)

# 计算互信息
> MI(x3, y3, xy3)
[1] 3.311973

3.5 KL()散度
KL()函数,计算两个概率分布P和Q的Kullback-Leibler散度。
函数定义:

KL(x, test.na = TRUE, unit = "log2", est.prob = NULL)

参数列表:

  • x, 概率向量或数据框
  • test.na, 是否检查NA值
  • unit,对数化的单位,默认为log2
  • est.prob, 用计数向量估计概率的方法,默认值NULL。

函数使用:


# 创建数据集
> df4 <- rbind(x3,y3);df4
         [,1]       [,2]       [,3]       [,4]       [,5]      [,6]      [,7]      [,8]      [,9]
x3 0.01818182 0.03636364 0.05454545 0.07272727 0.09090909 0.1090909 0.1272727 0.1454545 0.1636364
y3 0.08163265 0.08571429 0.08979592 0.09387755 0.09795918 0.1020408 0.1061224 0.1102041 0.1142857
       [,10]
x3 0.1818182
y3 0.1183673

# 计算KL散度 
> KL(df4, unit = "log2") # Default
kullback-leibler 
       0.1392629 
> KL(df4, unit = "log10")
kullback-leibler 
       0.0419223 
> KL(df4, unit = "log")
kullback-leibler 
      0.09652967 

3.5 JSD()散度

JSD()函数,基于具有相等权重的Jensen-Shannon散度,计算距离矩阵或距离值。

公式定义:

函数定义:

JSD(x, test.na = TRUE, unit = "log2", est.prob = NULL)

参数列表:

  • x, 概率向量或数据框
  • test.na, 是否检查NA值
  • unit, 对数化的单位,默认为log2
  • est.prob, 用计数向量估计概率的方法,默认值NULL。

# 创建数据
> x5 <- 1:10
> y5 <- 20:29
> df5 <- rbind(x5,y5)

# 计算JSD
> JSD(df5,unit='log2')
jensen-shannon 
      50.11323 
> JSD(df5,unit='log')
jensen-shannon 
      34.73585 
> JSD(df5,unit='log10')
jensen-shannon 
      15.08559 

# 计算JSD,满足est.prob
> JSD(df5, est.prob = "empirical")
jensen-shannon 
    0.03792749 

3.6 gJSD()散度

gJSD()函数,计算概率矩阵的广义Jensen-Shannon散度。

公式定义:

函数定义:

gJSD(x, unit = "log2", weights = NULL)

参数列表:

  • x, 概率矩阵
  • unit, 对数化的单位,默认为log2
  • weights, 指定x中每个值的权重,默认值NULL。

# 创建数据
> Prob <- rbind(1:10/sum(1:10), 20:29/sum(20:29), 30:39/sum(30:39))

# 计算gJSD
> gJSD(Prob)
[1] 0.023325

4. 应用举例

在我们了解了熵的公式原理和使用方法后,我们就可以做一个案例来试一下。我们定义一个场景的目标:通过用户的看书行为,预测用户是否爱玩游戏。通过我们一步一步地推倒,我们计算出熵,条件熵,联合熵,互信息等指标。

第一步,创建数据集为2列,X列用户看书的类型,包括旅游(Tourism)、美食(Food)、IT技术(IT),Y列用户是否喜欢打游戏,喜欢(Y),不喜欢(N)。


X,Y
Tourism,Y
Food,N
IT,Y
Tourism,N
Tourism,N
IT,Y
Food,N
Tourism,Y

第二步,建立联合概率矩阵,分别计算H(X),Y(X)。

X Y N p(X)
Tourism 2/8=0.25 2/8=0.25 0.25+0.25=0.5
Food 0/8=0 2/8=0.25 0+0.25=0.25
IT 2/8=0.25 0/8=0 0.25+0=0.25
p(Y) 0.25+0+0.25=0.5 0.25+0.25+0=0.5

计算过程


# 分别计算每种情况的概率
p(X=Tourism) = 2/8 + 2/8 = 0.5
p(X=Food) = 2/8 + 0/8 = 0.25
p(X=IT) = 0/8 + 2/8 = 0.25
p(Y=Y) = 4/8 = 0.5
p(Y=N) = 4/8 = 0.5

# 计算H(X)
H(X) = -∑p(xi)*log2(p(xi)) 
 = -p(X=Tourism)*log2(p(X=Tourism) ) -p(X=Food)*log2(p(X=Food) ) -p(X=IT)*log2(p(X=IT) ) 
 = -0.5*log(0.5) -0.25*log(0.25) - 0.25*log(0.25)
 = 1.5

# 计算H(Y)
H(Y) = -∑p(yi)*log2(p(yi)) 
 = -p(Y=Y)*log2(p(Y=Y)) -p(Y=N)*log2(p(Y=N))
 = -0.5*log(0.5) -0.5*log(0.5)
 = 1

第三步,计算每一项的条件熵,H(Y|X=Tourism),H(Y|X=Food),H(Y|X=IT)。


H(Y|X=Tourism) = -p(Y|X=Tourism)*log(p(Y|X=Tourism)) - p(N|X=Tourism)*log(p(N|X=Tourism))
 = -0.5*log(0.5) -0.5*log(0.5)
 = 1

H(Y|X=Food) = -p(Y|X=Food)*log(p(Y|X=Food)) -p(N|X=Food)*log(p(N|X=Food))
 = -0*log(0) -1*log(1)
 = 0

H(Y|X=IT) = -p(Y|X=IT)*log(p(Y|X=IT)) -p(N|X=IT)*log(p(N|X=IT))
 = -1*log(1) -0*log(0) 
 = 0

第四步,计算条件熵H(Y|X)


H(Y|X) = ∑p(xi)*H(Y|xi)
 = p(X=Tourism)*H(Y|X=Tourism) + p(X=Food)*H(Y|X=Food) + p(X=IT)*H(Y|X=IT)
 = 0.5*1 + 0.25*0 + 0.25*0
 = 0.5

第五步,计算联合熵H(X,Y)


H(X,Y) = −∑p(x,y)log(p(x,y))
 = H(X) + H(Y|X)
 = 1.5 + 0.5
 = 2

第六步,计算互信息I(X;Y)


I(X;Y) = H(Y) - H(Y|X)  = 1 - 0.5 = 0.5
 = H(X) + H(Y) - H(X,Y) = 1.5 + 1 - 2 = 0.5

我们把上面的推到过程,用程序来实现一下。


# 创建数据集
> X<-c('Tourism','Food','IT','Tourism','Tourism','IT','Food','Tourism')
> Y<-c('Y','N','Y','N','N','Y','N','Y') 
> df<-cbind(X,Y);df
     X         Y  
[1,] "Tourism" "Y"
[2,] "Food"    "N"
[3,] "IT"      "Y"
[4,] "Tourism" "N"
[5,] "Tourism" "N"
[6,] "IT"      "Y"
[7,] "Food"    "N"
[8,] "Tourism" "Y

变型为频率矩阵


> tf<-table(df[,1],df[,2]);tf
         
          N Y
  Food    2 0
  IT      0 2
  Tourism 2 2

计算概率矩阵


> pX<-margin.table(tf,1)/margin.table(tf);pX
Tourism    Food      IT 
   0.50    0.25    0.25 
> pY<-margin.table(tf,2)/margin.table(tf);pY
  Y   N 
0.5 0.5 
> pXY<-prop.table(tf);pXY
           Y    N
Tourism 0.25 0.25
Food    0.00 0.25
IT      0.25 0.00

计算熵


> H(pX)
[1] 1.5
> H(pY)
[1] 1

# 条件熵 
> CE(pX,pY)
[1] 0.5

# 联合熵 
> JE(pXY)
[1] 2

# 互信息
> MI(pX,pY,pXY)
[1] 0.5

计算原理是复杂的,用R语言的程序实现却是很简单的,几行代码就搞定了,

本文只是对的信息论的初探,重点还是在信息度量方法的R语言实现。信息熵作为信息度量的基本方法,对各种主流的机器学习的算法都有支撑,是我们必须要掌握的知识。了解本质才能发挥数据科学的潜力,学习的路上不断积累和前进。

转载请注明出处:
http://blog.fens.me/r-entropy

打赏作者

R语言实现46种距离算法

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员/Quant: Java,R,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-distance

前言

距离算法是做数据挖掘常用的一类算法,距离算法有很多种,比如欧式距离、马氏距离、皮尔逊距离,距离算法主要应用在计算数据集之间关系。本文用R语言来philentropy包,实现多种距离的算法,很多可能是大家完全没有听过的,让我们在开拓一下知识领域吧。

目录

  1. 距离算法包philentropy
  2. 46种距离算法详解
  3. 距离函数的使用

1.距离算法包philentropy

在做距离算法调研时,无意中发了philentropy包。它实现了46个不同距离算法和相似性度量,通过不同数据的相似度比较,为基础研究提供了科学基础。philentropy包,为聚类、分类、统计推断、拟合优度、非参数统计、信息理论和机器学习提供了核心的计算框架,支持基于单变量或者多变量的概率函数的计算。

philentropy包主要包括了2种度量的计算方法,距离度量和信息度量。本文介绍距离度量的使用,对于信息度量的使用,请参考文章R语言实现信息度量

philentropy项目github地址:https://github.com/HajkD/philentropy

本文的系统环境为:

  • Win10 64bit
  • R: 3.4.2 x86_64-w64-mingw32

安装philentropy包,非常简单,一条命令就可以了。

~ R
> install.packages("philentropy")
> library(philentropy)

查看距离算法列表

> getDistMethods()
 [1] "euclidean"         "manhattan"         "minkowski"         "chebyshev"        
 [5] "sorensen"          "gower"             "soergel"           "kulczynski_d"     
 [9] "canberra"          "lorentzian"        "intersection"      "non-intersection" 
[13] "wavehedges"        "czekanowski"       "motyka"            "kulczynski_s"     
[17] "tanimoto"          "ruzicka"           "inner_product"     "harmonic_mean"    
[21] "cosine"            "hassebrook"        "jaccard"           "dice"             
[25] "fidelity"          "bhattacharyya"     "hellinger"         "matusita"         
[29] "squared_chord"     "squared_euclidean" "pearson"           "neyman"           
[33] "squared_chi"       "prob_symm"         "divergence"        "clark"            
[37] "additive_symm"     "kullback-leibler"  "jeffreys"          "k_divergence"     
[41] "topsoe"            "jensen-shannon"    "jensen_difference" "taneja"           
[45] "kumar-johnson"     "avg"    

46个距离算法,有一些是我们常用的比如:euclidean,manhattan,minkowski,pearson, cosine,squared_chi, 其他的我也不知道,正好拓宽知识,好好学习一下。

philentropy包的函数,其实很简单,只有14个,大量的算法其实都已经被封装到distance()函数中,直接使用distance()函数就行完成各种算法的计算,让我们使用起来会非常方便。我们来看一下,函数列表:

  • distance(): 计算距离
  • getDistMethods(),获得距离算法列表
  • dist.diversity(),概率密度函数之间的距离差异
  • estimate.probability(),从计数向量估计概率向量
  • lin.cor(),线性相关性判断
  • H(): 香农熵, Shannon’s Entropy H(X)
  • JE() : 联合熵, Joint-Entropy H(X,Y)
  • CE() : 条件熵, Conditional-Entropy H(X|Y)
  • MI() : 互信息, Shannon’s Mutual Information I(X,Y)
  • KL() : KL散度, Kullback–Leibler Divergence
  • JSD() : JS散度,Jensen-Shannon Divergence
  • gJSD() : 通用JS散度,Generalized Jensen-Shannon Divergence
  • binned.kernel.est(),实现了KernSmooth包提供的核密度估计函数的接口

从函数列表来看,主要分为3种类别的函数,第一类是距离测量的函数,包括distance(),
getDistMethods(), dist.diversity(), lin.cor()和 estimate.probability()。第二类是相关性分析,包括lin.cor()函数。第三类是信息度量函数H(),JE(),CE(),MI(),KL(),JSD(),gJSD()。信息度量函数的使用,请参考文章R语言实现信息度量

2. 46种算法详解

接下来,就让我们深入每个算法吧,从名字到公式,再到函数使用,最后到使用场景。

距离算法列表:

  • euclidean:欧式距离,是一个通常采用的距离定义,在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。
  • manhattan:曼哈顿距离,用于几何空间度量,表示两个点在标准坐标系上的绝对轴距距离总和。
  • minkowski:闵可夫斯基距离,是欧氏空间中的广义距离函数,其参数p值的不同代表着对空间不同的度量。
  • chebyshev:切比雪夫距离,是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。
  • sorensen:测量每个样本单位,对单位总数的距离测量贡献度,广告用于生态学。
  • gower:高尔距离,将向量空间缩放为规范化空间,可计算逻辑值,数字,文本的距离,距离结果为0到1之间的数字。
  • soergel:测量每个样本单位,对最大值总数的距离测量贡献度。
  • kulczynski:与soergel相反,测量每个样本单位,对最小值总数的距离测量贡献度。
  • canberra:堪培拉距离,是矢量空间中的点对之间的距离的数值度量,它是L_1距离的加权版本。
  • lorentzian:洛伦兹距离,绝对的差异并应用自然对数。
  • intersection:交叉距离,最小轨道交叉距离,是天文学中用于评估天文物体之间潜在的近距离接近和碰撞风险的度量。它被定义为两个物体的密切轨道的最近点之间的距离。
  • non-intersection:非交叉距离
  • wavehedges:波浪距离,
  • czekanowski:
  • motyka:莫蒂卡方程,是czekanowski的一半。
  • kulczynski_s:
  • tanimoto:是标准化内积的另一种变体。
  • ruzicka:
  • inner_product:内部产品空间,计算两个向量的内积产生标量,有时称为标量积或点积。
  • harmonic_mean:调和平均值。
  • cosine:余弦距离,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。
  • hassebrook(PCE):利用P•Q来测量能量的峰值,简称PCE。
  • jaccard:杰卡德距离,用于计算样本间的相似度,分子是A和B的交集大小,分母是A和B的并集大小。
  • dice:骰子
  • fidelity:保真度,在量子信息理论中,保真度是两个量子态“接近”的度量。
  • bhattacharyya:巴氏距离,测量两个概率分布的相似性。
  • hellinger:海林格,用来度量两个概率分布的相似度,它是F散度的一种。
  • matusita:
  • squared_chord:
  • squared_euclidean:欧式距离的平方
  • pearson:皮尔森距离,分子是两个集合的交集大小,分母是两个集合大小的几何平均值,是余弦距离的一种变型。
  • neyman:奈曼,
  • squared_chi:
  • prob_symm:
  • divergence:散度,
  • clark:克拉克,
  • additive_symm:算术和几何平均散度.
  • kullback-leibler:KL散度,用于计算相熵或信息偏差,是衡量两个分布(P、Q)之间的距离,越小越相似。
  • jeffreys:杰弗里斯,J分歧。
  • k_divergence:K散度,
  • topsoe:托普索,是k_divergence加法的对称形式。
  • jensen-shannon:詹森香农,是topsoe距离的一半。
  • jensen_difference:
  • taneja:塔内加,计算算术和几何平均偏差。
  • kumar-johnson:库马尔-约翰逊,
  • avg:平均

由于精力和基础知识有限,对每一种算法还没有更深入的理解和使用,后面会继续补充。这些距离的详细解释,请参考文章 http://csis.pace.edu/ctappert/dps/d861-12/session4-p2.pdf

这么多种的距离算法,其实可以分成8大距离家族,每个家族中不同的算法思路是类似的,可以通过变形或参数不同赋值,进行算法的相互转换。

L_p Minkowski家族,通过对Minkowski 算法p值的不同赋值,可以转换成不同的算法,当p=1时Minkowski距离转为曼哈顿距离;当p=2变Minkowski距离转为欧氏距离;当p接近极限最大值时,Minkowski距离是转为切比雪夫距离。

L_1家族,用于准确的测量绝对差异的特征。

Intersection 交叉距离家族,用于交叉点之间的相似度变换。

Inter Product 家族,几何空间的相似性度量,用于特定的 P•Q 变量来计算。

Squared-chord 家族,在量子信息理论中,量子态“接近”的度量。

Squared L_2 家族( X^2 Squared 家族),以平方的欧几里得距离做为被除数。

香浓信息熵家族,信息熵偏差测量。

组合公式,利用多种算法思路,进行组合的距离测量方法。

3. 距离函数的使用

了解了这么多的距离算法后,让我们来使用一下philentropy包强大的功能函数,把算法落地。

3.1 distance()函数使用
distance()函数,用来计算两个概率密度函数之间的距离和相似度,上面所列出的所有的距离算法都被封装在了这个函数里。

distance()函数定义:

distance(x, method = "euclidean", p = NULL, test.na = TRUE, unit = "log", est.prob = NULL)

参数列表:

  • x, 数值类型的向量或数据集
  • method, 算法的名称
  • p, minkowski闵可夫斯基距离的p值,p=1为曼哈顿距离,p=2为欧氏距离,p取极限时是切比雪夫距离
  • test.na, 检测数据集是否有NA值,不检测为FALSE,计算会快。
  • unit,对数化的单位,依赖于日志计算的距离
  • est.prob 从计数估计概率,默认值为NULL

计算euclidean距离,用iris的数据集。

> library(magrittr)

# 查看iris数据集
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

计算第1个点(第1行)和第2个点(第2行)的euclidean距离,分别使用philentropy包的distance(),Stats包的dist(),和自己通过公式计算。

# 使用distance()函数
> dat1<-iris[1:2,-5]
> distance(dat1, method="euclidean")
Metric: 'euclidean' using unit: 'log'.
euclidean 
0.5385165 

# 再使用系统自带的dist()函数
> dist(dat1)
          1
2 0.5385165

# 公式计算
> (dat1[1,]-dat1[2,])^2 %>% sum %>% sqrt
[1] 0.5385165

3种方法,计算的结果是完全一致。

接下来,我们构建一个iris的距离矩阵,为了展示清楚,我们选iris的前6个点来计算距离。分别使用distance()和dist()函数。


> dat2<-head(iris[,-5])

# 距离矩阵
> distance(dat2)
Metric: 'euclidean' using unit: 'log'.
          v1        v2       v3        v4        v5        v6
v1 0.0000000 0.5385165 0.509902 0.6480741 0.1414214 0.6164414
v2 0.5385165 0.0000000 0.300000 0.3316625 0.6082763 1.0908712
v3 0.5099020 0.3000000 0.000000 0.2449490 0.5099020 1.0862780
v4 0.6480741 0.3316625 0.244949 0.0000000 0.6480741 1.1661904
v5 0.1414214 0.6082763 0.509902 0.6480741 0.0000000 0.6164414
v6 0.6164414 1.0908712 1.086278 1.1661904 0.6164414 0.0000000

# 下三角距离矩阵
> dist(dat2)
          1         2         3         4         5
2 0.5385165                                        
3 0.5099020 0.3000000                              
4 0.6480741 0.3316625 0.2449490                    
5 0.1414214 0.6082763 0.5099020 0.6480741          
6 0.6164414 1.0908712 1.0862780 1.1661904 0.6164414

验证后,我们就可以放心使用distance()函数。通过对比实验,我们可以很快的学习并使用各种距离算法。

3.2 dist.diversity()函数
dist.diversity()函数,用来计算所有距离的值。由于有一些距离有对于数据集本身的要求,所以我们需要构建一个能适应所有距离算法的数据集。


# 生成数据集,2个点,10个维度
> P <- 1:10/sum(1:10)
> Q <- 20:29/sum(20:29)
> x <- rbind(P,Q)

# 打印数据集
> head(x)
        [,1]       [,2]       [,3]       [,4]       [,5]      [,6]      [,7]      [,8]
P 0.01818182 0.03636364 0.05454545 0.07272727 0.09090909 0.1090909 0.1272727 0.1454545
Q 0.08163265 0.08571429 0.08979592 0.09387755 0.09795918 0.1020408 0.1061224 0.1102041
       [,9]     [,10]
P 0.1636364 0.1818182
Q 0.1142857 0.1183673

使用dist.diversity()函数计算所有的距离。

> dist.diversity(x,p=2)
euclidean         manhattan         minkowski         chebyshev          sorensen 
       0.12807130        0.35250464        0.12807130        0.06345083        0.17625232 
            gower           soergel      kulczynski_d          canberra        lorentzian 
       0.03525046        0.29968454        0.42792793        2.09927095        0.34457827 
     intersection  non-intersection        wavehedges       czekanowski            motyka 
       0.82374768        0.17625232        3.16657887        0.17625232        0.58812616 
     kulczynski_s          tanimoto           ruzicka     inner_product     harmonic_mean 
       2.33684211        0.29968454        0.70031546        0.10612245        0.94948528 
           cosine        hassebrook           jaccard              dice          fidelity 
       0.93427641        0.86613103        0.13386897        0.07173611        0.97312397 
    bhattacharyya         hellinger          matusita     squared_chord squared_euclidean 
       0.02724379        0.32787819        0.23184489        0.05375205        0.01640226 
          pearson            neyman       squared_chi         prob_symm        divergence 
       0.16814418        0.36742465        0.10102943        0.20205886        1.49843905 
            clark     additive_symm  kullback-leibler          jeffreys      k_divergence 
       0.86557468        0.53556883        0.09652967        0.22015096        0.02922498 
           topsoe    jensen-shannon jensen_difference            taneja     kumar-johnson 
       0.05257867        0.02628933        0.02628933        0.02874841        0.62779644 
              avg 
       0.20797774 

3.3 estimate.probability()函数
estimate.probability()函数,采用数字计数来计算向量的估计概率。estimate.probability()函数方法实现,目前只有一个方法实现,计算每个值占合计的比率,其实就是一种数据标准归的计算方法。

> estimate.probability
function (x, method = "empirical") 
{
    if (!is.element(method, c("empirical"))) 
        stop("Please choose a valid probability estimation method.")
    if (method == "empirical") {
        return(x/sum(x))
    }
}
>environment: namespace:philentropy<

我们新建一个向量,用estimate.probability()函数,来计算向量的估计概率。

# 新建x1向量
> x1<-runif(100);head(x1)
[1] 0.6598775 0.2588441 0.5329965 0.5294842 0.8331355 0.3326702

# 计算估计概率
> x2<-estimate.probability(x1);head(x2)
[1] 0.013828675 0.005424447 0.011169702 0.011096097 0.017459543 0.006971580

# 打印统计概率
> summary(x2)
Min.   1st Qu.    Median      Mean   3rd Qu.      Max.
0.0002181 0.0044882 0.0096318 0.0100000 0.0153569 0.0206782

# 画散点图
> plot(x1,x2)

从图中看到,整个数据分布在对角线上,x1为均匀分布生成的向量,x2为x1的估计概率,仅仅做了做数据值域进行了缩放,并没有影响数据的分布变化和线性特征,其实就是对数据做了一个标准化的过程。

3.4 lin.cor()函数
lin.cor()函数,用来计算两个向量之间的线性相关,或计算矩阵的相关矩阵。

函数定义:

lin.cor(x, y = NULL, method = "pearson", test.na = FALSE)

参数列表:

  • x,变量1
  • y,变量2,与x进行比较
  • method,相关性算法的名称,默认为pearson距离算法,支持5种算法分为是pearson,pearson2,sq_pearson,kendall,spearman
  • test.na, 检测数据集是否有NA值,不检测为FALSE,计算会快。

相关性计算,最大值1为完全正相关,最小值-1为完全负相关,0为不相关。我们来创建数据集,进行相关性的测试。

# 创建向量x1,x2,x3
> x1<-runif(100)
> x2<-estimate.probability(x1)
> x3<-rnorm(100)

# 判断x1,x2的相关性,pearson 皮尔森相关系数
> lin.cor(x1,x2)
pearson 
      1 

# 判断x1,x3的相关性,pearson 皮尔森相关系数
> lin.cor(x1,x3)
  pearson 
0.0852527 

# 判断x1,x3的相关性,pearson2 皮尔森非集中的相关系数
> lin.cor(x1,x3,method = 'pearson2')
  pearson2 
0.01537887 

# 判断x1,x3的相关性,sq_pearson 皮尔森平方的相关系数
> lin.cor(x1,x3,method = 'sq_pearson')
sq_pearson 
0.00151915 

# 判断x1,x3的相关性,kendall 肯德尔相关系数
> lin.cor(x1,x3,method = 'kendall')
kendall 
      0 

# 判断x1,x3的相关性,spearman 斯皮尔曼相关系数
> lin.cor(x1,x3,method = 'spearman')
spearman 
       0 

通过lin.cor()函数,可以快速进行线性相关性的验证,非常方便。

本文重点介绍了philentropy包,对于距离算法的定义和距离测量的函数的使用。很多的距离算法我也是第一次学习,知识需要积累和总结,本文不完善的内容,后面我们找时间再进行补充。如果本文描述有不当的地方,也请各位朋友,给予指点,让我们一起把知识进行积累。

下一篇文章我们将介绍信息度量函数的使用和算法,请大家继续阅读文章用R语言实现信息度量

转载请注明出处:
http://blog.fens.me/r-distance

打赏作者