Я сделал алгоритм прогнозирования, используя данные с этого сайта: http://archive.ics.uci.edu/ml/datasets/Concrete+Slump+Test
Ярлык для набора данных: http://archive.ics.uci.edu/ml/machine-learning-databases/concrete/slump/slump_test.data
Вот код:
import numpy as np
class Gradient:
def __init__(self,dataIn,dataOut): #constructor
self.dataIn=dataIn
self.dataOut=dataOut
def constructCoeffMatrix(self): #we have 7 features for each data row so we have to initialize 7+1(free) coefficient which will later be learnt
l=np.random.rand(8,1)
l=np.array(l)
return l
def constructInputMatrix(self): #data initialy given as bidimensional list
input=self.dataIn
#standardization
for i in range(len(input)):
for j in range(len(input[i])):
input[i][j]=input[i][j]/1000
for i in range(len(input)):#our vectors are in the form of (1,x) (1 for the free scalar coeff)
input[i] = [1] + input[i]
Matrix=np.array(input)
return Matrix
def constructOutMatrix(self):
out=self.dataOut
Matrix=np.array(out)
#standardization
return np.multiply(Matrix,1.0/1000)
#gradient function
def gradientDescent(self,x, y, theta, alpha, num_iters): #BGD , the cost function is 1/2m sum_1,m (y_hat-y)^2
"""
Performs gradient descent to learn theta
"""
m = y.size # number of training examples
for i in range(num_iters):
y_hat = np.dot(x, theta)
theta = theta - alpha * (1.0 / m) * np.dot(x.T, y_hat - y)
return theta
def run_gradient(self):
maxiter=1000
input=self.constructInputMatrix()
out=self.constructOutMatrix()
coef=self.constructCoeffMatrix()
learning_rate=0.05
return self.gradientDescent(input,out,coef,learning_rate,maxiter)
def model(self,input):
input[0]=[1]+input[0]
input=np.array(input)
res = input.dot(self.run_gradient())
return res
Как видите, для каждого примера есть 7 входных функций и 3 выходных числа. В моем коде я взял для простоты только один выходной столбец, поэтому в основном dataOut - это список n на 1 (представляющий спад, поток или силу).
Я надеюсь, что это легко понять, я добавил комментарии, объясняющие каждую функцию, дело в том, что ... результаты тестов полностью мусорные, в целом они просто слишком велики, если я ожидаю, что число между (0,100 ), прогнозируемое значение будет более 500, я даже получил отрицательные результаты, что смешно.
Я пытался не использовать стандартизацию, но ошибка будет переходить от милиона к -миллиону к миллиарду к -биллиону, а затем к + -инф и "нан", поэтому каждое предсказание будет "нан". Деление всего на 1000, по крайней мере, дает меньше, чем миллионы ..