Julia:对数据类型/ DataFrame的错误感到困惑

时间:2015-01-27 23:12:34

标签: julia

Julia的新手。按照这个博客做神经网络:

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

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

# 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

我是朱莉娅的新手,我只是不明白这个问题是什么。 Vector()和Matrix()在博客文章中不起作用。我假设这是来自旧版本的DataFrame。

我认为我的问题是:这些函数正在接收:: Matrix {Float64},我正在传递DataFrame。我假设已弃用(?)Matrix()会修复此问题?不确定。如何分析此错误并将这些函数传递给正确的类型(如果这是问题)?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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 类似数组的对象。博客帖子显然使用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}。可能不推荐使用特定类型数组的向量和矩阵同义词。