Это интересная проблема.На первый взгляд, это очень просто - одна особенность означает одно измерение, поэтому гиперплоскость должна быть 0-мерной, то есть точкой.Но то, что дает вам scikit-learn, это линия.Так что вопрос в том, как превратить эту линию в точку.
Я потратил около часа на поиски ответов в документации по scikit-learn, но в 1-ых классификаторах SVM просто нет ничего (вероятно, потому что они не практичны).Поэтому я решил поиграть с примером кода ниже, чтобы увидеть, смогу ли я найти ответ:
from sklearn import svm
n_samples = 100
X = np.concatenate([np.random.normal(0,0.1,n_samples), np.random.normal(10,0.1,n_samples)]).reshape(-1,1)
y = np.array([0]*n_samples+[1]*n_samples)
clf = svm.LinearSVC(max_iter = 10000)
clf.fit(X,y)
slope = clf.coef_
intercept = clf.intercept_
print(slope, intercept)
print(-intercept/slope)
X
- это массив выборок, так что первые 100 точек выбираются из N (0,0.1), а следующие 100 точек выбираются из N (10,0.1).y
- массив меток (100 класса '0' и 100 класса '1').Интуитивно понятно, что гиперплоскость должна быть посередине между 0 и 10.
Как только вы подгоните классификатор, вы обнаружите, что пересечение составляет около -0,96, что далеко не так, как 0-d гиперплоскость (то есть точка)быть.Однако, если вы возьмете y=0
и произведете обратный расчет x
, это будет довольно близко к 5. Теперь попробуйте изменить средства распределений, составляющих X, и вы обнаружите, что ответом всегда будет -intercept/slope
.Это ваша 0-й гиперплоскость (точка) для классификатора.
Таким образом, для визуализации вам просто нужно нанести данные на числовую линию (используйте разные цвета для классов), а затем наметить границу, полученную с помощьюделение отрицательного перехвата на наклон.Я не уверен, как построить числовую линию, но вы всегда можете прибегнуть к точечной диаграмме со всеми y
координатами, установленными в 0.