2010-07-04 37 views
4

由於我不知道我現在在做什麼,我的措辭聽起來可能很有趣。但嚴重的是,我需要學習。尋找估算方法(數據分析)

我面臨的問題是想出一個方法(模型)來估計軟件程序的工作方式:即運行時間和最大內存使用量。我已經有了大量的數據。該數據集概述了程序在不同條件下如何工作,例如

<code> 
RUN  Criterion_A Criterion_B Criterion_C Criterion_D Criterion_E <br> 
------------------------------------------------------------------------ 
R0001   12   2   3556   27   9 <br>  
R0002   2   5   2154   22   8 <br> 
R0003   19  12   5556   37   9 <br> 
R0004   10   3   1556    7   9 <br> 
R0005   5   1   556   17   8 <br> 
</code> 

我有成千上萬行這樣的數據。現在我需要知道如果我事先知道所有標準,我如何估計(預測)運行時間和最大內存使用情況。我需要的是提供提示(上限或範圍)的近似值。

我感覺它是典型的?問題,我不知道。你們能向我展示一些提示或給我一些想法(理論,解釋,網頁)或任何可能有幫助的東西。謝謝!

+1

因此,對於每個「RUN」,您是否也知道時間和內存使用情況? – unutbu 2010-07-05 00:03:06

+0

是的。運行時間和內存使用情況保存在表格中。他們是成千上萬的人。 – user369861 2010-07-05 00:35:48

回答

2

,如果您的目前已知的標準範圍內預測撒謊的標準,那麼你應該做的Interpolation過程中的一些更多的研究:

在數值分析的數學子,插值的方法一組離散的已知數據點的範圍內建造新的數據點的

如果你的謊言目前已知的數據範圍研究Extrapolation這是不太準確外:

在數學中,外推是在離散的已知數據點集之外構建新數據點的過程。

方法

+0

感謝士兵!你真的幫助了我。你提到的方法確實比我想象的要複雜一些。還有一件事,我認爲我需要的是兩者。有沒有一種方法可以兼得? – user369861 2010-07-05 00:34:17

5

您需要一個新的程序,它將輸入一個或多個標準作爲輸入,然後輸出運行時間或內存使用情況的估計值。這是一個機器學習問題。

你的輸入可以被列爲數的向量,如下:

input = [ A, B, C, D, E ] 

其中一個最簡單的算法,這將是一個K-nearest neighbor algorithm。這背後的想法是,你將採取你的輸入數字向量,並在數據庫中找到最接近你的輸入向量的數字向量。例如,給定的輸入這個載體:

input = [ 11, 1.8, 3557, 29, 10 ] 

您可以假設運行時間和內存應該從這個運行非常相似的值(最初在你上面列表):

R0001   12   2   3556   27   9 

有幾種計算這兩個向量之間相似度的算法,一種簡單而直觀的算法是Euclidean distance。作爲一個例子,輸入矢量和從表中的向量之間的歐幾里得距離是這樣的:

dist = sqrt((11-12)^2 + (1.8-2)^2 + (3557-3556)^2 + (27-29)^2 + (9-10)^2) 
dist = 2.6533 

應當直觀清楚的是具有較低距離點應該是用於運行時間和內存使用更好的估計,因爲距離應該描述兩套標準之間的相似性。假設您的標準信息豐富且選擇得當,具有類似標準的點應具有類似的運行時間和內存使用情況。

下面是如何做到這一點R中的一些示例代碼:

r1 = c(11,1.8,3557,29,10) 
r2 = c(12,2.0,3556,27, 9) 

print(r1) 
print(r2) 

dist_r1_r2 = sqrt((11-12)^2 + (1.8-2)^2 + (3557-3556)^2 + (27-29)^2 + (9-10)^2) 
print(dist_r1_r2) 
smarter_dist_r1_r2 = sqrt(sum((r1 - r2)^2)) 
print(smarter_dist_r1_r2) 

以運行時間和您最近行的內存使用量的KNN算法爲K = 1。通過對數據庫中的多行進行加權組合,可以將此方法擴展爲包含來自多行的數據,而距離輸入向量較近的行對估計做出的貢獻更大。閱讀KNN上的維基百科頁面以獲取更多信息,特別是關於數據規範化的內容,包括多點貢獻和計算距離。

當計算這些輸入向量列表之間的差異時,應考慮規範化數據。這樣做的基本原理是,對於標準C,3557和3556之間的1個單位的差異可能不等於標準A的11和12之間的1的差異。如果您的數據是正態分佈的,則可以將它們全部轉換爲standard scores (or Z-scores)使用這個公式:

N_trans = (N - mean(N))/sdev(N) 

上有「正確」的方式,因爲它取決於你的數據的類型和範圍,以標準化的數據沒有通用的解決方案,但Z值很容易計算和良好方法先嚐試。

有很多更復雜的技術來構建這樣的估計,包括線性迴歸,支持向量迴歸和非線性建模。一些更復雜的方法背後的想法是,你試着開發一個方程來描述你的變量與運行時間或內存的關係。例如,一個簡單的應用程序可能只是一個標準,你可以嘗試和模式,比如區分:

running_time = s1 * A + s0 
running_time = s2 * A^2 + s1 * A + s0 
running_time = s3 * log(A) + s2 * A^2 + s1 * A + s0 

的想法是,一個是你的固定標準,和Sn的自由參數列表,你可以調整,直到你得到一個運作良好的模型。

這種方法的一個問題是,有許多不同的可能的模型具有不同數量的參數。區分具有不同參數數量的模型是統計學中的一個難題,我不建議在您首次嘗試機器學習時對其進行處理。

,你應該問自己一些問題是:

  1. 做了我所有的標準,同時影響運行時間和內存使用情況?做一些隻影響一個或另一個,並從預測的角度來看有些沒用?回答這個問題被稱爲feature selection,並且是machine learning中的一個突出問題。
  2. 你有任何先驗估計你的變量應該如何影響運行時間或內存使用情況?例如,您可能知道您的應用程序使用了N * log(N)的排序算法,這意味着您明確知道一個標準與您的運行時間之間的關係。
  3. 您的行測量輸入條件與運行時間和內存使用情況配對是否涵蓋您的應用程序的所有合理用例?如果是這樣,那麼你的估計會好得多,因爲機器學習對於不熟悉的數據可能會遇到困難。
  4. 程序的運行時間和內存是否取決於您未輸入到估算策略中的標準?例如,如果您依賴於外部資源(如Web Spider),則網絡問題可能會以難以預測的方式影響運行時間和內存使用情況。如果是這樣,你的估計會有更多的差異。
+1

詹姆斯,非常感謝!在我仔細閱讀你的文章之前,我想問一下,是否存在一些簡單的方法,它們不能做到完美的工作,而是給出合理的答案。我想我可能會找出一個「公式」來計算我(我知道它不會那麼準確)。 – user369861 2010-07-05 01:08:16

+0

我希望這有助於!尋找明確的公式是棘手的!我實際上認爲最近鄰居方法的理解和實現有點簡單,並且它們對參數估計中的錯誤更加穩健。可能有一個很好的公式來解釋你的數據,但在一般情況下找到它是一個不平凡的問題。 – 2010-07-05 01:12:10