2012-04-07 32 views
10

Tôi hiện đang sử dụng phiên bản MATLAB của máy vector hỗ trợ LIBSVM để phân loại dữ liệu của mình. Tài liệu LIBSVM đề cập đến việc mở rộng quy mô trước khi áp dụng SVM là rất quan trọng và chúng ta phải sử dụng cùng một phương pháp để mở rộng cả dữ liệu đào tạo và thử nghiệm.mở rộng dữ liệu thử nghiệm cho LIBSVM: Triển khai MATLAB

"Cùng một phương pháp chia tỷ lệ" được giải thích là: Ví dụ: giả sử chúng tôi chia tỷ lệ thuộc tính đầu tiên của dữ liệu đào tạo từ [-10, +10] thành [-1, +1]. Nếu thuộc tính đầu tiên của dữ liệu thử nghiệm nằm trong khoảng [-11, +8], chúng ta phải mở rộng các dữ liệu thử nghiệm để [-1.1, +0.8]

Scaling dữ liệu huấn luyện trong khoảng [0,1] thể được thực hiện bằng cách sử dụng mã MATLAB sau:

(data - repmat(min(data,[],1),size(data,1),1))*spdiags(1./(max(data,[],1)-min(data,[],1))',0,size(data,2),size(data,2)) 

Nhưng tôi không biết làm thế nào để mở rộng dữ liệu thử nghiệm một cách chính xác.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

+0

câu hỏi của tôi là nếu đào tạo dữ liệu trong phạm vi [a, b] được chuẩn hóa theo phạm vi [0,1], dữ liệu thử nghiệm trong phạm vi [c, d] được chuẩn hóa theo phạm vi nào? – Lily

Trả lời

16

Mã bạn cung cấp về cơ bản trừ số tiền tối thiểu và sau đó chia cho phạm vi. Bạn cần phải lưu trữ tối thiểu và phạm vi của các tính năng dữ liệu đào tạo.

minimums = min(data, [], 1); 
ranges = max(data, [], 1) - minimums; 

data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1); 

test_data = (test_data - repmat(minimums, size(test_data, 1), 1)) ./ repmat(ranges, size(test_data, 1), 1); 
+0

Cảm ơn bạn rất nhiều! :) – Lily

+0

@Richante: Câu trả lời của bạn rất hữu ích. Tôi chỉ muốn làm rõ, "dữ liệu" ở đây là dữ liệu đào tạo và "test_data" là dữ liệu thử nghiệm ?? – Sid

+0

http://stackoverflow.com/questions/43408031/scaling-for-single-instance-in-matlab-for-libsvm?noredirect=1&lq=1 –

0

Mã của Richante là không đúng nếu có các cột mà tất cả các quan sát có cùng giá trị (có thể xảy ra nếu dữ liệu thưa thớt). Ví dụ:

>> data = [1 2 3; 5 2 8; 7 2 100] 

data = 

    1  2  3 
    5  2  8 
    7  2 100 

>> test_data = [1 2 3; 4 5 6; 7 8 9]; 
>> minimums = min(data,[],1); 
>> ranges = max(data, [], 1) - minimums; 
>> data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1); 
>> data 

data = 

     0  NaN   0 
    0.6667  NaN 0.0515 
    1.0000  NaN 1.0000 

Vì vậy, bạn phải kiểm tra xem có cột nào chỉ có một giá trị duy nhất không. Nhưng nếu như chỉ có một giá trị duy nhất trong toàn bộ tập huấn luyện, nhưng có một vài giá trị trong tập kiểm tra? Và chúng ta làm gì trong kịch bản Rời một lần, trong đó chỉ có một quan sát trong tập kiểm tra, thì nếu tất cả các giá trị trong một cột của tập huấn luyện là 0, và giá trị tương ứng trong tập kiểm tra là 100? Đây thực sự là những trường hợp thoái hóa, nhưng nó có thể xảy ra. Tuy nhiên, khi tôi kiểm tra tệp svm_scale.c trong thư viện Libsvm, tôi nhận thấy phần này:

void output(int index, double value) 
{ 
    /* skip single-valued attribute */ 
    if(feature_max[index] == feature_min[index]) 
     return; 

    if(value == feature_min[index]) 
     value = lower; 
    else if(value == feature_max[index]) 
     value = upper; 
    else 
     value = lower + (upper-lower) * 
      (value-feature_min[index])/ 
      (feature_max[index]-feature_min[index]); 

    if(value != 0) 
    { 
     printf("%d:%g ",index, value); 
     new_num_nonzeros++; 
    } 
} 

Vì vậy, chúng ta nên bỏ qua những trường hợp này? Tôi thực sự không biết. Như tôi đã nói, tôi không phải là một cơ quan về vấn đề này, vì vậy tôi sẽ chờ đợi một câu trả lời khác, tốt hơn là từ các tác giả của Libsvm, để xóa mọi thứ .....

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