2012-08-29 88 views
3

相關:R: Marking slope changes in LOESS curve using ggplot2
這個問題是試圖找到最小/最大Y(斜率= 0);我想找到最小/最大值我正在進行一些各種建模技術,並認爲我可能會使用斜率來評估在迭代通過神經網絡結果時由隨機種子產生的最佳模型。用R計算黃土擬合曲線的最小/最大斜率?

獲取數據:

nn <- read.csv("http://pastebin.com/raw.php?i=6SSCb3QR", header=T) 
rbf <- read.csv("http://pastebin.com/raw.php?i=hfmY1g46", header=T) 

舉一個例子,這裏是我的數據訓練的神經網絡的結果:

library(ggplot2) 
ggplot(nn, aes(x=x, y=y, colour=factor(group))) + 
geom_point() + stat_smooth(method="loess", se=F) 

nn

同樣,這裏有一個RBF模型:

ggplot(rbf, aes(x=x, y=y, colour=factor(group))) + 
geom_point() + stat_smooth(method="loess", se=F) 

rbf

RBF模型更適合數據,並且與變量的背景知識更好地一致。我試圖計算擬合線的最小/最大斜率,以便用陡峭的懸崖和更平緩的曲線刪除NN。確定交叉線將是另一種修剪方式,但這是一個不同的問題。

感謝您的任何建議。


注:我用ggplot2這裏,並相應地標記問題,但是,這並不意味着它不能與其他一些功能來實現。我只是想直觀地說明我爲什麼要這樣做。我想,一個循環可以爲Y -y/X -x ,但也許有一個更好的辦法做到這一點?

+0

對於類似情況,請參見: 的http://計算器。com/questions/11744012 /發現最大梯度的增長曲線/ 11745538#11745538 –

+0

'numericDeriv(my_loess $ y)'足夠嗎? –

+0

@CarlWitthoft:我不太熟悉R知道'my_loess'是什麼。 – Hendy

回答

3

我認爲最簡單的解決方案是使用第一個差異(使用函數diff)作爲一階導數的近似值。

slope.loess <-function(X, data){ 
    # First your loess function: 
    my_loess <- loess(y~x, data=data, subset=data$group==X, degree=2) 
    # Then the first difference 
    first_diff <- diff(my_loess$fitted) 
    # Then the corresponding x and y values for the minima and maxima 
    res <- cbind(my_loess$x[c(which.min(first_diff), which.max(first_diff))], 
      my_loess$fitted[c(which.min(first_diff), which.max(first_diff))]) 
    colnames(res) <- c("x", "y") 
    rownames(res) <- c("min", "max") 
    res 
    } 

#Then apply the function to each group 
slope.rbf <- lapply(levels(rbf$group), FUN=slope.loess, data=rbf) 
names(slope.rbf) <- levels(rbf$group) 

slope.rbf 
$A 
      x  y 
min 3.310345 20.30981 
max 7.724138 18.47787 

$B 
      x  y 
min 3.310345 21.75368 
max 7.724138 20.06883 

$C 
      x  y 
min 3.310345 23.53051 
max 7.724138 21.47636 

$D 
      x  y 
min 4.413793 25.02747 
max 0.000000 26.22230 

$E 
      x  y 
min 4.413793 27.45100 
max 0.000000 27.39809 
2

我正在爲超快速交易寫一個神經網絡。一開始我使用Loess或Lowess來適應時間序列,但我想要的是Loess不提供的光滑衍生物。即使你自己實施Loess並且使用每個點的正交多項式來計算一個導數,你也會得到奇怪的結果。有一個原因。

您的問題的解決方案可以在Graciela Boente的論文中找到:迴歸函數的高階導數的魯棒估計。該公式在第3頁。該論文在互聯網上免費提供。一旦你已經獲得了數值和導數,你可以使用它來唯一定義三次樣條,這將給出連續的導數。

我不熟悉有R