从支持向量机返回最佳支持向量
Returning best support vectors from support vector machine
我正在使用来自 sklearn(在 Python 中)的支持向量 classifier 来找到一组“0”和“1”标记数据之间的最佳边界。
参见:https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
但是我想在围绕边界线旋转数据后执行一些分析,因此我需要 return 允许我定义开始的线的属性。
我执行SVC如下:
相关进口:
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
我将 classifier 定义为:
clf = svm.SVC(kernel='linear',C = 1e-3 ,class_weight='balanced')
然后适合训练数据:
clf.fit(f_train, labels_train)
因此可以使用以下方法查看线性 class 边界:
plt.figure()
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
见于:https://scikit-learn.org/stable/auto_examples/svm/plot_separating_hyperplane.html
但是调用时:
clf.support_vectors_.shape
如果尝试描述线性边界,我不确定如何将输出解释为相关,因为输出的形状为 (4485, 2)
任何帮助 return 允许我定义边界线的东西将不胜感激!
基于你可以使用clf.intercept_
和clf.coef_
属性得到一条边界线:
def decision_hyperplane(clf, x, y=None, dimension=2):
"""
Return a decision line (dimension 2, return y based on x) or a
decision plane (dimension 3, return z based on x and y).
Decision plane equation is wx + b = 0, so in 2d case:
w.dot(x) + b = w_x * x + w_y * y + b = 0
y = (-w_x * x - b) / w_y
In 3d:
w_x * x + w_y * y + w_z * z + b = 0
z = (-w_x * x - w_y * y - b) / w_z
"""
if dimension == 2:
return (-clf.intercept_[0] - clf.coef_[0][0] * x) / clf.coef_[0][1]
elif dimension == 3:
return (-clf.intercept_[0] - clf.coef_[0][0] * x - clf.coef_[0][1] * y) / clf.coef_[0][2]
如果你像这样用你的代码使用它
ax.plot(xx, decision_hyperplane(clf, xx), color='red')
结果会是
我正在使用来自 sklearn(在 Python 中)的支持向量 classifier 来找到一组“0”和“1”标记数据之间的最佳边界。
参见:https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
但是我想在围绕边界线旋转数据后执行一些分析,因此我需要 return 允许我定义开始的线的属性。
我执行SVC如下:
相关进口:
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
我将 classifier 定义为:
clf = svm.SVC(kernel='linear',C = 1e-3 ,class_weight='balanced')
然后适合训练数据:
clf.fit(f_train, labels_train)
因此可以使用以下方法查看线性 class 边界:
plt.figure()
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
见于:https://scikit-learn.org/stable/auto_examples/svm/plot_separating_hyperplane.html
但是调用时:
clf.support_vectors_.shape
如果尝试描述线性边界,我不确定如何将输出解释为相关,因为输出的形状为 (4485, 2)
任何帮助 return 允许我定义边界线的东西将不胜感激!
基于clf.intercept_
和clf.coef_
属性得到一条边界线:
def decision_hyperplane(clf, x, y=None, dimension=2):
"""
Return a decision line (dimension 2, return y based on x) or a
decision plane (dimension 3, return z based on x and y).
Decision plane equation is wx + b = 0, so in 2d case:
w.dot(x) + b = w_x * x + w_y * y + b = 0
y = (-w_x * x - b) / w_y
In 3d:
w_x * x + w_y * y + w_z * z + b = 0
z = (-w_x * x - w_y * y - b) / w_z
"""
if dimension == 2:
return (-clf.intercept_[0] - clf.coef_[0][0] * x) / clf.coef_[0][1]
elif dimension == 3:
return (-clf.intercept_[0] - clf.coef_[0][0] * x - clf.coef_[0][1] * y) / clf.coef_[0][2]
如果你像这样用你的代码使用它
ax.plot(xx, decision_hyperplane(clf, xx), color='red')
结果会是