アットウィキロゴ
 
#######################################################################################
#  GYOU.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 <- 10;
 
#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,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 ,drop=F]
 
old <- U %*% S %*% t(V);
new <- U1 %*% S1 %*% t(V1);
 
old.row <- nrow(old)
new.row <- nrow(new)
 
write.table(new,"OutputByR.txt",row.names = F, col.names=F, quote=F) #ファイルへ書き出し

#print(old)
 
最終更新:2007年11月09日 17:56