-2

と の 2 つのベクトルがxありwます。vectorwは、x と同じ長さの重みの数値ベクトルです。差が小さいベクトル内の最初のペア要素の加重平均を取得するにはどうすればよいですかx(たとえば、tol= 1e-2)、次に、次の反復で、差のペアがなくなるまで次のペアに対して同じことを行います。は tol 未満ですか? たとえば、これらのベクトルは次のとおりです。

     x = c(0.0001560653, 0.0001591889, 0.0001599698, 0.0001607507, 0.0001623125,
           0.0001685597, 0.0002793819, 0.0006336307, 0.0092017241, 0.0092079042,
           0.0266525118, 0.0266889564, 0.0454923285, 0.0455676525, 0.0457005450)
     w = c(2.886814e+03, 1.565955e+04, 9.255762e-02, 7.353589e+02, 1.568933e+03,
           5.108046e+05, 6.942338e+05, 4.912165e+04, 9.257674e+00, 3.609918e+02,
           8.090436e-01, 1.072975e+00, 1.359145e+00, 9.828314e+00, 9.455688e+01)

のどのペア要素が最小の差を持っているかを見つけたいですx。このペアを見つけた後、加重平均を取得します。このコードを試してみましたが、結果が得られません。のインデックスを見つけて、min(diff(x))それが tol より小さいかどうかを確認するにはどうすればよいですか?

        > min(diff(x))
        > which(min(diff(x)) < 1e-2)
4

3 に答える 3

1

提供されたサンプル データを使用して結果を手動で計算するとどのようになるかを説明していただければ、非常に役立ちます。私はあなたが何を望んでいるかを完全に知っているとは言えませんが、薄暗い場所での刺し傷は次のとおりです。

tol = 1e-2
sapply(which(diff(x) < tol), 
       function(i) x[i:(i+1)] %*% w[i:(i+1)] / sum(w[i:(i+1)]))
于 2012-09-14T02:20:58.867 に答える
0

まず、データをクラスター化し、クラスター間の最大距離に関してデータをカットできます。

hc <- hclust(dist(x))
ct <- cutree(hc, h = 1e-2)
ct
# [1] 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3

次に、クラスター化されたグループに従って と をx分割します。w

x.groups <- split(x, ct)
x.groups
# $`1`
#  [1] 0.0001560653 0.0001591889 0.0001599698 0.0001607507 0.0001623125
#  [6] 0.0001685597 0.0002793819 0.0006336307 0.0092017241 0.0092079042
# 
# $`2`
# [1] 0.02665251 0.02668896
# 
# $`3`
# [1] 0.04549233 0.04556765 0.04570055

w.groups <- split(w, ct)
w.groups
# $`1`
#  [1] 2.886814e+03 1.565955e+04 9.255762e-02 7.353589e+02 1.568933e+03
#  [6] 5.108046e+05 6.942338e+05 4.912165e+04 9.257674e+00 3.609918e+02
# 
# $`2`
# [1] 0.8090436 1.0729750
# 
# $`3`
# [1]  1.359145  9.828314 94.556880

mapply最後に、グループ全体の加重平均を計算するために使用できます。

mapply(function(x, w) sum(x * w) / sum(w), x.groups, w.groups)
#           1           2           3 
# 0.000249265 0.026673290 0.045685517

編集:これで、クラスターに最大 2 つの要素を持たせることが明確になりました。その要件を満たすクラスタリング アルゴリズムがあるかもしれませんが、ループを使用して自分で簡単に実行できます。ここに大まかなバージョンがあります:

d <- as.matrix(dist(x))
d[upper.tri(d, diag = TRUE)] <- Inf
d[d > 1e-2] <- Inf

while(any(is.finite(d))) {
   min.d <- which.min(d)
   idx   <- c(col(d)[min.d], row(d)[min.d])
   wavg  <- sum(x[idx] * w[idx]) / sum(w[idx])
   print(paste("idx", idx[1], "and", idx[2], "with wavg=", wavg))
   d[idx, ] <- Inf
   d[, idx] <- Inf
}
# [1] "idx 2 and 3 with wavg= 0.000159188904615574"
# [1] "idx 4 and 5 with wavg= 0.000161814089390641"
# [1] "idx 9 and 10 with wavg= 0.0092077496735115"
# [1] "idx 1 and 6 with wavg= 0.000168489484676445"
# [1] "idx 11 and 12 with wavg= 0.026673289567385"
# [1] "idx 13 and 14 with wavg= 0.0455585015178172"
# [1] "idx 7 and 8 with wavg= 0.00030279100471097"

(必要に応じて出力を保存できるように、変更することはあなたに任せます。)

于 2012-09-14T01:58:01.450 に答える
0

私はあなたが何を望んでいるのかについて少し混乱していますが、以下のコードはx、前の値から最小量 (1e-2) だけ増加した値を見つけ (を参照?diff)、重み付けされた値を返します。これらの値のみ:

smallpair <- which(c(NA,diff(x)) < 1e-2)
x[smallpair]*w[smallpair]
于 2012-09-14T02:56:30.023 に答える