答案跟每個數(shù)字里有多少個圈圈有關(guān)。在形狀上,8有2個圈,所以記兩次。0是一個大圈,記1次。所以2581=2。很有趣,不是嗎?這是一種通過隱含的計(jì)算方式得出的另一種數(shù)值對應(yīng)關(guān)系。
而困擾著我的卻是如何能以一種不基于數(shù)字形狀的方法來找到這種數(shù)值對應(yīng)關(guān)系。我如何能編程讓計(jì)算機(jī)來解決這個問題?我認(rèn)真思考了一下,因?yàn)槲蚁矚g自認(rèn)為是一個計(jì)量經(jīng)濟(jì)學(xué)家,這道題看起來頗像一個可以通過一個OLS(ordinary least squares)表達(dá)式來解決的聯(lián)立方程式。那么,如何能將這個問題和涉及到的數(shù)據(jù)轉(zhuǎn)化成一個小小的OLS表達(dá)式呢?我需要將每行的數(shù)字隊(duì)列轉(zhuǎn)換成一個描述數(shù)字出現(xiàn)頻率的表格。這樣,對于8809=6來說,我需要重構(gòu)出來的數(shù)據(jù)應(yīng)該類似于這樣:
1,0,0,0,0,0,0,0,2,1 = 6
在這種形式的公式中,10個數(shù)字分別代表著數(shù)字0-9在每串?dāng)?shù)據(jù)中出現(xiàn)的次數(shù)。我不知道如何得出這張頻次表,于是,按照我的習(xí)慣,我把這個問題做了一個簡潔的描述,張貼在StackOverflow.com上,如我愿的得到了一個極好的方案。一旦我建好了頻次表,問題就變成了一個簡單的關(guān)于10個獨(dú)立變量的線性表達(dá)式。
我的整個運(yùn)算腳本——如果你十分感興趣的話——就是下面這些,你可以把它粘貼到R語言解釋器里運(yùn)行。
## read in the training data
## more lines than it should be because of the https requirement in Github
temporaryFile <- tempfile()
download.file("https://raw.github.com/gist/2061284/44a4dc9b304249e7ab3add86bc245b6be64d2cdd/problem.csv",destfile=temporaryFile, method="curl")
series <- read.csv(temporaryFile)
## munge the data to create a frequency table
freqTable <- as.data.frame( t(apply(series[,1:4], 1, function(X) table(c(X, 0:9))-1)) )
names(freqTable) <- c("zero","one","two","three","four","five","six","seven","eight","nine")
freqTable$dep <- series[,5]
## now a simple OLS regression with no intercept
myModel <- lm(dep ~ 0 + zero + one + two + three + four + five + six + seven + eight + nine, data=freqTable)
round(myModel$coefficients)
最終的輸出結(jié)果如下:
> round(myModel$coefficients)
zero one two three four five six seven eight nine
1 0 0 0 NA 0 1 0 2 1
你可以看到,0,6和9對應(yīng)的值是1,而8對應(yīng)的值是2。其它數(shù)字對應(yīng)的都是0。而4得出的是NA,這是因?yàn)閿?shù)字序列中沒有出現(xiàn)4。
哈哈。我也跟學(xué)齡前兒童一樣聰明了。而且我還用程序做了驗(yàn)證。
該評論在 2012/4/10 15:14:10 編輯過