2011-09-26 36 views
5

Tôi có một chức năng nhỏ, được cho là đưa ra dự đoán dựa trên thuật toán học máy. Chức năng không hoạt động, vì vậy tôi đặt một bản in để kiểm tra giá trị, và đột nhiên nó bắt đầu hoạt động. Khi tôi nhận xét ra dòng in, nó ngừng hoạt động trở lại. Có điều gì tôi đang thiếu về lý do tại sao điều này sẽ xảy ra?Tại sao in một biến thay đổi giá trị của nó?

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    std::cout << "dotProduct = " << dotProduct << std::endl; 
    return (dotProduct > 0 ? 1 : -1); 
} 

vì một lý do tạo ra một kết quả khác nhau sau đó

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    return (dotProduct > 0 ? 1 : -1); 
} 

và để chứng minh rằng các kết quả khác nhau cho các đầu vào tương tự, tôi gọi chức năng này với:

std::vector<InstanceT> _instances = populate_data() //this works for both versions 
for (int i = 0; i < _instances.size(); i++){ 
    std::cout << "prediction: " << makePrediction(_instances[i], true) << std::endl; 
} 

Bất kỳ suy nghĩ ?

+0

Câu hỏi hay cho codereview.stackexchange.com –

+2

Ý của bạn là "không hoạt động"? Hành vi mong đợi và quan sát là gì? Vui lòng chỉ định đầu vào và đầu ra chính xác. –

+0

std :: endl thường cũng tuôn ra. Là mã gọi của bạn sản xuất đầu ra mà phụ thuộc vào trạng thái của bộ đệm của cout? Có vẻ như không. Sự khác biệt thực sự là đầu ra; giá trị chính xác của 'makePrediction' là gì và nó cho biết khi nào sai? –

Trả lời

4

Điều này thường xảy ra do hai lý do:

  1. vấn đề truy cập đồng thời. Nếu chương trình của bạn đa luồng, bạn che dấu các điều kiện chủng tộc với đầu ra gỡ lỗi. Hãy thử một trình gỡ lỗi MT như helgrind.
  2. Ngăn xếp bị hỏng. Hãy thử chạy valgrind trên chương trình của bạn và xem nó có sạch không.

Đây là những lời khuyên khá chung chung, nhưng bạn sẽ phải chỉ định câu hỏi của mình tốt hơn để được tư vấn tốt hơn :-).

+0

mã không phải là đa luồng, vì vậy nó không phải là một vấn đề đồng thời.Và để trả lời một số người bình luận khác, về việc đăng kết quả: về cơ bản, cho cùng một đầu vào (cả tham số và thành viên dữ liệu trong lớp đều bằng nhau), mã tạo ra cả +1 và -1 với câu lệnh in, nhưng chỉ tạo ra -1 khi câu lệnh in ra. – Max

+0

@Max: Tôi nghĩ bạn đã bỏ lỡ điểm chính của những người bình luận. Đưa ra một ví dụ cụ thể khi nó "thất bại". Một mã mà tôi có thể biên dịch và nó sẽ tái tạo vấn đề. Bạn có một số lỗi xấu xí nhưng nếu bạn không nỗ lực, không ai có thể giúp bạn. –

+0

Vấn đề là, tôi không biết cách cung cấp một ví dụ tốt, vì đây là một phần của cấu trúc mã lớn hơn, dựa trên tập dữ liệu từ một tệp riêng biệt. Tôi không biết làm thế nào để tạo ra một ví dụ tốt mà không bao gồm tất cả các mã. – Max

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