我知道这个问题已经有很多讨论了,但是我就是无法解决。我想绘制逻辑回归模型的决策边界,但我的决策边界图与预期相差甚远。我还没有用新数据来验证分类器,然而,我的损失看起来符合预期,并且很好地收敛了。请查看下面的代码。
编辑1: 我已经尝试了几种解决方案和绘制决策边界的方法,结果总是看起来一样,所以我的参数肯定有问题。有人知道可能是什么问题吗?
编辑2: 出于无奈,我随机更改了决策边界的参数为 y = (-(w[2]+w[0].item()*x)/w[1]).T
,现在它工作了。有人知道为什么我需要这样调整吗?
这就是我得到的结果。我做错了什么?
import numpy as npimport matplotlib.pyplot as pltdef sig(x): return 1/(1+np.exp(-x))def N(mean, cov, n): return np.matrix(np.random.multivariate_normal(mean, cov, n))# Datan = 100mean_1, cov_1 = [3,3], [[0.7,-0.3],[0.3,0.5]]mean_2, cov_2 = [1,2], [[0.5,0.3],[0.3,0.5]]X_1, X_2 = N(mean_1, cov_1, n), N(mean_2, cov_2, n) # (100, 2)X = np.vstack((X_1, X_2)) # (200, 2)Ts = np.vstack((np.zeros((n, 1)), np.ones((n, 1)))) # (200, 1)Xs = np.hstack((X, np.ones((n*2,1)))) # (200, 3)# Parametersw = np.matrix(np.random.rand(np.size(Xs,1))).T # (3, 1)alpha = 1e-2# Trainloss = []epochs = 10000for i in range(epochs): Ys = sig(Xs@w) loss += [1/(n*2) * ([email protected](Ys) -(1-Ts.T)@np.log(1-Ys)).item()] grad = Xs.T@(Ys-Ts) w -= alpha/(n*2) * grad# plot lossplot_loss = Falseif plot_loss: plt.plot(range(len(loss)), loss) plt.title("Convergence of loss") plt.xlabel('Epochs') plt.ylabel('Loss')# plot dataplot_data = Trueif plot_data: plt.scatter([X_1[:,0]],[X_1[:,1]], color="b") plt.scatter([X_2[:,0]],[X_2[:,1]], color="r") plt.title("Data") plt.xlabel('Feature 1') plt.ylabel('Feature 2')# plot decision boundaryplot_db = Trueif plot_db: x = np.linspace(-1, 6, 1000) y = (-(w[0]+w[1].item()*x)/w[2]).T plt.plot(x,y,"r")plt.show()
回答:
问题出在与特征向量拼接的ones
向量上。将它与特征向量交换,并按照上面的代码绘制边界,就可以得到正确的边界。