差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
mselab:2012:stat:week3:r2 [2012/12/18 10:10] – [レポート提出について] watalu | mselab:2012:stat:week3:r2 [不明な日付] (現在) – 外部編集 (不明な日付) 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
===== 統計工学実験 第3週 ===== | ===== 統計工学実験 第3週 ===== | ||
+ | ==== 連絡 ==== | ||
+ | |||
+ | * [[mselab: | ||
==== 最終課題 ==== | ==== 最終課題 ==== | ||
行 8: | 行 11: | ||
* 提案した訪問ルールの契約達成率などを、検証用データ(tic.eval)に適用して検討せよ。 | * 提案した訪問ルールの契約達成率などを、検証用データ(tic.eval)に適用して検討せよ。 | ||
* 学習用データでモデルを学習し、検証用データで精度を検討する、という縛りの中で、最適な訪問ルールを定めよ。これがこの実験の最終成果物である。 | * 学習用データでモデルを学習し、検証用データで精度を検討する、という縛りの中で、最適な訪問ルールを定めよ。これがこの実験の最終成果物である。 | ||
+ | |||
+ | ==== 準備 ==== | ||
+ | |||
+ | 準備。 | ||
+ | |||
+ | < | ||
+ | Sys.setenv(" | ||
+ | install.packages(c(" | ||
+ | library(mvtnorm) | ||
+ | library(mvpart) | ||
+ | library(MASS) | ||
+ | </ | ||
+ | |||
+ | データがない人は、次のコードも実行する必要がある。 | ||
+ | |||
+ | < | ||
+ | tic.learn <- read.table(" | ||
+ | tic.eval <- read.table(" | ||
+ | tic.test <- read.table(" | ||
+ | tic.eval <- cbind(tic.eval, | ||
+ | colnames(tic.eval)[86] <- " | ||
+ | rm(tic.test) | ||
+ | </ | ||
+ | |||
+ | さらに先週のレポート課題と同様に、V1とV5のグループ化も済ませるとよいかもしれない。 | ||
+ | あるいは今週の課題で改めて、グループ化を見直してもよい。 | ||
==== クラスタリング ==== | ==== クラスタリング ==== | ||
+ | |||
+ | データの層別を行う方法の総称。生成した層のことを、クラスタ(群)という。大きく階層クラスタリングと非階層クラスタリングに分かれる。 | ||
+ | |||
+ | 階層クラスタリングは、レコード間の距離を全ての組み合わせについて算出して作成した行列を距離行列から出発する。 | ||
+ | まずは最も近いレコード同士をグループ(群)にまとめる。その結果、2レコードは1つのクラスタに属するが、残りのレコードは点のままである。 | ||
+ | そのクラスタと残りのレコードの間の距離行列を算出し、最も近いレコード同士、最も近いレコードとグループ、もしくは最も近いグループ同士を再びグループに\\ | ||
+ | まとめる。 | ||
+ | これを繰り返すことで、クラスタ(群)分けを得るのが、階層クラスタリングである。 | ||
+ | 階層クラスタリングには、レコード同士の距離だけでなく、レコードとグループの距離、グループ同士の距離、を定める必要がある。 | ||
+ | またクラスタを生成する過程をグラフに表したものを、デンドログラムと呼ぶ。 | ||
+ | |||
+ | それに対して、クラスタ(群)ごとの群内のばらつきが最小になるように、目的関数を定め、離散最適化法を用いてクラスタを生成するのが、非階層クラスタリング\\ | ||
+ | である。 | ||
+ | 代表的な非階層クラスタリングのひとつである$k$-means法では、各群のユークリッド距離の平均が最小になるように、クラスタ平均を付置する。 | ||
=== k-means法によるクラスタリング === | === k-means法によるクラスタリング === | ||
行 247: | 行 290: | ||
==== 層別後の解析 ==== | ==== 層別後の解析 ==== | ||
- | |||
- | 準備。 | ||
- | < | ||
- | install.packages(c(" | ||
- | library(mvtnorm) | ||
- | library(mvpart) | ||
- | library(MASS) | ||
- | </ | ||
行 520: | 行 555: | ||
|提出部数|レポートは各自1通ずつ。{{: | |提出部数|レポートは各自1通ずつ。{{: | ||
+ | |||
+ | ==== 実験当日の修正 ==== | ||
+ | |||
+ | 自分のMacだと問題が発生せず、実験室のPCだとRが落ちる不具合があります。メモリが少ないためかもしれません。Rが勝手に終了する場合には、kmeansのコードは次のように nstart を削除し、iter.max を追加する修正をお願いします。 | ||
+ | |||
+ | === k-means法による層別 (iter.max追加、nstart削除) === | ||
+ | |||
+ | k-means法は、数値変数でしか用いられないため、データは「tic.learn[, | ||
+ | < | ||
+ | tic.learn.kmeans <- kmeans(tic.learn[, | ||
+ | </ | ||
+ | |||
+ | k-means法の結果を適用するには、レコードごとに「centers」の座標とのユークリッド距離を算出し、一番小さくなる層にその変数を割り当てる。 | ||
+ | |||
+ | < | ||
+ | date() | ||
+ | tic.learn$cluster <- rep(0, dim(tic.learn)[1] ) | ||
+ | for( i in c(1: | ||
+ | tic.kmeans.dist <- rep(0, max(tic.learn.kmeans$cluster) ) | ||
+ | for( j in c(1: | ||
+ | tic.kmeans.dist[j] <- sum( (tic.learn[i, | ||
+ | } | ||
+ | tic.learn$cluster[i] <- sort.list(tic.kmeans.dist)[1] | ||
+ | } | ||
+ | date() | ||
+ | </ | ||
+ | |||
+ | 念のため、kmeansの結果と比較して、計算に誤りがないことを確認するためにクロス集計を行う。この結果が対角であれば、計算はあっている。 | ||
+ | |||
+ | < | ||
+ | table(tic.learn$cluster, | ||
+ | </ | ||
+ | |||
+ | centers=に指定する値は、いろいろ変えてみるといい。 |