我一直遇到SVM问题,因为无论输入什么,它总是返回相同的值...
为了解释我的问题,我尽可能地简化了它:假设我希望我的SVM能够识别一位等于1还是0。它的输入是位,并且我希望它标记它们取值为1或0。
所以我在做什么:我选择一个等于1的位,另一个等于0,我训练SVM识别它们,然后想在相同的位上测试SVM(在我的情况下,train = test) 。这是代码,可以直接执行:
import cv2
import numpy as np
from sklearn import preprocessing
# 1. Train data
train_1 = np.array([[1]]).astype(np.float32)
train_0 = np.array([[0]]).astype(np.float32)
# 2. Test data
test_1 = np.array([[1]]).astype(np.float32)
test_0 = np.array([[0]]).astype(np.float32)
# 3. Labels
labels = np.array([[1], [0]]).astype(np.float32)
# 4. SVM init
svm = cv2.SVM()
svm_param = dict(kernel_type = cv2.SVM_RBF,
svm_type = cv2.SVM_C_SVC,
C = 4,
gamma = 0.125)
# 5. SVM train
train = np.vstack((train_1, train_0))
scaler = preprocessing.StandardScaler().fit(train) # comment
train = scaler.transform(train) # comment
svm.train(train, labels, params = svm_param)
# 6. SVM predict
print "Test 0 : ", svm.predict(test_0)
print "Test 1 : ", svm.predict(test_1)
(我们不在乎SVM参数,因为无论它们有什么值我总是会遇到相同的问题)
有人告诉我,必须对数据进行预处理,以抑制均值和方差(末尾带有“#comment”的行)。如果我按原样放置代码,它将无法正常工作并始终产生0。[1,0]训练变量在处理后变为[1,-1]。
如果我评论这两行,那么我的SVM在那种非常特殊的情况下工作,但是我没有给它正确的数据(由于均值和方差)...
我做错了什么?
谢谢。