使うのはアヤメのデータ(iris)
縦軸: Sepal.Width, 横軸: Sepal.Lengthでプロットする
ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,color=rev(Species)))+geom_point()
k-meansクラスタリング
R言語プログラミング: クラスター分析 - k-means
http://d.hatena.ne.jp/hamadakoichi/20100415/p1
Rでk平均法を使う
http://xn--p8ja5bwe1i.jp/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/R%E3%81%A7k%E5%B9%B3%E5%9D%87%E6%B3%95%E3%82%92%E4%BD%BF%E3%81%86/
km <- kmeans(iris[,1:4],3) result <- km$cluster result <- as.vector(result) df <- transform(iris,kmeans=result) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=factor(kmeans),group=kmeans))+geom_point()
MDS:多次元尺度構成法
ML for hackers, Chapter9 (MDS)を参照
http://shop.oreilly.com/product/0636920018483.do
iris.matrix <- as.matrix(iris[,1:4]) rownames(iris.matrix) <- iris$Species iris.adjacent <- iris.matrix %*% t(iris.matrix) iris.dist <- dist(iris.adjacent) iris.mds <- cmdscale(iris.dist) iris.df <- data.frame(Species=rownames(iris.mds),mds1=iris.mds[,1],mds2=iris.mds[,2]) ggplot(iris.df,aes(x=mds1,y=mds2,color=rev(factor(Species)),group=Species))+geom_point()
PCA:主成分分析
Rによるデータサイエンス1.3.7章、p.75を参考
iris.pca <- princomp(iris[,-5]) plot(iris.pca$scores,type='n') lab<-as.numeric(iris[,5]) text(iris.pca$scores,label=lab,col=lab) biplot(iris.pca)
SVM:サポートベクターマシン
Rで行うSVM解析
http://bi.biopapyrus.net/compute/r-svm.html
パッケージユーザーのための機械学習(3):サポートベクターマシン(SVM)
http://tjo.hatenablog.com/entry/2013/12/03/183055
多クラスSVM:e1071のパッケージで標準に使える
library('e1071') iris.svm <- svm(Species~.,data=iris) prediction <- predict(iris.svm,iris) table(prediction,iris[,5]) df <- transform(iris,svm=prediction) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=svm,group=svm))+geom_point()
階層的クラスタリング
R言語プログラミング: クラスター分析 - 階層的クラスタリング
http://d.hatena.ne.jp/hamadakoichi/20100324/p1
Rで階層クラスタリングを使う
http://xn--p8ja5bwe1i.jp/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/R%E3%81%A7%E9%9A%8E%E5%B1%A4%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/
色の付け方:http://stackoverflow.com/questions/18036094/how-to-create-a-dendrogram-with-colored-branches
階層的クラスタリングを分類に使い時は
k近傍法と組合せよとのこと http://stackoverflow.com/questions/21064315/how-do-i-predict-new-datas-cluster-after-clustering-training-data
iris.matrix <- as.matrix(iris[,-5]) rownames(iris.matrix) <- iris[,5] iris.dist <- dist(iris.matrix) iris.cls <- hclust(iris.dist) require(devtools) install_github('dendextend', 'talgalili') require(Rcpp) #不要? install_github('dendextendRcpp', 'talgalili') #不要? require(dendextend) dend <- as.dendrogram(iris.cls) d <- color_branches(dend,k=5,col=c(2,3,4,5,6)) plot(d)
決定木
library(mvpart) iris.tree <- rpart(Species~.,data=iris) plot(iris.tree,uniform=T) text(iris.tree,uniform=T,use.n=T,all=F,pretty=1) library(mvpart) iris.tree <- rpart(Species~.,data=iris) plot(iris.tree,uniform=T) text(iris.tree,uniform=T,use.n=T,all=F,pretty=1) predtree <- predict(iris.tree,data=iris) df <- transform(iris,rpart=colnames(predtree)[max.col(predtree)]) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(rpart),group=rpart))+geom_point()
ランダムフォレスト
R言語による Random Forest 徹底入門−集団学習による分類・予測−
http://d.hatena.ne.jp/hamadakoichi/20110130/p1
http://www.slideshare.net/hamadakoichi/introduction-torandomforest-tokyor
パッケージユーザーのための機械学習(5):ランダムフォレスト
http://tjo.hatenablog.com/entry/2013/12/24/190000
library(randomForest) iris.rf <- randomForest(Species~.,data=iris) iris.pred <- predict(iris.rf,data=iris) iris.pred.df <- transform(iris,randomForest=iris.pred) ggplot(iris.pred.df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(randomForest),group=randomForest))+geom_point()
ロジスティック回帰
(多クラスロジスティック回帰?多項ロジットモデル?)
参考:ロジスティック回帰+確率的勾配降下法 http://d.hatena.ne.jp/n_shuyo/20110710/logistic
ロジスティック回帰 http://aidiary.hatenablog.com/entry/20100430/1272590402
結局multinom関数を使うことに
やるのはMultinomial logistic regression 多重ロジスティック回帰。
多変数ロジスティック回帰(Multi variable logistic regression)とは異なる。
R Data Analysis Examples: Multinomial Logistic Regression http://www.ats.ucla.edu/stat/r/dae/mlogit.htm
library(reshape2) ml <- iris ml$Species2 <- relevel(ml$Species,ref='setosa') test <- multinom(Species2 ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,data=ml) prediction <- predict(test,newdata=iris[,1:4],'probs') predicted <- colnames(prediction)[max.col(round(prediction))] result <-table(predicted,iris$Species) sum(diag(result))/sum(result) df <- transform(iris,MultiLogitRegression=predicted) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(MultiLogitRegression)))+geom_point()
ナイーブベイズ
library('e1071') nb <- naiveBayes(Species~.,iris) nb.predict <- predict(nb,iris) table(nb.predict,iris$Species) df <- transform(iris,NaiveBayes=nb.predict) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(NaiveBayes)))+geom_point()
混合分布モデル:混合ガウス分布モデル(GMM)
(より一般的な枠組みとして、EMアルゴリズム)
http://d.hatena.ne.jp/hamadakoichi/20100415/p2
library(mclust) iris.mc <- Mclust(iris[,1:4],G=3,modelNames="EII") result <- iris.mc$classification ctbl <- table(result,iris[,5]) df <- transform(df,GMM=result) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(GMM))))+geom_point()
ニューラルネットワーク
パッケージユーザーのための機械学習(4):ニューラルネットワーク
http://tjo.hatenablog.com/entry/2013/12/13/190958
require(nnet) d.nnet <- nnet(Species~.,iris,size=5) predict(d.nnet,iris[,-5]) prediction <- (predict(d.nnet,iris[,-5])) nnet.pred.vec <- colnames(prediction)[max.col(round(prediction,0))] df <- transform(iris,NNet=nnet.pred.vec) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(NNet)))+geom_point()
k近傍法
参考:http://wacky.hatenablog.jp/entry/2013/08/13/190217
k=1(最近傍法)
train:test=8:2で分割
library(class) n <- nrow(iris) indices <- sample(1:n,n*0.8) iris.train <- iris[indices,1:4] iris.test <- iris[-indices,1:4] c <- iris[rownames(iris.train),5] knn1 <- knn1(iris.train,iris.test,c) df <- transform(iris.test,KNN=knn1) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(KNN))))+geom_point()
k=3:3近傍法
library(class) n <- nrow(iris) indices <- sample(1:n,n*0.8) iris.train <- iris[indices,1:4] iris.test <- iris[-indices,1:4] c <- iris[rownames(iris.train),5] knn(iris.train,iris.test,c,k=3,prob=T) knn <- knn(iris.train,iris.test,c,k=3,prob=T) df <- transform(iris.test,KNN=knn1) ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(KNN))))+geom_point()
自己組織化マップ(SOM)
somライブラリ
library(som) iris1 <- normalize(iris[,1:4]) iris.som2 <- som(iris1,xdim=6,ydim=5) ransu <- cbind(rnorm(nrow(iris),0,0.13),rnorm(nrow(iris),0,0.13)) out.new <- iris.som2$visual[,1:2]+0.5+ransu plot(out.new[,1:2],col=c(2:4)[unclass(iris[,5])],pch=c(1:3)[unclass(iris[,5])])
kohonenライブラリ
predictを使うならこっち?
> library(kohonen) > set.seed(10) > gr <- somgrid(topo='hexagonal',xdim=10,ydim=7) > iris.som <- som(as.matrix(iris[,1:4]),gr,rlen=200) > lab.cod <- as.numeric(iris[,5]) > plot(iris.som,type='mapping',labels=lab.cod,col=lab.cod) > prediction <- predict(iris.som,as.matrix(iris[,1:4]),trainY=iris[,5]) > result <- table(prediction$prediction,iris[,5]) > result setosa versicolor virginica setosa 50 0 0 versicolor 0 49 1 virginica 0 1 49 > sum(diag(result))/sum(result) [1] 0.9866667