我真的可以使用一个技巧来帮助我绘制一个决策边界来分离到数据类。我通过Python NumPy创建了一些样本数据(来自高斯分布)。在这种情况下,每个数据点都是二维坐标,即由2行组成的1列向量。E、 g
[ 1
2 ]
假设我有两个类,class1和class2,我通过下面的代码为class1创建了100个数据点,为class2创建了100个数据点(分配给变量x1_samples和x2_samples)。
mu_vec1 = np.array([0,0])
cov_mat1 = np.array([[2,0],[0,2]])
x1_samples = np.random.multivariate_normal(mu_vec1, cov_mat1, 100)
mu_vec1 = mu_vec1.reshape(1,2).T # to 1-col vector
mu_vec2 = np.array([1,2])
cov_mat2 = np.array([[1,0],[0,1]])
x2_samples = np.random.multivariate_normal(mu_vec2, cov_mat2, 100)
mu_vec2 = mu_vec2.reshape(1,2).T
当我为每个类绘制数据点时,它将如下所示:
现在,我提出了一个用于区分两个类的决策边界的方程,并希望将其添加到绘图中。但是,我不确定如何绘制此函数:
def decision_boundary(x_vec, mu_vec1, mu_vec2):
g1 = (x_vec-mu_vec1).T.dot((x_vec-mu_vec1))
g2 = 2*( (x_vec-mu_vec2).T.dot((x_vec-mu_vec2)) )
return g1 - g2
我非常感谢你的帮助!
编辑: 直觉上(如果我的数学做得对的话),我希望在绘制函数时,决策边界看起来有点像这条红线。。。
根据您编写
decision_boundary
的方式,您将希望使用contour
函数,如Joe在上面所述。如果只需要边界线,可以在0级别绘制单个轮廓:这使得:
可以为边界创建自己的公式:
在这里你必须找到位置
x0
和y0
,以及半径方程的常数ai
和bi
。所以,你有2*(n+1)+2
变量。对于此类问题,使用scipy.optimize.leastsq
很简单。下面附加的代码为
leastsq
惩罚超出边界的点构建剩余。问题的结果,通过以下方法获得:使用
n=1
:使用
n=2
:usng
n=5
:使用
n=7
:你的问题比简单的绘图更复杂:你需要画出能最大化类间距离的等高线。幸运的是,这是一个很好的研究领域,特别是支持向量机学习。
最简单的方法是下载
scikit-learn
模块,它提供了很多很酷的方法来绘制边界:http://scikit-learn.org/stable/modules/svm.html代码:
线性图(取自http://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html)
多行图(取自http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html)
实施
如果你想自己实现,你需要解以下二次方程:
维基百科的文章
不幸的是,对于像你画的那样的非线性边界,依赖核技巧是一个困难的问题,但是没有一个明确的解决方案。
相关问题 更多 >
编程相关推荐