Я знаю, что есть множество вопросов, но это не сработает. Я хочу построить границу решения регрессионной модели логистики c. Но мое решение границы границы далеко не так, как ожидалось. Я не нарисовал новые данные для проверки классификатора, однако моя потеря выглядит так, как ожидалось, и хорошо сходится. Пожалуйста, найдите мой код ниже.
Edit1: Сейчас я попробовал пару решений и способов построить границу решения, и она всегда выглядит одинаково, поэтому, должно быть, что-то не так с моим параметры. У кого-то есть идея, что это может быть?
Edit2: Из-за разочарования я случайно изменил параметры границы решения на y = (-(w[2]+w[0].item()*x)/w[1]).T
, и теперь он работает. Кто-то знает, почему у меня их два закрутилось?
Вот что я получу. Что я делаю не так?
import numpy as np
import matplotlib.pyplot as plt
def sig(x):
return 1/(1+np.exp(-x))
def N(mean, cov, n):
return np.matrix(np.random.multivariate_normal(mean, cov, n))
# Data
n = 100
mean_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)
# Parameters
w = np.matrix(np.random.rand(np.size(Xs,1))).T # (3, 1)
alpha = 1e-2
# Train
loss = []
epochs = 10000
for i in range(epochs):
Ys = sig(Xs@w)
loss += [1/(n*2) * (-Ts.T@np.log(Ys) -(1-Ts.T)@np.log(1-Ys)).item()]
grad = Xs.T@(Ys-Ts)
w -= alpha/(n*2) * grad
# plot loss
plot_loss = False
if plot_loss:
plt.plot(range(len(loss)), loss)
plt.title("Convergence of loss")
plt.xlabel('Epochs')
plt.ylabel('Loss')
# plot data
plot_data = True
if 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 boundary
plot_db = True
if 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()