文書の過去の版を表示しています。
縛り。
- 学習機械にはlm()かrpart()しか使わない。
- kmeans()を層別に使う。
準備。
install.packages(c("mvtnorm"), dependencies=TRUE) library(mvtnorm) library(MASS)
k-means法によるクラスタリング
まず楕円状に分布するデータ(n=1000)を擬似乱数を用いて生成する。
test.data <- rmvnorm(1000,mean=c(1,1),sigma=matrix(c(1,0.5,0.5,1),ncol=2)) plot(test.data)
これにk-means法をかけてみる。k-means法では、クラスタ数kは分析者が指定するものであり、ここでは2としてみる。さらに最小値を求めるために、ランダムに1000の初期値から出発(nstart=1000)して、最も適したクラスタ分けを採用するように指定してある。
test.kmeans <- kmeans(test.data, centers=2, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster)
最初のグラフに色分けがついたはずで、これがクラスタである。 クラスタはデータのみから生成する層であり、これによる層別に技術的な背景はない。 クラスタ数を3, 4, 5と変えてみると、2の場合とは異なった分割が得られることが見て取れるはずである。
4枚のグラフをまとめて描くようにしてみた。
par(mfrow=c(2,2)) test.kmeans <- kmeans(test.data, centers=2, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=2") test.kmeans <- kmeans(test.data, centers=3, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=3") test.kmeans <- kmeans(test.data, centers=4, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=4") test.kmeans <- kmeans(test.data, centers=5, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=5") par(mfrow=c(1,1))
同じことを、目視でもほぼ2群に分けられそうなデータ(n=2000)でも行ってみる。
test.data <- rbind(rmvnorm(1000,mean=c(2.5,2.5),sigma=matrix(c(1,0.5,0.5,1),ncol=2)), rmvnorm(1000,mean=c(-2.5,-2.5),sigma=matrix(c(1,0.5,0.5,1),ncol=2))) plot(test.data)
そもそも別々に生成した2群のデータを結合しているので、k=2が一番自然なクラスタ分けを得る。 グラフを描かせるとやはりk=2の場合が最もらしいことが確認できる。 それでも3以上でもk-means法がクラスタを生成する。
par(mfrow=c(2,2)) test.kmeans <- kmeans(test.data, centers=2, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=2") test.kmeans <- kmeans(test.data, centers=3, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=3") test.kmeans <- kmeans(test.data, centers=4, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=4") test.kmeans <- kmeans(test.data, centers=5, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=5") par(mfrow=c(1,1))
戯れにk=20としてみると、2つの群それぞれを、細かく群分けする様子が見て取れる。
test.kmeans <- kmeans(test.data, centers=20, nstart=1000) print(test.kmeans) plot(test.data, col=test.kmeans$cluster, sub="k=20")
これはベクトル量子化と呼ばれる、多次元信号(画像など)の量子化法(デジタル信号への変換)と数理的には同等である。 また個々のクラスタごとに予測モデルを構築することは、学習理論における分割統治の考え方に合致している。
分割統治
この考え方をより進めると、下記のような手法に辿り着く。
- 委員会機械 (Committee Machine)
- アンサンブル学習 (Ensemble Learning)
- ブースティング (Boosting)
- バギング (Bagging)