%pylab inline
import torch
x = torch.rand([1000,2])
scatter(*x.numpy().T)
axis('equal')
x_in_circle = (x**2).sum(1) < 1
scatter(*x.numpy().T, c=x_in_circle.numpy())
axis('equal')
weights = torch.as_tensor([1,1], dtype=torch.float)
bias = torch.as_tensor(-1, dtype=torch.float)
def classify(x, weights, bias):
return (x * weights[None,:]).sum(dim=1) + bias > 0
def accuracy(pred_label):
return (pred_label==x_in_circle).float().mean()
def show(y):
scatter(*x.numpy().T, c=y.detach().numpy())
axis('equal')
pred_y = classify(x, weights, bias)
show(pred_y)
print('accuracy', accuracy(pred_y))
def predict(x, weights, bias):
logit = (x * weights[None,:]).sum(dim=1) + bias
return 1/(1+(-logit).exp())
def loss(prediction):
return -(x_in_circle.float() * (prediction+1e-10).log() +
(1-x_in_circle.float()) * (1-prediction+1e-10).log() ).mean()
p_y = predict(x, weights, bias)
print( 'loss =', loss(p_y), 'accuracy =', accuracy(pred_y) )
weights = torch.as_tensor([-1,-1], dtype=torch.float)
bias = torch.as_tensor(1.0, dtype=torch.float)
pred_y = classify(x, weights, bias)
p_y = predict(x, weights, bias)
show(pred_y)
print( 'loss =', loss(p_y), 'accuracy =', accuracy(pred_y) )
weights = torch.as_tensor([-1,-1], dtype=torch.float)
bias = torch.as_tensor(1.2, dtype=torch.float)
pred_y = classify(x, weights, bias)
p_y = predict(x, weights, bias)
show(pred_y)
print( 'loss =', loss(p_y), 'accuracy =', accuracy(pred_y) )