Как построить плавную границу решения для двоичного классификатора с помощью нейронной сети?Python

Программы на Python
Ответить
Anonymous
 Как построить плавную границу решения для двоичного классификатора с помощью нейронной сети?

Сообщение Anonymous »

Я пытаюсь реализовать простую нейронную сеть для классификации кругового набора данных и построения плавной границы решения. Однако граница моего решения не является гладкой или неправильной. Я хочу, чтобы это выглядело как граница, показанная в этом примере:
вот так
Когда я запускаю код, граница решения неровная или не соответствует форме. моего набора данных. Я ожидаю плавную кривую, окружающую внутренний класс.
это мой код:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles

# Generate dataset
X, y = make_circles(n_samples=100, noise=0.1, factor=0.3, random_state=0)
X = X.T # Transpose X
y = y.reshape((1, y.shape[0])) # Reshape y to row vector

# Visualization of the dataset
plt.scatter(X[0, :], X[1, :], c=y.flatten())
plt.title('Dataset')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

def paramètres(n0=2, n1=2, n2=1):
W1 = np.random.randn(n1, n0)
b1 = np.zeros((n1, 1))
W2 = np.random.randn(n2, n1)
b2 = np.zeros((n2, 1))
parametres = {
'W1': W1,
'b1': b1,
'W2': W2,
'b2': b2
}
return parametres

def G(X, theta, b):
Z = theta.dot(X) + b
return Z, 1/(1+np.exp(-Z))

def forwardPropagation(X, parametres):
W1 = parametres['W1']
b1 = parametres['b1']
W2 = parametres['W2']
b2 = parametres['b2']

Z1, A1 = G(X, W1, b1)
Z2, A2 = G(A1, W2, b2)

activations = {
'A1': A1,
'A2': A2
}
return activations

def backPropagation(X, y, parametres, activations):
A1 = activations['A1']
A2 = activations['A2']
W2 = parametres['W2']

m = y.shape[1]

dZ2 = A2 - y
dW2 = 1 / m * dZ2.dot(A1.T)
db2 = 1 / m * np.sum(dZ2, axis=1, keepdims=True)

dZ1 = np.dot(W2.T, dZ2) * A1 * (1 - A1)
dW1 = 1 / m * dZ1.dot(X.T)
db1 = 1 / m * np.sum(dZ1, axis=1, keepdims=True)

gradients = {
'dW1': dW1,
'db1': db1,
'dW2': dW2,
'db2': db2
}

return gradients

def update(gradients, parametres, learning_rate):
W1 = parametres['W1']
b1 = parametres['b1']
W2 = parametres['W2']
b2 = parametres['b2']

dW1 = gradients['dW1']
db1 = gradients['db1']
dW2 = gradients['dW2']
db2 = gradients['db2']

W1 = W1 - learning_rate * dW1
b1 = b1 - learning_rate * db1
W2 = W2 - learning_rate * dW2
b2 = b2 - learning_rate * db2

parametres = {
'W1': W1,
'b1': b1,
'W2': W2,
'b2': b2
}

return parametres

def predict(X, parametres):
activations = forwardPropagation(X, parametres)
return activations['A2']

def neural_network(X, y, n1=2, learning_rate=0.1, n_iter=1000):
n0 = X.shape[0]
n2 = y.shape[0]
np.random.seed(0)
parametres = paramètres(n0, n1, n2)

for i in range(n_iter):
activations = forwardPropagation(X, parametres)
gradients = backPropagation(X, y, parametres, activations)
parametres = update(gradients, parametres, learning_rate)

return parametres, activations

# Train the model
parametres, activations = neural_network(X, y, n1=2, learning_rate=0.1, n_iter=1000)

# Plot decision boundary
x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))

Z = predict(np.c_[xx.ravel(), yy.ravel()].T, parametres)
Z = Z.reshape(xx.shape)

plt.figure()
plt.contourf(xx, yy, Z, levels=[0, 0.5, 1], alpha=0.8, cmap=plt.cm.RdYlBu)
plt.scatter(X[0, :], X[1, :], c=y.flatten(), cmap=plt.cm.RdYlBu)
plt.title('Decision Boundary')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()


Подробнее здесь: https://stackoverflow.com/questions/792 ... -neural-ne
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»