Lets mock some data up.
"100 numbers, each one is a parameter, they together define a number X(also given)"
# i.e. size of X_train -> [n x d]
# i.e. size of X_train -> [??? x 100] , when d = 100
# "I have 20000 instances for training"
# i.e. size of X_train -> [20000 x 100], when n = 20000
import torch
import numpy as np
X_train = torch.rand((20000, 100))
X_train = np.random.rand(20000, 100) # Or using numpy
But what is your Y?
# Since the definition of a regression task,
# loosely means to predict an output real number
# given an input of d dimension
# So the appropriate Y_train would
# be of dimension [n x 1]
# and look like this:
y_train = torch.rand((20000, 1))
y_train = np.random.rand(20000, 1) # Or using numpy
What is a linear perceptron?
Taking definition from this tutorial
Thus, in picture:
Next we need to define training routine,
For now take it as biblical truth that this is an okay routine to train a neural net model (this isn't the only way but easiest or supervised learning):
In code:
import math
import numpy as np
np.random.seed(0)
def sigmoid(x): # Returns values that sums to one.
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(sx):
# See https://math.stackexchange.com/a/1225116
# Hint: let sx = sigmoid(x)
return sx * (1 - sx)
def cost(predicted, truth):
return np.abs(truth - predicted)
num_epochs = 10000 # No. of times to iterate.
learning_rate = 0.03 # How large a step to take per iteration.
# Lets standardize and call our inputs X and outputs Y
X = np.array(torch.rand((20000, 100)))
Y = or_output
for _ in range(num_epochs):
layer0 = X
# Step 2a: Multiply the weights vector with the inputs, sum the products, i.e. s
# Step 2b: Put the sum through the sigmoid, i.e. f()
# Inside the perceptron, Step 2.
layer1 = sigmoid(np.dot(X, W))
# Back propagation.
# Step 3a: Compute the errors, i.e. difference between expected output and predictions
# How much did we miss?
layer1_error = cost(layer1, Y)
# Step 3b: Multiply the error with the derivatives to get the delta
# multiply how much we missed by the slope of the sigmoid at the values in layer1
layer1_delta = layer1_error * sigmoid_derivative(layer1)
# Step 3c: Multiply the delta vector with the inputs, sum the product (use np.dot)
# Step 4: Multiply the learning rate with the output of Step 3c.
W += learning_rate * np.dot(layer0.T, layer1_delta)
Now that we learn the model, i.e. the W
.
When we see the data points that we need to use the model on, we apply the same forward propagation step, i.e. layer1 = sigmoid(np.dot(X, W))
Since we have:
I have 5000 lines given, each containing the 100 numbers as parameters.My task is to predict the number X for these 5000 instances.
And in code:
# If we mock up the data,
# it should be the same internal dimension.
X_test = np.random.rand(5000, 100)
# The desired output just needs to pass through the W and the activation:
# the shape of `output` -> [5000 x 1] ,
# where there's 1 output value for each input.
output = sigmoid(np.dot(X_test, W))