flo*_*lod 3 python numpy matplotlib svm scikit-learn
如何使用 scikit svm 绘制一维数据的分离“超平面”?
我遵循二维数据指南:http://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html,但不知道如何使其适用于一维数据
pos = np.random.randn(20, 1) + 1
neg = np.random.randn(20, 1) - 1
X = np.r_[pos, neg]
Y = [0] * 20 + [1] * 20
clf = svm.SVC(kernel='linear', C=0.05)
clf.fit(X, Y)
# how to get "hyperplane" and margins values ??
Run Code Online (Sandbox Code Playgroud)
谢谢
二维数据的分离超平面是一条线,而对于一维数据,超平面可以归结为一个点。绘制一维数据的分离超平面的最简单方法有点麻烦:通过添加第二个特征(所有样本的值都为 0)将数据变成二维数据。通过这样做,权重向量的第二个分量为零,即w = [ w 0 , 0] (请参阅本文末尾的附录)。由于w 1 = 0 且w 1是定义分隔线的斜率和 y 截距项的表达式的分母(请参阅附录),因此两个系数均为 \xe2\x88\x9e。在这种情况下,求解x的分离超平面方程很方便,结果为x = x 0 = -b/ w 0。余量结果为 2/ w 0(详细信息请参阅附录)。
\n以下脚本实现了这种方法:
\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn import svm\n\nnp.random.seed(0)\npos = np.hstack((np.random.randn(20, 1) + 1, np.zeros((20, 1))))\nneg = np.hstack((np.random.randn(20, 1) - 1, np.zeros((20, 1))))\nX = np.r_[pos, neg]\nY = [0] * 20 + [1] * 20\n\nclf = svm.SVC(kernel=\'linear\')\nclf.fit(X, Y)\nw = clf.coef_[0]\nx_0 = -clf.intercept_[0]/w[0]\nmargin = w[0]\n\nplt.figure()\nx_min, x_max = np.floor(X.min()), np.ceil(X.max())\ny_min, y_max = -3, 3\nyy = np.linspace(y_min, y_max)\nXX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]\nZ = clf.predict(np.c_[XX.ravel(), np.zeros(XX.size)]).reshape(XX.shape)\nplt.pcolormesh(XX, YY, Z, cmap=plt.cm.Paired)\nplt.plot(x_0*np.ones(shape=yy.shape), yy, \'k-\')\nplt.plot(x_0*np.ones(shape=yy.shape) - margin, yy, \'k--\')\nplt.plot(x_0*np.ones(shape=yy.shape) + margin, yy, \'k--\')\nplt.scatter(pos, np.zeros(shape=pos.shape), s=80, marker=\'o\', facecolors=\'none\')\nplt.scatter(neg, np.zeros(shape=neg.shape), s=80, marker=\'^\', facecolors=\'none\')\nplt.xlim(x_min, x_max)\nplt.ylim(y_min, y_max)\nplt.show()\nRun Code Online (Sandbox Code Playgroud)\n尽管上面的代码是不言自明的,但这里有一些提示。X维度为 40 行 x 2 列:第一列中的值是随机数,而第二列中的所有元素均为零。在代码中,如果 . 返回的对象为,则权重向量w = [ w 0 , 0] 和截距b分别为clf_coef_[0]和。clf.intercept_[0]clfsklearn.svm.SVC
这是运行脚本时得到的图:
\n\n为了清楚起见,我建议通过在第二个功能中添加/减去一个小常量来调整上面的代码,例如:
\nplt.scatter(pos, .3 + np.zeros(shape=pos.shape), ...)\nplt.scatter(neg, -.3 + np.zeros(shape=neg.shape), ...)\nRun Code Online (Sandbox Code Playgroud)\n通过这样做,可视化效果得到显着改善,因为不同的类别没有重叠地显示。
\n其中x是n维向量,w是权重向量,b是偏差或截距。对于n = 2,我们有w 0 .x + w 1 .y + b = 0。经过一些代数之后,我们得到y = -( w 0 / w 1 )。x + (- b / w 1 )。从该表达式可以清楚地看出,二维特征空间中的判别超平面是一条方程y = ax + y 0 ,其中斜率由a = - w 0 / w 1给出,y 截距项为y 0 = - b / w 1。在 SVM 中,分离超平面的边距为 2/\xe2\x80\x96 w \xe2\x80\x96,对于 2D 来说可简化为
\n| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |