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()会修复此问题?不确定。如何分析此错误并将这些函数传递给正确的类型(如果这是问题)?
谢谢!
答案 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)
此时 x
和y
类似数组的对象。博客帖子显然使用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}
。可能不推荐使用特定类型数组的向量和矩阵同义词。