如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法
Posted
技术标签:
【中文标题】如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法【英文标题】:how to programmatically back-out, deduce, decompile, reverse-engineer the algorithm used to construct a variable in a data set 【发布时间】:2013-08-14 05:51:55 【问题描述】:我正在寻找一些算法或程序或函数来推断变量是如何创建的,只要我提供其他变量。我认为计算机程序员会称之为“反编译”,架构师会称之为“逆向工程”,但我想我不知道统计学家会称之为什么......或者是否有公认的方法来做到这一点。
假设我在名为newvar
的data.frame
中有一个分类 列,但我不知道它是如何构建的。但我确实知道创建它时使用了哪些变量……或者至少我可以提供一组详尽的用于创建它的变量——即使并非所有变量都被使用。
# 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
的构造,但这仍然需要进行一些思考并将系数拼凑在一起,以准确弄清楚黑匣子内发生了什么。
是否有任何可用的算法可以猜测黑匣子,可以这么说?谢谢!!
【问题讨论】:
Gordon Way 编写了一款名为“Reason”的软件,正是这样做的。 抱歉,我的 babelfish 没有正确放入,请重复一遍好吗? crantastic.org/packages/emulator 使用这种魔法将程序视为黑匣子 @AnthonyDamico bit.ly/122gnOx @AriB.Friedman 哈哈,我明白了,你的蛇球。 :P babelfish 和 gordon way 都是道格拉斯·亚当斯的作品。 【参考方案1】:一般来说,不会。即使应用了大量关于可能发生的事情的知识,它仍然(可能)不是。让我从你的例子中向你展示一个例子。添加“黑匣子”的知识,即输出是离散值并且它们是基于其他值的阈值导出的,分类树应该能够恢复标准。所以:
library("party")
tmp <- ctree(factor(newvar) ~ ., data=x,
controls=ctree_control(mincriterion=0, minsplit=2, minbucket=1))
我已将控制值设置为完全不合理的值,以强制算法驱动每个存储桶只包含一个值。即便如此,它也不是你开始的:
所以用一个简单的例子,加上更多关于转换的知识,是做不到的,一般情况下真的没有希望能做到。
【讨论】:
【参考方案2】:反编译是完全不同的东西。它检查实际的源代码,并生成一个产生相同结果的程序。它主要适用于编译成基本上等同于源代码的中间语言的语言(减去 cmets、变量名等)。由于汇编程序本质上可以 1:1 表示机器代码,因此您可以将完全编译的程序反编译成汇编程序(但这不意味着您真的了解它们的作用,或者它们是用汇编程序编写的)。 p>
现在,如果您尝试对数据转换执行此操作,则只能希望以一定的概率获得此结果。这就像试图通过查看输出来反编译程序。
我相信您最感兴趣的技术是决策树,因为它们会产生人类可解释的结果,可以很容易地转化为许多原始表达式(如果这样,那么那样) .
很有可能,树仍然会出现不同的见解,而不是用于构建数据的见解。
永远记住,构造可以是任意复杂的,包括随机。
你不能期待完美的结果。如果您想要可读结果并希望避免过度拟合,决策树可能“尽其所能”。
回忆过拟合:表达式可能总是
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
这将完美地重构转换。但它完全无用。
【讨论】:
以上是关于如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法的主要内容,如果未能解决你的问题,请参考以下文章