読者です 読者をやめる 読者になる 読者になる

INFINITY -数学とかプログラミングとか-

統計とプログラムを使って役に立たせたい

TeX用コマンド入力を支援するための辞書をご利用ください。
sanctuary's blogは,適当なことが書いてあります。

確率的最急勾配法


1つのwのみ。

#確率的最急勾配法
f<-file("rnorm_data.txt","r")
data=function(){
    a<-readLines(con=f,1)    
    b=unlist(strsplit(a, "\\,")) # 文字 "," で分割
    return(as.numeric(b))
}
#data()#ファイルの1行目が読み込まれる
#data()#ファイルの2行目が読み込まれる


r=0.01    #学習係数の決め方は,難しい。

epsilon=0.00001
end=0
cnt=0
N=10000

#初期値
w=data()

f<-file("rnorm_data.txt","r")

for(cnt in 1:N){
    if(end==0){
        #初期値
        x=data()#N(0,1)の乱数
        
        y=w%*%x
        w_previous=w
        w=w_previous+r*y*(x-y*w_previous)
        cat("cnt==",cnt,":\n")
        cat(w,"\n")
        cat(w_previous,"\n")
        
        if((w-w_previous)%*%(w-w_previous)<epsilon){
            end=1
            cat("(w-w_previous)%*%(w-w_previous)<epsilon\n")
            cat(w,"\n")
            cat(w_previous)
        }else if(cnt==N){
            cat("cnt==1000\n")
            cat(w,"\n")
            cat(w_previous)
        }
    }
}

close(f)


w_1,w_2,\cdots,w_5を求める。

#確率的最急勾配法
f<-file("rnorm_data.txt","r")
data=function(){
    a<-readLines(con=f,1)    
    b=unlist(strsplit(a, "\\,")) # "," で分割
    return(as.numeric(b))
}
#data()#ファイルの1行目が読み込まれる
#data()#ファイルの2行目が読み込まれる

r=0.01
epsilon=0.00001
end=0
end_list=list(0,0,0,0,0)
end_cnt_list=list(0,0,0,0,0)

cnt=0
N=1000
#初期
w1=data()
w2=data()
#w2=rnorm(5)
w3=data()
#w3=rnorm(5)
w4=data()
#w4=rnorm(5)
w5=data()
#w5=rnorm(5)
w_list=list(w1,w2,w3,w4,w5)
w_list

y1=numeric(5);y2=numeric(5);y3=numeric(5);y4=numeric(5);y5=numeric(5)
y_list=list(y1,y2,y3,y4,y5)

numeric=numeric(5)
w_previous_list=list(numeric,numeric,numeric,numeric,numeric)
w_previous_list

w_conv_list=list(numeric,numeric,numeric,numeric,numeric)#wが収束した時のリスト

f<-file("rnorm_data.txt","r")

for(cnt in 1:N){
    #初期値
    x=data()#N(0,1)の乱数
    for(i in 1:5){
        if(end_list[[i]]==0){#収束していないwについて処理する
            y_list[[i]]=w_list[[i]]%*%x
            w_previous_list[[i]]=w_list[[i]]
            orthogonal=numeric(5)
            if(i>=2){
                for(k in 1:5){
                    if(end_list[[k]]==1){#収束した時(end_list[[k]]==1)収束したものを使う
                        w_conv=w_conv_list[[k]]
                        for(j in 1:(i-1)){#
                            y_list[[j]]=w_conv%*%x
                            orthogonal=orthogonal+y_list[[j]]*w_conv
                        }
                    }else{
                        for(j in 1:(i-1)){#
                            y_list[[j]]=w_list[[j]]%*%x
                            orthogonal=orthogonal+y_list[[j]]*w_list[[j]]
                        }
                    }
                }    
            }
            w_list[[i]]=w_previous_list[[i]]+r*y_list[[i]]*(x-y_list[[i]]*w_previous_list[[i]]-2*orthogonal)
            cat("i==",i,"::")
            cat("cnt==",cnt,":\n")
            cat(w_list[[i]],"\n")
            cat(w_previous_list[[i]],"\n\n")
            if((w_list[[i]]-w_previous_list[[i]])%*%(w_list[[i]]-w_previous_list[[i]])<epsilon){
                w_conv_list[[i]]=w_list[[i]]
                end_list[[i]]=1
                end_cnt_list[[i]]=cnt
                cat("w_",i,"is convergence.(cnt=",cnt,")\n")
                cat("(w_list[[i]]-w_previous_list[[i]])%*%(w_list[[i]]-w_previous_list[[i]])<epsilon\n")
                cat((w_list[[i]]-w_previous_list[[i]])%*%(w_list[[i]]-w_previous_list[[i]]),"\n\n")
                cat(w_list[[i]],"\n")
                cat(w_previous_list[[i]],"\n\n")
            }else if(cnt==N){
                cat("Not Covergence\n")
                cat("cnt==",N,"\n")
                cat(w_list[[i]],"\n")
                cat(w_previous_list[[i]])
            }
        }
    }
    
}

end_list
end_cnt_list


close(f)