5

関連: R:ggplot2を使用してLOESS曲線の勾配変化をマークする
この質問は、最小/最大y(勾配= 0)を見つけようとしています。最小/最大を見つけたい

背景として、私はいくつかのさまざまなモデリング手法を実行しており、ニューラルネットワークの結果を反復処理するときにランダムシードによって生成された最良のモデルを測定するために勾配を使用する可能性があると考えました。

データを取得します。

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

同様に、次の1つのrbfモデルがあります。

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

rbf

RBFモデルはデータによりよく適合し、変数の背景知識とよりよく一致します。急な崖とより緩やかな曲線を持つNNを取り除くために、フィットした線の最小/最大勾配を計算しようと考えました。交差する線を特定することは、剪定する別の方法ですが、それは別の質問です。

提案をありがとう。


注:ここで使用ggplot2し、それに応じて質問にタグを付けましたが、それは他の関数で実行できなかったという意味ではありません。なぜこれをやろうとしているのかを視覚的に説明したかっただけです。ループはy1-y 0 / x 1 -x 0でこれを行うことができると思いますがおそらくもっと良い方法あります。

4

2 に答える 2

4

diff最も簡単な解決策は、( function を使用して) 一次微分の近似値として一次差分を使用することだと思います。

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
于 2012-09-04T07:52:37.760 に答える
2

超高速取引用のニューラル ネットワークを自分で書いています。最初は Loess または Lowess を使用して時系列を適合させていましたが、私が求めていたのは、Loess が提供していないスムーズなデリバティブでした。Loess を自分で実装し、各点の直交多項式を使用して導関数を計算すると、奇妙な結果が得られます。これには理由があります。

問題の解決策は、Graciela Boente の論文: 回帰関数の高次導関数のロバスト推定値で見つけることができます。式は 3 ページにあります。論文はインターネットで無料で入手できます。値と導関数の両方を取得したら、これを使用して 3 次スプラインを一意に定義できます。これにより、連続した導関数が得られます。

Rに詳しくない

于 2014-10-05T21:19:13.670 に答える