0

IndexedSeq のような scala コレクションのさまざまなタイプのランキングを計算するための最良の方法を検索します (これは現在の API にはありませんが、おそらく間違いです) (R のこのさまざまな戦略のように: http://stat.ethz.ch/ R-manual/R-devel/library/base/html/rank.html )

val tabToRank = IndexedSeq(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)

例えば、初出勝、復帰に等しい「一位作戦」

tabToRank.rank("first")
# return (4,1,6,2,7,11,3,10,8,5,9)

たとえば、この研究ケースがあります。tabToRankシミュレーションの最終状態で、人口のある都市のリスト (のようなベクトル データ) がある場合、a) ランク付けし、b) ランクごとに都市を並べ替えて、"都市 の 人口 による ランク" は 周知 の ランク サイズ 分布 ( img の src ) に等しい:

ランクサイズ分布

4

2 に答える 2

2

都市データについては、

citipop.sortBy(x => -x).zipWithIndex.map(_.swap)

最初に最大の母集団を最初に並べ替え(デフォルトは最初に最小なので、負の値を並べ替えます)、次にそれらに番号を付け、次に最初に番号を取得し、次に母集団を取得します。

ただし、Scalaには統計ライブラリが組み込まれていません。一般に、自分が何をしたいのかを知って自分で行うか、Javaライブラリ(Apache Commons Mathなど)を使用する必要があります。

于 2012-10-11T14:51:55.190 に答える
1

これは、例として挙げたものを実行するコードです。

object Rank extends App {
  val tabToRank = IndexedSeq(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);

  def rank[A](input: Seq[A])(implicit ord: Ordering[A]): Seq[Int] = {
    // transform to a pair of value/index
    val withIndices: Seq[(A,Int)] = input.zipWithIndex;
    // sort by the values
    val sorted: Seq[(A,Int)] = withIndices.sortBy(_._1);
    // keep only the indices
    val indices = sorted.map(_._2);
    // create the inverse permutation
    val r = new collection.mutable.ArraySeq[Int](indices.size);
    for((i,j) <- indices.zipWithIndex)
      r(i) = j;
    return r;
  }

  println(rank(tabToRank));
}

これ:

  • 要素にインデックスで注釈を付けます。
  • 値に従ってソートします
  • 値を破棄し、インデックスのみを保持します
  • 順列を逆にして、必要なマップを取得します。

(基本的にすべてのプログラミング言語がそうであるように、1 からではなく 0 からカウントすることに注意してください。)

それを含めるための他のもの(戦略)がわかりません。

于 2012-10-11T15:11:06.610 に答える