2017-06-25 23 views
0

私はJuliaでDirichlet Process Gibbsサンプラーを構築し、各クラスターをオブジェクトとして表現しようとしています。私は次のようにしました:MethodError:メソッドと一致するメソッドがありません(:: Symbol、:: Int64)

using BayesianNonparametrics 
using DataFrames 
using Distances 

type cluster 
    m::Vector 
    Sigma::LinAlg.Cholesky 
    nu::Int 
    kappa::Int 
    nk::Int 
    end 

function logPredPdf(f::cluster,x::Array{Float64,1}): 

    kappa <- f.kappa 
    S <- f.Sigma 
    mu <- f.m 
    nu <- f.nu 

    d <- size(x)[1] 
    v = nu-d+1 
    U = sqrt((1+1/kappa)/v) * LinAlg.lowrankdowndate!(S, sqrt(f.kappa)*mu)[:U] 

    x = x - m 
    Q = \(transpose(U),x) 
    q= vecdot(Q,Q) 
    o = -log(1+q/v)*((v+d)/2) 
    c = lgamma((v+d)/2)-lgamma(v/2)-(d*log(v*pi)+2*sum(log(diag(U))))/2 
    y = c + o 

    return y 
end 

data = readtable("PCA_transformed_data_gt1000.csv",header= true); 
data = delete!(data, :1); 
n,d = size(data); 

s = 6.6172 
S0 = s*eye(d) 
kappa_0 = 1 
nu_0 = d 
mu_0 = zeros(d) 
S1 = LinAlg.cholfact(S0+kappa_0*(mu_0*mu_0')) 

X= DataFrame(Matrix(data)');# transpose data Matrix 
prior = cluster(mu_0, S1,nu_0, kappa_0, 0) 

x = X[:,1] 
kt = logPredPdf(prior,x) 

logPredPdfの中の行を関数の外で実行すると、完全に機能します。しかし 、私はそれが最後になったときに、上記の例を実行しようとした場合、それは私に次のエラーを与える:「前」と「X」の

MethodError: no method matching isless(::Symbol, ::Int64) 
Closest candidates are: 
    isless(!Matched::Char, ::Integer) at deprecated.jl:49 
    isless(::Symbol, !Matched::Symbol) at strings/basic.jl:137 
    isless(!Matched::DataArrays.NAtype, ::Any) at /Users/u1560476/.julia/v0.5/DataArrays/src/operators.jl:510 
    ... 
in logPredPdf(::cluster, ::Array{Float64,1}) at Dirichlet_Process_Gibbs_Sampler.jl:33 
in include_string(::String, ::String) at loading.jl:441 
in include_string(::String, ::String, ::Int64) at eval.jl:30 
in include_string(::Module, ::String, ::String, ::Int64, ::Vararg{Int64,N}) at eval.jl:34 
in (::Atom.##53#56{String,Int64,String})() at eval.jl:50 
in withpath(::Atom.##53#56{String,Int64,String}, ::String) at utils.jl:30 
in withpath(::Function, ::String) at eval.jl:38 
in macro expansion at eval.jl:49 [inlined] 
in (::Atom.##52#55{Dict{String,Any}})() at task.jl:60 

タイプは、クラスタと配列{Float64,1です}、関数が要求するように。私がここで紛失しているものは何ですか?

+0

'kappa < - f.kappa'はあなたのために機能しますか? – rickhg12hs

+1

'< - '演算子とは何ですか?あなたが使用したモジュールの1つに定義されていますか?あるいは、あなたは 'R'モードで、' = 'の代わりに' < - 'を間違って書きましたか?このエラーはjuliaが演算子を知らず、シンボルを(負の)整数、つまり 'kappa <(-f.kappa) 'と比較しようとしているように扱うからです。 –

答えて

3

<-は、ジュリアの演算子ではありません。ジュリアでの割り当てには=を使用してください。パッケージ(またはマクロ)では、機能的な<-演算子を含むJuliaコードを書くことはできません。

julia> expand(:(x <- y)) 
:(x < -y) 

julia> Meta.show_sexpr(ans) 
(:call, :<, :x, (:call, :-, :y)) 

私はあなたがあなたのグローバルワークスペースで期待どおりに定義された変数を持つことが起こったが、kappaではなくシンボルにバインドされているように、そのファイルの中に見える想像:x <- yは常にx-y未満であることを意味します。

編集:から:も削除する必要があります。関数定義(および一般的なブロック)では、Juliaでは:を使用しません。

+0

ありがとう!あなたが言うのは完全な意味を持ちますが、関数を 'function logPredPdf(f :: cluster、x :: Array {Float64,1})に変更すると、 kappa = f.kappa S = f.Sigma mu = FM NU = f.nu D =サイズ(X)[1] V = NU-D + 1 U = SQRT((1 + 1 /カッパ)/ V)* LinAlg.lowrankdowndate!(S、q = vecdot(Q、Q) o = -log(1 + q)ここで、 (v + d)/ 2)-lgamma(v/2) - (d * log(v * pi)+ 2 * sum(log(v + d)/ 2) diag(U))))/ 2 y = c + o return y end' replacec - > with =と同じですが、次のエラーでエラーが発生します: –

+0

'構文:無効な代入場所":kappa " in include_string(:: String、String )loading.jl:include_string(:: String、:: String、:: Int64)のevalで441 です。jar:30 in eval.jl:include_string(:: Module、:: String、:: String、:: Int64、:: Vararg {Int64、N}):34 in(:: Atom。## 53#56) {{Atom。## 53#56 {String、Int64、String}、:: String)in utils.jl:30 with eval.jl:50 withパスeval.jlのマクロ展開で38 :49 [inline] in(Atom。## 52#55 {Dict {String、Any}})) )at task.jl:60' –

+0

@LeonidasSliliotis - 私の編集を参照してください。あなたがPythonとRの構文の組み合わせを使用しているようです - Juliaはそれ自身のものです。 –

0

問題を解決していないすべての<-=に変更はなく、

function logPredPdf(f::cluster,x::Array{Float64,1}): 

は、問題を解決するようだ

let 
    global k 

後に追加!それでも、なぜか分からない!

関連する問題