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(...)
,但我找不到与该更改相对应的问题编号。
错误消息说您正在尝试在 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)
x
和y
此时是array-like对象。博客 post 显然使用 vector
和 matrix
将它们转换为真正的数组,但这些功能对我来说很陌生。正如 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}
。可能已弃用特定类型数组的向量和矩阵同义词。
朱莉娅的新手。关注这个博客来做神经网络:
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(...)
,但我找不到与该更改相对应的问题编号。
错误消息说您正在尝试在 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)
x
和y
此时是array-like对象。博客 post 显然使用 vector
和 matrix
将它们转换为真正的数组,但这些功能对我来说很陌生。正如 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}
。可能已弃用特定类型数组的向量和矩阵同义词。