2012-03-17 47 views
6

Tôi là người mới bắt đầu khi nói đến các mạng thần kinh. Tôi đã đấu vật với ruby-fann và ai4r cả ngày và tiếc là tôi không có bất cứ điều gì để hiển thị cho nó, vì vậy tôi figured tôi sẽ đi vào Stack tràn và yêu cầu những người am hiểu ở đây.Mạng thần kinh huấn luyện trong Ruby

Tôi có một bộ mẫu - mỗi ngày có một điểm dữ liệu, nhưng chúng không phù hợp với bất kỳ mẫu rõ ràng nào mà tôi có thể tìm ra (tôi đã thử một số lần hồi quy). Tuy nhiên, tôi nghĩ nó sẽ gọn gàng để xem liệu có cách nào để dự đoán dữ liệu đi vào tương lai ngay từ ngày đó không, và tôi nghĩ mạng lưới thần kinh sẽ là một cách tốt để tạo ra một hàm có thể hy vọng thể hiện mối quan hệ đó .

Ngày tháng là đối tượng DateTime và các điểm dữ liệu là số thập phân, như 7,68. Tôi đã chuyển đổi các đối tượng DateTime thành nổi và sau đó chia cho 10.000.000.000 để lấy một số từ 0 đến 1, và tôi đã chia số thập phân cho 1.000 để có được số từ 0 đến 1. Tôi có hơn một ngàn mẫu ... đây là những gì một trích đoạn ngắn trông giống như:

[ 
    ["2012-03-15", "7.68"], 
    ["2012-03-14", "4.221"], 
    ["2012-03-13", "12.212"], 
    ["2012-03-12", "42.1"] 
] 

nào khi chuyển trông như thế này:

[ 
    [0.13317696, 0.000768], 
    [0.13316832, 0.0004221], 
    [0.13315968, 0.0012212], 
    [0.13315104, 0.00421] 
] 

tôi loại muốn chuyển đổi này là không cần thiết, nhưng tôi lạc đề. Vấn đề là cả ai4r và ruby-fann đều trả về một số không đổi, thường là một cái gì đó ở giữa phạm vi của các mẫu, khi tôi chạy chúng. Dưới đây là đoạn code cho ruby-Fann:

@fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 3], :num_outputs=>1) 
training_data = RubyFann::TrainData.new(:inputs => formatted_data.collect{|d| [d.first]}, :desired_outputs => formatted_data.collect{|d| [d.last]}) 
@fann.train_on_data(training_data, 1000, 1, 0.0001) 
@fann.run([DateTime.now.to_f/10000000000.0]) # Always something random, and always the same number no matter what date I request it for 

Và đối với ai4r:

@ai4r = Ai4r::NeuralNetwork::Backpropagation.new([1, 3, 3, 1]) 
1000.times do 
    formatted_data.each do |data| 
    @ai4r.train(data.first, data.last) 
    end 
end 
@ai4r.eval([DateTime.now.to_f/10000000000.0]) # A different result frmo above, but always seemingly random and the same for any requested date 

tôi cảm thấy như tôi là thiếu một cái gì đó thực sự cơ bản ở đây. Tôi biết đây là một câu hỏi khá cởi mở nhưng nếu có ai có thể giúp tôi tìm ra cách tôi dạy các mạng thần kinh không đúng cách, tôi thực sự đánh giá cao nó!

+1

Một trong những vấn đề của bạn là bạn đang xử lý các con số quá nhỏ. Khi tôi đặt lỗi mong muốn thành 0,0001 tôi thậm chí không thể dự đoán dữ liệu đào tạo bạn đã đề cập ở trên một cách chính xác. Bạn nên suy nghĩ về bất kỳ cách nào khác để mã hóa đầu vào và đầu ra của bạn. Có lẽ hợp lý để cung cấp cho năm, tháng và ngày một đầu vào riêng biệt? Có thể bạn có thể sử dụng mã hóa 1-of-c cho bất kỳ tính năng nào trong số này (ftp://ftp.sas.com/pub/neural/FAQ2.html#A_cat). – alfa

+0

Tôi đang gặp vấn đề tương tự - bạn có bao giờ hiểu điều này không? Chúng ta phải làm điều gì đó sai trái với mạng thần kinh, tôi không hiểu. – Kevin

Trả lời

3

alfa có một điểm tốt trong nhận xét của mình, một cách khác để sử dụng NN có thể phù hợp hơn.

Nó phụ thuộc vào vấn đề, nhưng nếu giá trị của ngày thậm chí là một phần chức năng của giá trị ngày trước đó, coi đây là chuỗi thời gian có thể mang lại kết quả tốt hơn .

Sau đó, bạn thay vào đó sẽ dạy NN tạo ra giá trị của ngày làm hàm của một cửa sổ, ví dụ, giá trị mười ngày trước đó; bạn cũng có thể giữ tham số ngày dưới dạng thang đo đầu vào thực giữa [0, 1] khi bạn tin rằng nó có tác dụng đáng kể vào giá trị của ngày.

Các vấn đề liên quan