【问题标题】:any way to do feature selection for dataframe by computing its mutual information or information gain in R?有什么方法可以通过计算 R 中的互信息或信息增益来为数据框进行特征选择?
【发布时间】:2019-07-15 21:42:54
【问题描述】:

我有兴趣计算所有数据帧行(也称为特征)的互信息熵,然后通过查找其 MI 值来进行特征选择。在我的数据集中,行是原始特征集,列是不同的组。我了解 NLP 中成对互信息 (PMI) 的概念,但不太确定 R 中的 MI。本质上,我想通过计算其互信息熵来进行特征选择。我怎么能在 R 中做到这一点?有什么有效的方法可以做到这一点?或者是否有任何 R 包可以为特征选择做到这一点?任何想法将不胜感激。

可重复的数据

这里是可重复使用的数据:

> dput(HTA20_filt_corr[1:20, 1:5])
structure(c(6.06221469449721, 3.79648446367096, 4.44302662142323, 
5.83652223195279, 2.68934375273141, 2.74561888109989, 3.79468365910661, 
2.84818282222582, 2.14058977019523, 2.6928480064245, 2.35292391447048, 
2.48476830655452, 6.53876010917445, 4.65751152599579, 3.04781583130435, 
5.77123333840058, 3.12373340327186, 2.19534644753427, 2.97565909758917, 
3.32457362519432, 5.8755020052495, 3.45024474095539, 4.3934877055859, 
5.89836406552412, 2.55675627493564, 2.70765553292035, 4.29971184424969, 
2.48325694938049, 2.26880029802564, 3.03461160119094, 2.3853610213164, 
2.28880889278209, 7.38935014141236, 5.99396449205588, 2.81020023855867, 
6.15414625452898, 2.71038534186171, 2.23803889487068, 2.83352503485538, 
3.40195667040699, 6.12613148162098, 3.62841140410044, 4.6237834519809, 
6.01979203584278, 2.61341541015611, 2.80774129091983, 3.81085169542991, 
3.2386968734862, 2.3315210232915, 2.75618624035735, 2.36292219228603, 
2.31409329648109, 6.89661896623484, 4.94260091412701, 3.30560274327296, 
5.4547259473827, 2.41056409104863, 2.26899775961818, 2.6699701841279, 
3.01459760807053, 6.1345548976595, 3.51232455992681, 4.66743523288194, 
5.98400432133011, 2.69430042092269, 2.8653583834812, 3.81895258294878, 
2.72080210986981, 2.33064119419619, 2.77388400895015, 2.46939314182722, 
2.28927162732448, 6.93808821971072, 5.63306489420911, 2.75877942216047, 
5.82872398278859, 2.92710196023309, 2.34137181372226, 2.52271243341233, 
2.96285787017003, 6.28953417729806, 3.56819306931016, 4.97483476597509, 
6.1149144301085, 2.73207812554522, 3.00137677271996, 4.03594900960396, 
2.58058159047299, 2.24052626899434, 3.2286586324064, 2.30413560438815, 
2.38147147362554, 6.58149585137493, 4.16189923349488, 2.36086328728537, 
5.57065453220316, 2.57313948725185, 2.36046878474564, 2.54370710157379, 
2.97488700289993), .Dim = c(20L, 5L), .Dimnames = list(c("1_at", 
"10_at", "100009613_at", "100009676_at", "10003_at", "100033411_at", 
"100033414_at", "100033418_at", "100033422_at", "100033423_at", 
"100033424_at", "100033425_at", "100033426_at", "100033431_at", 
"100033432_at", "100033434_at", "100033436_at", "100033437_at", 
"100033438_at", "100033439_at"), c("Tarca_001_P1A01", "Tarca_004_P1A04", 
"Tarca_005_P1A05", "Tarca_007_P1A07", "Tarca_008_P1A08")))

我的微不足道的尝试

require(infotheo)
apply(HTA20_filt_corr,1, mutinformation)

但我认为这不是计算互信息并基于此进行特征选择的正确方法。谁能指出我如何做到这一点?谢谢

想要的输出

基本上,在我预期的输出中,应该通过查找其互信息熵表来缩小/过滤原始数据帧的特征。我怎样才能在 R 中完成这项工作?有什么想法吗?

【问题讨论】:

  • 我不确定您的意图。互信息是两个参数(两个特征,因此称为“互”)的函数,因此对于每个特征,您将拥有与数据集中的特征一样多的数字。你打算如何过滤?
  • @January 感谢您的提醒。在我的实际数据集中,我有 32830 行和 735 列。您是否认为可以计算行与列的互信息并设置阈值来过滤行?我们还可以递归地逐行计算 MI 值吗?非常感谢
  • “对列行” - 我认为这没有任何意义。您可以询问基因 X 提供了多少关于基因 Y 的信息,反之亦然(这是 MI)。你不能问“基因 X 提供了多少关于样本 Z 的信息”。这就像问“基因X和样本Z之间的相关系数是多少”。
  • 如果“过滤基因”是指“使用 MI 过滤基因”,我不知道。这类似于使用相关系数过滤基因。你的目标是什么?但是,如果您指的是如何过滤基因,那么有很多选择;但这是另一个比 stackoverflow 更适合 BioStars 的问题。
  • 给定感兴趣的基因 x 和离散基因表达值矩阵 Y(其中基因在列中),尝试运行 apply(Y, 2, function(y) mutinformation(Y[,x], y))。这应该返回一个您可以订购的向量。但是请注意,对于您展示的少数样本,MI 离散化不会允许 MI 的高分辨率,因此您将拥有数百个具有相同 MI 的基因。

标签: r dplyr feature-extraction


【解决方案1】:

互信息有点像相关性:您至少需要两个向量。使用您的数据,您可以计算例如 100009613_at 和 10003_at 之间的互信息。或针对所有功能的所有功能。但首先,您需要转换数据:首先需要对互信息进行离散化。

mtx <- data.matrix(HTA20_filt_corr)
mtx <- t(mtx) # features in columns
mtxd <- discretize(mtx, nbins=3)

mutinformation(mtxd[,"100009613_at"], mtxd[,"10003_at"])
# [1] 0.7776613

# or, each against each
eae <- mutinformation(mtxd)

看看mtxd。它是一个方阵。那么,您想如何使用它来过滤特征?

【讨论】:

  • 很遗憾,我不确定您的意思。为什么要创建一个嵌套循环,它与递归有什么关系?您要计算哪个 MI?你能详细说明你的问题吗?
  • 我认为[[float(y) for y in x] for x in l] 是这样的,并用它来计算互信息。你能更新你的解决方案吗?非常感谢
  • 如果您可以通过一个调用直接完成,为什么还要使用此构造? mutinformation(mtxd) 分别计算每个并返回一个方阵。
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 2020-09-22
  • 2014-10-17
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2016-05-28
  • 2015-06-03
相关资源
最近更新 更多