如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法

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 【问题描述】:

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

假设我在名为newvardata.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

这将完美地重构转换。但它完全无用

【讨论】:

以上是关于如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中以编程方式反编译 dex 文件?

如何进行反编程?

可以反编译我的应用程序以显示字符串常量吗? [复制]

逆向工程保护

Android 设备如何以编程方式推断它所连接的 Linux 设备的 IP 地址?

如何“反编译”Java 类文件? [关闭]