2

我正在寻找一些算法或程序或函数来推断变量是如何创建的,只要我提供其他变量。我认为计算机程序员会称之为“反编译”,架构师会称之为“逆向工程”,但我想我不知道统计学家会称之为什么......或者是否有公认的方法来做到这一点。

假设我在被调用中有一个分类列,但我不知道它是如何构造的。但我确实知道用于创建它的变量是什么……或者至少我可以提供一组用于创建它的详尽变量——即使并非所有变量都被使用。data.framenewvar

# start with an example data set
x <- mtcars

# # # # # # # # # # # # # # # # # # # # # # # #
# pretend this block of code is a black box
x <-
    transform(
        x ,
        newvar =
            ifelse( mpg > 24 , 1 ,
            ifelse( cyl == 6 , 9 ,
            ifelse( hp > 120 , 4 ,
            ifelse( mpg > 22 , 7 , 2 ) ) ) )
    )
# end of unknown block of code
# # # # # # # # # # # # # # # # # # # # # # # #

# now knowing that `mtcars` has only 11 columns to choose from
names(x)

# how were these 11 columns used to construct `newvar`?
table( x$newvar )

# here's a start..
y <- data.frame( ftable( x[ , c( 'mpg' , 'cyl' , 'hp' , 'newvar' ) ] ) )
# ..combinations with any records
y[y[,5]!=0,]
# but that's not enough to back-out the construction

所以我认为您可以使用线性回归或决策树来退出构建newvar,但这仍然需要一些思考并将系数拼凑在一起才能准确地弄清楚黑匣子内发生了什么。

可以这么说,是否有任何可用的算法可以猜测黑匣子?谢谢!!

4

2 回答 2

5

一般来说,没有。即使应用了很多关于可能发生的事情的知识,它仍然(可能)不是。让我从你的例子中向你展示一个例子。添加“黑匣子”的知识,即输出是离散值并且它们是基于其他值的阈值得出的,分类树应该能够恢复标准。所以:

library("party")
tmp <- ctree(factor(newvar) ~ ., data=x, 
  controls=ctree_control(mincriterion=0, minsplit=2, minbucket=1))

我将控制值设置为完全不合理的值,以强制算法驱动每个存储桶只包含一个值。即便如此,它也不是你开始的:

在此处输入图像描述

所以用一个简单的例子,加上更多关于变换的知识,是做不到的,一般情况下真的不希望能做到。

于 2013-08-12T20:08:58.230 回答
3

反编译是完全不同的东西。它检查实际的源代码,并生成一个产生相同结果的程序。它主要适用于编译成基本上等同于源代码的中间语言的语言(减去注释、变量名等)。由于汇编程序本质上可以 1:1 表示机器代码,因此您可以将完全编译的程序反编译成汇编程序(但这并不意味着您真正了解它们的作用,或者它们是用汇编程序编写的)。

现在,如果您尝试对数据转换执行此操作,则只能希望以一定的概率获得此结果。这就像试图通过查看输出来反编译程序

我相信你最感兴趣的技术是决策树,因为它们产生了一个人类可解释的结果,可以很容易地转化为许多原始表达式(如果这个,那么那个)。

很有可能,这棵树仍然会产生与用于构建数据的不同的见解。

永远记住,构造可以是任意复杂的,包括random

你不能期望一个完美的结果如果您想要可读的结果并希望避免过度拟合,决策树可能“尽其所能” 。

回想一下过拟合:表达式可能总是

if record == record1 then
  result = result1
else if record == record2 then
  result = result2
...
else if record == recordn then
  result = resultn
else
  result = random or fail badly

这将完美地重建转换。但这完全没用

于 2013-08-13T09:00:38.003 回答