2015-01-27 5 views
3

Julia의 새로운 기능. 이 블로그를 따르는 것은 신경망을 수행하는 :줄리아 : 데이터 유형/DataFrame에 대한 오류가있는 혼동

http://blog.yhathq.com/posts/julia-neural-networks.html

나는 줄리아의 데이터 유형 및 오류 메시지에 대한 혼란 스러워요.

# read in df to train 
train_df = readtable("data/winequality-red.csv", separator=';') 
# create train and test data splits 
y = train_df[:quality] 
x = train_df[:, 1:11] # matrix of all except quality 
# vector() and matrix() from blog post 

n = length(y) 
is_train = shuffle([1:n] .> floor(n * .25)) 

x_train,x_test = x[is_train,:],x[!is_train,:] 
y_train,y_test = y[is_train],y[!is_train] 

type StandardScalar 
    mean::Vector{Float64} 
    std::Vector{Float64} 
end 

# initialize empty scalar 
function StandardScalar() 
    StandardScalar(Array(Float64, 0), Array(Float64, 0)) 
end 

# compute mean and std of each col 
function fit_std_scalar!(std_scalar::StandardScalar, x::Matrix{Float64}) 
    n_rows, n_cols = size(x_test) 
    std_scalar.std = zeros(n_cols) 
    std_scalar.mean = zeros(n_cols) 

    for i = 1:n_cols 
    std_scalar.mean[i] = mean(x[:,i]) 
    std_scalar.std[i] = std(x[:,i]) 
    end 
end 

# further vectorize the transformation 
function transform(std_scalar::StandardScalar, x::Matrix{Float64}) 
    # element wise subtraction of mean and division of std 
    (x .- std_scalar.mean') ./ std_scalar.std' 
end 

# fit and transform 
function fit_transform!(std_scalar::StandardScalar, x::Matrix{Float64}) 
    fit_std_scalar!(std_scalar, x) 
    transform(std_scalar, x) 
end 

# fit scalar on training data and then transform the test 
std_scalar = StandardScalar() 

n_rows, n_cols = size(x_test) 

# cols before scaling 
println("Col means before scaling: ") 
for i = 1:n_cols 
    # C printf function 
    @printf("%0.3f ", (mean(x_test[:, i]))) 
end 

나는 오류가 점점 오전 :

x_train = fit_transform!(std_scalar, x_train) 
x_test = transform(std_scalar, x_test) 

# after transforming 
println("\n Col means after scaling:") 
for i = 1:n_cols 
    @printf("%0.3f ", (mean(x_test[:,i]))) 
end 

나는 새로운 오전이 코드는

'.-' has no method matching .-(::DataFrame, ::Array{Float64,2}) in fit_transform! ... 

를이 (신경망에 블로그 게시물 다음 다시) 내 코드입니다 Julia에게 연락하고 문제가 무엇인지 이해하지 못합니다. Vector() 및 Matrix()는 블로그 게시물에서 작동하지 않습니다. 그게 DataFrame의 이전 버전에서 나온 것이라고 가정합니다.

문제점 : Matrix {Float64}를 (를) 가져 와서 DataFrame을 전달하고 있습니다. 나는 비추천 된 (?) Matrix()가 이것을 고쳤을 것이라고 생각 하는가? 확실하지 않다. 이 오류를 분석하고 이러한 함수를 올바른 유형으로 전달하려면 어떻게해야합니까? (여기에 문제가있는 경우)?

감사합니다.

답변

2

과 사이의 요소 별 빼기를 시도하고 있지만 해당 작업에 해당 유형에 대한 정의가 없다는 오류 메시지가 표시됩니다. 상황이 이런 종류의 바보 예 :

julia> "a" .- [1, 2, 3] 
ERROR: `.-` has no method matching .-(::ASCIIString, ::Array{Int64,1}) 

내 생각 엔 당신이

x_train = fit_transform!(std_scalar, x_train) 

앞에

println(typeof(x_train)) 

를 추가 할 경우 그것은 DataFrame 있다고 말했다있을거야 것입니다 당신이 작업하려고하는 배열보다는 오히려. 필자는 DataFrame 라이브러리에 익숙하지 않지만 언젠가는 변환을 파헤칠 수도 있습니다. 이것은 내가 지금 막 가지고있는 모든 것입니다.

추가 의견 데이터 파일

을 획득 한 후 나는 winequality-red.csv를 검색하고 DataFrame

julia> VERSION 
v"0.3.5" 

julia> using DataFrames 

julia> train_df = readtable("data/winequality-red.csv", separator=';') 

julia> y = train_df[:quality] 
1599-element DataArray{Int64,1}: 

julia> x = train_df[:, 1:11] 
1599x11 DataFrame 

julia> typeof(x) 
DataFrame (constructor with 22 methods) 

x로 근무하고 y이 시점에서 배열과 같은 개체 . 블로그 게시물은 분명히 vectormatrix을 사용하여이를 실제 배열로 변환하지만,이 기능은 나에게 익숙하지 않습니다. IainDunning이 그의 대답에서 지적했듯이 (나는 이것을 적절하게 인용하고 싶지만 그 것을 아직 어리둥절하게하지는 않았다.)이 변환은 이제 array을 통해 이루어진다.아마도 이것은 당신이해야 할 것입니다 : 나는 다른 모든 코드의 분석을 통해 다음 적이 없다

julia> y = array(train_df[:quality]) 
1599-element Array{Int64,1}: 

julia> x = array(train_df[:, 1:11]) 
1599x11 Array{Float64,2}: 

를, 그래서 이것은 완벽하게 구체화하고 솔루션을 테스트하기보다는 답의 힌트 너의 문제. 시도해 보면 어떻게 작동하는지 알려주세요.

저는 Vector{Float64}Matrix{Float64} 대신 Array{Float64,1}Array{Float64,2}을보고 사용하는 것에 익숙합니다. 특정 유형의 배열에 대한 벡터 및 매트릭스 동의어가 사용되지 않을 수 있습니다.

+0

네, 그게 제가 생각한 것입니다. 나는 명시 적으로 오류가 ".-"(요소 현명한 뺄셈)이라는 것을 이해해야한다고 말했어야합니다. 고맙습니다! – squishy

+0

해명 해줘서 고마워. 나는 그 세부 사항을 명백하게하고 싶었습니다. 특히 당신이 당신이 줄리아에게 처음 온다고 말한 이후로 (나는 그렇습니다). 그 이후로 데이터 파일을 가져 와서 연주했습니다. 나는 해결책을 보았다고 믿는다. 이것은 거의 @IainDunning이 제안한 해결책이다. 이 정보로 나의 답을 보완 할 것입니다. –

+0

바로! 나는 당신이 해결책으로 편집하기 전에 그것을 조금 알았다. 더 이상 벡터 (...)도 매트릭스 (...)도 아니고 단순히 배열 (...)을 사용합니다. 또한, 작동하지 않는 train_df [ "quality"]에 대한 많은 '오래된'구문을 보았습니다. train_df [: quality] 여야합니다. 다른 사람에게만 허용됩니다. 이안과 마이크 감사합니다! 나는 성공적으로 인공 신경 네트워크 예측 모델을 만들었습니다 :) – squishy

2

나는 vector(...)matrix(...)가 모두 array(...)으로 대체되었지만 그 변경에 해당하는 문제 번호를 찾을 수 없다고 생각합니다.