使用灰色预测模型和马尔科夫模型进行预测的Python代码的具体实例
时间: 2023-12-03 12:43:12 浏览: 282
以下是一个使用灰色预测模型和马尔科夫模型进行预测的Python代码示例:
```
import numpy as np
from sklearn.metrics import mean_squared_error
# 灰色预测模型
def GM11(x0):
# 累加生成序列
x1 = np.cumsum(x0)
z1 = (x1[:-1] + x1[1:]) / 2.0
# 紧邻均值平滑处理
z1 = z1.reshape((len(z1), 1))
B = np.append(-z1, np.ones_like(z1), axis=1)
Y = x0[1:].reshape((len(x0) - 1, 1))
# 计算参数
[[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)
# 建立灰色预测模型
model = lambda k: (x0[0] - b / a) * np.exp(-a * (k - 1)) - (x0[0] - b / a) * np.exp(-a * (k - 2))
# 预测结果
predict = np.array([model(i) for i in range(1, len(x0) + 5)])
return predict
# 马尔科夫模型
def markov_predict(data, n_steps=5, split_ratio=0.8):
# 数据切分
train_size = int(len(data) * split_ratio)
train_data = data[:train_size]
test_data = data[train_size:]
# 建立状态转移矩阵
states = sorted(list(set(train_data)))
n_states = len(states)
state_idx = {states[i]: i for i in range(n_states)}
trans_matrix = np.zeros((n_states, n_states))
for i in range(len(train_data) - 1):
cur_state = state_idx[train_data[i]]
next_state = state_idx[train_data[i + 1]]
trans_matrix[cur_state][next_state] += 1
for i in range(n_states):
row_sum = sum(trans_matrix[i])
if row_sum > 0:
trans_matrix[i] /= row_sum
# 预测
last_state = state_idx[train_data[-1]]
predict_probs = np.dot(np.linalg.matrix_power(trans_matrix, n_steps), trans_matrix[last_state])
predict = states[np.argmax(predict_probs)]
return predict
# 示例数据
data = np.array([120, 130, 135, 140, 145, 150, 155, 160, 165, 170])
# 灰色预测
gm_predict = GM11(data)
# 马尔科夫模型预测
markov_predicts = []
for i in range(len(data) - 1):
markov_predicts.append(markov_predict(data[:i+1]))
markov_rmse = np.sqrt(mean_squared_error(data[1:], markov_predicts))
print('马尔科夫模型RMSE:', markov_rmse)
# 输出结果
print('原始数据:', data)
print('灰色预测结果:', gm_predict)
print('马尔科夫模型预测结果:', markov_predicts)
```
上述代码中,使用了`GM11`函数实现了灰色预测模型,该函数接受一个原始数据序列作为输入,并输出预测结果序列。使用`markov_predict`函数实现了马尔科夫模型,该函数接受一个原始数据序列、预测步数和数据切分比例作为输入,并输出预测结果。在示例中,分别对原始数据进行了灰色预测和马尔科夫模型预测,并输出了预测结果。
阅读全文