Как построить SVM гиперплоскость только с одной функцией - PullRequest
1 голос
/ 28 сентября 2019

У меня есть набор данных с одной функцией, и я использую scikit-learn train классификатор опорных векторов.Я хотел бы визуализировать результаты, но я немного озадачен тем, как построить график разброса.Я получаю свою гиперплоскость, выполняя следующие действия:

slope = clf.coef_[0][0]
intercept = clf.intercept_[0]

Что дает мне y = -.01x + 2.5

Я предполагаю, что это моя гиперплоскость.Я не могу понять, как построить свои данные вокруг этого только с одной функцией.Что бы я использовал для своей оси у?

1 Ответ

0 голосов
/ 28 сентября 2019

Это интересная проблема.На первый взгляд, это очень просто - одна особенность означает одно измерение, поэтому гиперплоскость должна быть 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.

...