Julia:与数据类型/DataFrame 上的错误混淆

Julia: confusion with error on datatype / DataFrame

朱莉娅的新手。关注这个博客来做神经网络:

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

我对 Julia 中的数据类型和错误消息感到困惑。这是我的代码(再次关注神经网络上的博客 post):

# 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

我收到错误:

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

对于此代码:

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

我是 Julia 的新手,只是不明白问题出在哪里。 Vector() 和 Matrix() 在博客 post 中不起作用。我假设那是来自旧版本的 DataFrame。

我认为我的问题是:这些函数接受了 ::Matrix{Float64} 而我传入了 DataFrame。我假设弃用的 (?) Matrix() 会解决这个问题?没有把握。我如何分析此错误并将这些函数传递给正确的类型(如果这是这里的问题)?

谢谢!

我相信 vector(...)matrix(...) 都被替换为 array(...),但我找不到与该更改相对应的问题编号。

错误消息说您正在尝试在 DataFrameArray 之间进行逐元素减法 .-,但该操作没有这些类型的定义。这种情况的一个愚蠢的例子:

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

我的猜测是,如果您添加

println(typeof(x_train))

前面
x_train = fit_transform!(std_scalar, 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)

xy此时是array-like对象。博客 post 显然使用 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}:

我没有对所有其他代码进行分析,因此这是对答案的提示,而不是针对您的问题的完全充实和测试的解决方案。如果你试一试,请告诉我结果如何。

我习惯于看到和使用 Array{Float64,1}Array{Float64,2} 而不是 Vector{Float64}Matrix{Float64}。可能已弃用特定类型数组的向量和矩阵同义词。