2014-04-21 56 views
1

我将从以下堆栈溢出问题借用图像帮我说明我的问题: Drawing decision boundary of two multivariate gaussian图纸决策边界

enter image description here

我有2个教学班,2D点,我感兴趣的是决策边界(或判别式)。

我写了函数返回判别函数的结果(一个浮点值),允许我将样本分类为这两种模式。

如果一个采样点是例如X_I = [X,Y]
我可以调用函数 和

如果g1(x,y) > g2(x,y)它的类1,反之亦然,如果

g1(x,y) <= g2(x,y)这2类

所以决策边界应该在g1(x,y) == g2(x,y)


编辑:

希望这样的例子是有帮助的:

1)假设我取1个样品x = [1, 2]从数据集


2)然后,我将调用例如
g1(1,2) - >返回0.345
g2(1,2) - >返回0.453
- >样本x属于类别2,由于g2(1,2) > g1(1,2)


3)现在用于判定边界,我有g2(x,y) == g1(x,y)

g1(x,y) - g2(x,y) == 0


4)我生成的范围为x值,例如,1,2,3,4,5,现在我想 找到相应的y值是产生g1(x,y) - g2(x,y) == 0


5),那么我可以用这些x,y双绘制决策边界


在StackOverflow上帖子,我上面链接,建议将

你可以简单地绘制轮廓线的f(x,y):= pdf1(x,y)> pdf2(x,y)。所以你定义函数f为1 iff pdf1(x,y)> pdf2(x,y)。 通过这种方式,唯一的轮廓将被放置在沿着曲线,其中 pdf1(x,y)== pdf2(x,y)是决策边界(判别式)。如果 您想定义“nice”函数,您可以简单地通过设置 f(x,y)= sgn(pdf1(x,y) - pdf2(x,y)),并绘制其等值线图 完全相同的判别式。

但我怎么会在Python和matplotlib中做到这一点,我真的失去了设置代码来做到这一点。我很感激任何帮助!

编辑:

一点点更多功能g()本身:

def discr_func(x, y, cov_mat, mu_vec): 
    """ 
    Calculates the value of the discriminant function for a dx1 dimensional 
    sample given covariance matrix and mean vector. 

    Keyword arguments: 
     x_vec: A dx1 dimensional numpy array representing the sample. 
     cov_mat: dxd numpy array of the covariance matrix. 
     mu_vec: dx1 dimensional numpy array of the sample mean. 

    Returns a float value as result of the discriminant function. 

    """ 
    x_vec = np.array([[x],[y]]) 

    W_i = (-1/2) * np.linalg.inv(cov_mat) 
    assert(W_i.shape[0] > 1 and W_i.shape[1] > 1), 'W_i must be a matrix' 

    w_i = np.linalg.inv(cov_mat).dot(mu_vec) 
    assert(w_i.shape[0] > 1 and w_i.shape[1] == 1), 'w_i must be a column vector' 

    omega_i_p1 = (((-1/2) * (mu_vec).T).dot(np.linalg.inv(cov_mat))).dot(mu_vec) 
    omega_i_p2 = (-1/2) * np.log(np.linalg.det(cov_mat)) 
    omega_i = omega_i_p1 - omega_i_p2 
    assert(omega_i.shape == (1, 1)), 'omega_i must be a scalar' 

    g = ((x_vec.T).dot(W_i)).dot(x_vec) + (w_i.T).dot(x_vec) + omega_i 
    return float(g) 

当我执行它,它会返回一个浮点数,例如,

discr_func(1, 2, cov_mat=cov_est_1, mu_vec=mu_est_1)
-3.726426544537969

如果我没有犯错,应该是这个equat离子:enter image description here

谢谢你很多关于与轮廓的建议,不过,我已经实现它的问题:

import pylab as pl 

X, Y = np.mgrid[-6:6:100j, -6:6:100j] 
x = X.ravel() 
y = Y.ravel() 

p = (discr_func(x, y, cov_mat=cov_est_1, mu_vec=mu_est_1) -\ 
    discr_func(x, y, cov_mat=cov_est_2, mu_vec=mu_est_2)).reshape(X.shape) 

#pl.scatter(X_train[:, 0], X_train[:, 1]) 
pl.contour(X, Y, p, levels=[0]) 

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-192-28c1c8787237> in <module>() 
     5 y = Y.ravel() 
     6 
----> 7 p = (discr_func(x, y, cov_mat=cov_est_1, mu_vec=mu_est_1) -  discr_func(x, y, cov_mat=cov_est_2, mu_vec=mu_est_2)).reshape(X.shape) 
     8 
     9 #pl.scatter(X_train[:, 0], X_train[:, 1]) 

<ipython-input-184-fd2f8b7fad82> in discr_func(x, y, cov_mat, mu_vec) 
    25  assert(omega_i.shape == (1, 1)), 'omega_i must be a scalar' 
    26 
---> 27  g = ((x_vec.T).dot(W_i)).dot(x_vec) + (w_i.T).dot(x_vec) + omega_i 
    28  return float(g) 

ValueError: objects are not aligned 

我的感觉是,.ravel()列表的传球不如何工作我设置了这个功能......有什么建议吗?

+0

您discr_func功能不能用一个呼叫计算网格上的所有值。所以你需要一个for循环来为网格上的每个点调用discr_func。 – HYRY

回答

2

计算g1(x, y) - g2(x, y)上一个mgrid[]然后通过contour(..., levels=[0])画线,这里是一个例子。由于您没有发布任何样本数据和代码,我使用sklearn来生成样本数据。你只需要在代码#plot code from here后:

import numpy as np 
import pylab as pl 
from sklearn import mixture 

np.random.seed(0) 
C1 = np.array([[3, -2.7], [1.5, 2.7]]) 
C2 = np.array([[1, 2.0], [-1.5, 1.7]]) 

X_train = np.r_[ 
    np.random.multivariate_normal((-5, -5), C1, size=100), 
    np.random.multivariate_normal((5, 5), C2, size=100), 
] 

clf = mixture.GMM(n_components=2, covariance_type='full') 
clf.fit(X_train) 

#define g1(x, y) and g2(x, y) 

def g1(x, y): 
    return clf.predict_proba(np.column_stack((x, y)))[:, 0] 

def g2(x, y): 
    return clf.predict_proba(np.column_stack((x, y)))[:, 1] 

#plot code from here 

X, Y = np.mgrid[-15:15:100j, -15:15:100j] 
x = X.ravel() 
y = Y.ravel() 

p = (g1(x, y) - g2(x, y)).reshape(X.shape) 

pl.scatter(X_train[:, 0], X_train[:, 1]) 
pl.contour(X, Y, p, levels=[0]) 

这里是输出:

enter image description here