0
点赞
收藏
分享

微信扫一扫

'''实验1 只有温度和时间 每个物料的初始温度和初始时间不一样 无分类变量需转为读热编码'''

芥子书屋 2023-10-04 阅读 39

'''目标:拟合物料冷却规律
分类变量:物料规格,冷却方式
连续变量:温度,时间
其他因素:车间温度
现实因素:初始温度,初始时间
需求因素:目标温度的时间,目标温度的时长(时间-初始时间),当前时间的温度
不加入分类变量则为单个线性模型'''

'''实验1 只有温度和时间
每个物料的初始温度和初始时间不一样
无分类变量需转为读热编码'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

'''
# 生成数据
temperature = np.array([300, 200, 100, 10])
time = np.array([np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 20:00:00')])
time_initial = time[0]
temperature_initial = temperature[0]

# 转为与初始时间和初始温度比较,未做归一化(离差标准化),标准化等处理
# 这样, 所有的线性模型的初始自变量和初始因变量都是0,在第四象限大体呈递减状
# 模型拟合完成后,需要预测时,再分别加上初始时间和初始温度即可
x = time - time_initial
Y = temperature - temperature_initial

# 每个物料都有各自的初始时间和初始温度
# 生成数据,转化数据
# array内部长度不一需指定dtype
# 使用pandas生成面板数据以供筛选
'''

# 生成数据,转化数据
panel_data = pd.DataFrame(
    {
        'material': ['materila_1']*3 + ['material_2']*4 + ['material_3']*5,
        'time': 
            [np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 18:00:00')] +
            [np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 20:00:00')] +
            [np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 06:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 16:00:00'), np.datetime64('2023-01-01 21:00:00')],
        'temperature': [250, 150, 20] + [300, 200, 100, 10] + [310, 200, 90, 50, 5]
    }
)
panel_data.set_index(['material'], inplace=True)  # 若无这一步,下一步会报错
panel_data['time_initial'] = panel_data.groupby(['material']).apply(lambda x: x['time'][0])
panel_data['temperature_initial'] = panel_data.groupby('material').apply(lambda x: x['temperature'][0])
panel_data['x'] = panel_data['time'] - panel_data['time_initial']
panel_data['Y'] = panel_data['temperature'] - panel_data['temperature_initial']
panel_data.set_index([panel_data.index, 'time_initial', 'temperature_initial', 'time'], inplace=True)

# 汇总拟合
# 分组预测

X = panel_data['x'].dt.total_seconds().values.reshape(-1, 1)
Y = panel_data['Y']
linear_model = LinearRegression()
linear_model.fit(X, Y)
Y_pred = linear_model.predict(X)

plt.scatter(X, Y, label='Linear Regression Actual Data')
plt.plot(X, Y_pred, color='red', label='Linear Regression Prediction')
plt.xlabel('Time Difference')
plt.ylabel('Temperature Difference')
plt.title(f"Linear Regression Prediction Formula: Y_pred = {linear_model.coef_[0]:.4f} * X + {linear_model.intercept_:.4f}")
plt.legend()
plt.show()

panel_data['Y_pred'] = linear_model.predict(X)
panel_data['temperature_pred'] = panel_data['Y_pred'].values + panel_data.reset_index()['temperature_initial'].values
panel_data

temperature

x

Y

Y_pred

temperature_pred

material

time_initial

temperature_initial

time

materila_1

2023-01-01

250

2023-01-01 00:00:00

250

0 days 00:00:00

0

-7.548712

242.451288

2023-01-01 07:00:00

150

0 days 07:00:00

-100

-108.984915

141.015085

2023-01-01 18:00:00

20

0 days 18:00:00

-230

-268.384664

-18.384664

material_2

2023-01-01

300

2023-01-01 00:00:00

300

0 days 00:00:00

0

-7.548712

292.451288

2023-01-01 07:00:00

200

0 days 07:00:00

-100

-108.984915

191.015085

2023-01-01 12:00:00

100

0 days 12:00:00

-200

-181.439346

118.560654

2023-01-01 20:00:00

10

0 days 20:00:00

-290

-297.366436

2.633564

material_3

2023-01-01

310

2023-01-01 00:00:00

310

0 days 00:00:00

0

-7.548712

302.451288

2023-01-01 06:00:00

200

0 days 06:00:00

-110

-94.494029

215.505971

2023-01-01 12:00:00

90

0 days 12:00:00

-220

-181.439346

128.560654

2023-01-01 16:00:00

50

0 days 16:00:00

-260

-239.402891

70.597109

2023-01-01 21:00:00

5

0 days 21:00:00

-305

-311.857322

-1.857322

panel_data['Y_pred']

material    time_initial  temperature_initial  time               
materila_1  2023-01-01    250                  2023-01-01 00:00:00     -7.548712
                                               2023-01-01 07:00:00   -108.984915
                                               2023-01-01 18:00:00   -268.384664
material_2  2023-01-01    300                  2023-01-01 00:00:00     -7.548712
                                               2023-01-01 07:00:00   -108.984915
                                               2023-01-01 12:00:00   -181.439346
                                               2023-01-01 20:00:00   -297.366436
material_3  2023-01-01    310                  2023-01-01 00:00:00     -7.548712
                                               2023-01-01 06:00:00    -94.494029
                                               2023-01-01 12:00:00   -181.439346
                                               2023-01-01 16:00:00   -239.402891
                                               2023-01-01 21:00:00   -311.857322
Name: Y_pred, dtype: float64

举报

相关推荐

0 条评论