機械学習を用いて一般的にスリーサイズ推定問題を解く

双葉杏初音ミクのスリーサイズ推定問題を解いてきたわけだが、関数化して一般化する。
前回はスリーサイズを独立して推定したのだが、推定したものを初期値として、再び推定したらどうなるだろうと思って再度推定したらあまり変わらなかった。

BWHestimator <- function(vec, niter = 3){ #age, height, weight
	library(glmnet)
	data0 <- read.csv("imasPCA.csv", header=TRUE)
	data1 <- cbind(data0$B, data0$W, data0$H, data0$age, data0$height, data0$weight)
	data2 <- data1[-32, ] #杏を抜いた
	
	p1 <- matrix(c(vec), nr=1)
	prd1 <- rep(0, 3)
	#年齢・身長・体重だけから推定する
	for(i in seq(3)){
		glmnet1 <- glmnet(data2[, 4:ncol(data1)], data2[, i])
		cv.glmnet1 <- cv.glmnet(data2[, 4:ncol(data1)], data2[, i])
		prd1[i] <- predict(glmnet1, as.matrix(p1), s=cv.glmnet1$lambda.min)
	}
	
	prd2 <- matrix(0, niter, 3)
	prd2[1, ] <- prd1
	for(j in 2:niter){
		p2 <- c(prd2[j-1, ], p1)
		#スリーサイズのうち初期値から2サイズを加えて推定し直す
		for(i in seq(3)){
			glmnet1 <- glmnet(data2[, -i], data2[, i])
			cv.glmnet1 <- cv.glmnet(data2[, -i], data2[, i])
			prd2[j, i] <- predict(glmnet1, matrix(p2[-i], nr=1), s=cv.glmnet1$lambda.min)
		}
	}
	return(apply(prd2, 2, mean))
}
BWHestimator(c(16, 158, 42)) #初音ミク
[1] 79.76157 55.72423 80.87331