使用机器学习/人工智能预测给定随机递增整数序列中的下一个数字 (n+1)

人工智能 神经网络 机器学习 训练 Python
2021-11-06 09:42:18

AI 必须使用 Python 预测给定增量整数序列中的下一个数字(没有明显的模式),但到目前为止我还没有得到预期的结果!我尝试改变学习率和迭代,但到目前为止没有运气!

示例序列:[1, 3, 7, 8, 21, 49, 76, 224]

预期结果:467

找到的结果:2,795.5

费用:504579.43

这是我到目前为止所做的:

import numpy as np

# Init sequence
data =\
    [
        [0, 1.0], [1, 3.0], [2, 7.0], [3, 8.0],
        [4, 21.0], [5, 49.0], [6, 76.0], [7, 224.0]
    ]

X = np.matrix(data)[:, 0]
y = np.matrix(data)[:, 1]

def J(X, y, theta):
    theta = np.matrix(theta).T
    m = len(y)
    predictions = X * theta
    sqError = np.power((predictions-y), [2])
    return 1/(2*m) * sum(sqError)

dataX = np.matrix(data)[:, 0:1]
X = np.ones((len(dataX), 2))
X[:, 1:] = dataX

# gradient descent function
def gradient(X, y, alpha, theta, iters):
    J_history = np.zeros(iters)
    m = len(y)
    theta = np.matrix(theta).T
    for i in range(iters):
        h0 = X * theta
        delta = (1 / m) * (X.T * h0 - X.T * y)
        theta = theta - alpha * delta
        J_history[i] = J(X, y, theta.T)
     return J_history, theta
print('\n'+40*'=')

# Theta initialization
theta = np.matrix([np.random.random(), np.random.random()])

# Learning rate
alpha = 0.02

# Iterations
iters = 1000000

print('\n== Model summary ==\nLearning rate: {}\nIterations: {}\nInitial 
theta: {}\nInitial J: {:.2f}\n'
  .format(alpha, iters, theta, J(X, y, theta).item()))
print('Training model... ')

# Train model and find optimal Theta value
J_history, theta_min = gradient(X, y, alpha, theta, iters)
print('Done, Model is trained')
print('\nModelled prediction function is:\ny = {:.2f} * x + {:.2f}'
  .format(theta_min[1].item(), theta_min[0].item()))
print('Cost is: {:.2f}'.format(J(X, y, theta_min.T).item()))

# Calculate the predicted profit
def predict(pop):
    return [1, pop] * theta_min

# Now
p = len(data)
print('\n'+40*'=')
print('Initial sequence was:\n', *np.array(data)[:, 1])
print('\nNext numbers should be: {:,.1f}'
  .format(predict(p).item()))

更新我尝试过的另一种方法但仍然给出错误的结果

import numpy as np
from sklearn import datasets, linear_model

# Define the problem
problem = [1, 3, 7, 8, 21, 49, 76, 224]

# create x and y for the problem

x = []
y = []

for (xi, yi) in enumerate(problem):
    x.append([xi])
    y.append(yi)

x = np.array(x)
y = np.array(y)
# Create linear regression object
regr = linear_model.LinearRegression()
regr.fit(x, y)

# create the testing set
x_test = [[i] for i in range(len(x), 3 + len(x))]

# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean squared error
print("Mean squared error: %.2f" % np.mean((regr.predict(x) - y) ** 2))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % regr.score(x, y))

# Do predictions
y_predicted = regr.predict(x_test)

print("Next few numbers in the series are")
for pred in y_predicted:
    print(pred)
2个回答

我认为您的代码可以正常工作 - 拟合线性回归模型。这里的问题是您使用的是线性模型。线性模型没有足够的逼近能力,它只能拟合由线性函数描述的数据。在这里,您给出了一个随机数字序列,线性模型很难近似。我建议你尝试两件事:

1)先尝试一些更简单的东西。而不是做一个随机的数字序列,而是做一个线性的数字序列,例如一个像这样的函数y=2x或者可能是仿射函数y=2x+5. 所以你会有一个像这样的序列:

2,4,6,8...或者7,9,11,13,...

如果您设法使该工作正常工作,请尝试使用非线性函数,例如x2例如。

2) 尝试非线性模型,而不是使用线性模型。例如多项式回归模型。特别强大的函数逼近器是神经网络。理论上,具有单个隐藏层的神经网络可以在某些条件下逼近任意连续函数(通用逼近定理),因此您可以尝试查看神经网络如何解决问题,您可以使用几个开源神经网络库可以试试。

就像其他人说的那样,你不能用线性回归模型来近似这个。

近似解决方案的 PRM 可以为您提供以下信息:
y=0.948+x+0.00085x6~
y=237/250+x+(17/20000)x6
为了x=9,y462

或者

y=0.9258+x+0.00086x6 为了x=9,y466.965

UPDATE
当然,近似值可能在以下范围内:
y=2(x+1)2x-您提出的模型-
Goodness of fit: 0.968475 and Mean Square Error = 685.111

基于此范围,更好的近似值是:
y=2x+(1/2)x2
R2
Goodness of fit = 0.995
Mean Square Error: 89.0278