#######################################################################################
# RETSU.R
#
# Rへファイルを読み込み,LSAとして出力する
# 入力は,各行番号(filenum:sennum)が記述される.
#
# 誤差を最小に保ったまま,行列のrankをあえて削減する.
# 本ファイルでは,行列Aに対しk列を残して行の削減を行う.
# 特異値分解の出力は, old と入力すると次元削減してないsvdを,
# new と入力すると次元削減したsvdを出力する.
########################################################################################
print("SVD Start!! for RETSU")
#
# ファイルを読み込む場合には使用する
#
A <- read.delim("OutputByEclipse.txt",F);
TMP <- A # 仮行列に元の配列を格納しておく
A <- A[,-1] #1列目を削除する
k <- qr(A)$rank; #ランク数に応じて最小二乗誤差を求める
#k <- 2;
#k=rank(A)として,上位k個の特異値のみを使って,US(V)tを掛け合わせる
print("Be Careful of Value of K!!")
print(k)
#print(A);
R <- svd(A);
R$u %*% diag(R$d) %*% t(R$v);
U <- R$u;
U1 <- U[ , 1:k, drop=F]
#print("print U");
S <- diag(R$d);
S1 <- S[1:k, 1:k, drop=F] #rank(A)=k k × k の正方行列の作成
V <- R$v;
#V1 <- V[,1:(ncol(V)-k),drop=F] # m × (n-k) の行列U1を生成
V1 <- V[1:k, 1:k ,drop=F]
old <- U %*% S %*% t(V);
new <- U1 %*% S1 %*% t(V1);
rownames(old) <- TMP[,1]
rownames(new) <- TMP[,1] #列名を代入する
write.table(new,"OutputByR.txt",row.names = F, col.names=F, quote=F) #ファイルへ書き出し
#print(old)
最終更新:2007年11月09日 17:58