基于机器学习算法对电动汽车续驶里程进行估计

该文探讨了影响电动汽车续驶里程的因素,通过数据收集和分析发现SOC(荷电状态)和总电压是关键因素。建立了多元线性回归模型,并通过残差分析验证模型的准确性。为提高预测精度,采用KNN回归模型,利用线性模型的残差作为特征,结果显示KNN模型的R2达到0.999,均方误差为0.0798,表现优于多元线性回归。然而,模型对于超出训练数据范围的长距离续驶里程预测可能存在误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概论

  本文主要通过采集大量的数据,通过对数据进行处理分析,发现SOC和总电压是影响续驶里程的主要原因。从线性关系出发,建立了SOC、总电压和续驶里程的多元线性回归。为了提高模型的准确性,将线性模型中计算得到的残差作为一个新的特征,KNN回归预测模型具有更高的精度,弥补了多元线性回归模型的不足。

2.多元线性模型

2.1模型介绍

  在回归模型y=a+bx+c 中,假定c的期望值为0,方差相等且服从正态分布的一个随机变量。但是,若关于c的假定不成立,此时所做的检验以及估计和预测也许站不住脚。确定有关c的假定是否成立的方法之一是进行残差分析(residual analysis)

2.2相关性分析

with open(csv_name) as csvfile:
    csv_data = pd.read_csv(csvfile)  # header=1默然不读取表头
    csv_data.dropna(inplace=True, subset=['SOC', '总电压'])  # 删除SOC为缺失值的行
    csv_data.reset_index(drop=True, inplace=True)

ls = []
ls_son = []
"""
根据充电状态来进行数据分割,一个放电过程作为一个样本,放入ls列表中
"""
for i in range(csv_data.shape[0]):
    if csv_data['充电状态'][i] == 3 and csv_data['累计里程'][i] != None:
        if np.isnan(csv_data['累计里程'][i]):
            continue
        ls_son.append(i)
    elif csv_data['充电状态'][i] == 1:
        # 数据量大于300加入列表
        if len(ls_son) > 300:
            ls.append(ls_son)
        ls_son = []
mileage_soc_corr_list=[]
u_soc_corr_list=[]
for index in ls:
    # 获取每一个样本
    data = csv_data.iloc[index, :]
    data.reset_index(drop=True, inplace=True)
    data['累计里程'] = abs(data['累计里程'] - data['累计里程'].tolist()[-1])
    data['SOC'] = abs(data['SOC'] - data['SOC'].tolist()[-1])
    mileage_soc_corr_list.append(data['累计里程'].corr(data['SOC']))
    u_soc_corr_list.append(data['累计里程'].corr(data['总电压']))
    s1 = []
    s2 = []
    for i in range(len(index)):
        s1.append(float(data['SOC'].tolist()[i] - data['SOC'].tolist()[-1]) / 0.75)
        s2.append(float(data['SOC'].tolist()[i] - data['SOC'].tolist()[-1]) / 1.75)

    data_new={'最大里程':s1,
              '最小里程':s2,
              '总电压':data['总电压'].tolist(),
              '实际里程':data['累计里程'].tolist()}
    data_new=pd.DataFrame(data_new)
    data_new.to_csv('里程.csv', mode='a', header=False)
plt.subplot(211)
plt.plot(range(len(mileage_soc_corr_list)), mileage_soc_corr_list)
plt.ylabel('correlation')
plt.title('mileage&SoC correlation')
plt.subplot(212)
plt.plot(range(len(u_soc_corr_list)), u_soc_corr_list)
plt.xlabel('sample')
plt.ylabel('correlation')
plt.title('mileage&U correlation')
plt.show()

在这里插入图片描述
  以上为每个样本中SOC和总电压与续驶里程的相关性,可以发现续驶里程和SOC、总电压有很高的相关性。

2.3模型构建

data = pd.read_csv('../data/U_SOC_mileage.csv')
print(data.head())
x = data.iloc[:, 0:2]
y = data.iloc[:, 2:]
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8, random_state=6)
# 标准化处理
x_stand = StandardScaler()
x_train = x_stand.fit_transform(x_train)
x_test = x_stand.transform(x_test)

linear = LinearRegression()
linear.fit(x_train, y_train)
y_pre = linear.predict(x_test)

mse = np.sqrt(mean_squared_error(y_test, y_pre))
print("参数:", linear.coef_)
print("截距:", linear.intercept_)
print('均方误差:', mse)
print('测试集评分:', r2_score(y_test, y_pre))
x_index = [i for i in range(x_test.shape[0])]
plt.figure()
plt.title('predict mileage')
plt.plot(x_index[2000:2100], y_test[2000:2100], c='r', label="True value")
plt.plot(x_index[2000:2100], y_pre[2000:2100], c='g', label="Predict value")
plt.xlabel('sample')
plt.ylabel('mileage')
plt.legend(loc="best")
plt.show()

在这里插入图片描述
  多元线性模型为y=3.99U+6.68SOC+18.6,其中R2为0.912,均方误差为3.102。

2.4残差分析

  通过标准化残差,对c进行正态性检验。标准化残差(standardized residual)是残差除以其标准差后得到的数值,也称Pearson残差或半学生化残差(semi-studentized residuals)。通过计算,大约有97.5%的标准化残差在-2到2之间,所以c符合正态性这一假设。并且抽取部分数据进行展示。

resids = outliers.resid_studentized_external
ls=[1   if i>=-2 and i<=2 else 0 for i in resids]
print(np.sum(ls)/len(ls))
plt.scatter(y_predict[1000:1100], resids[1000:1100])
plt.xlabel('y_predict')
plt.ylabel('resid')
plt.axhline(y=2, color='r', linestyle='--')
plt.axhline(y=-2, color='r', linestyle='--')
plt.show()

在这里插入图片描述

3.KNN回归预测模型

3.1模型介绍

  基于最邻近算法的分类,本质上是对离散的数据标签进行预测,实际上,最邻近算法也可以用于对连续的数据标签进行预测,这种方法叫做基于最邻近数据的回归,预测的值(即数据的标签)是连续值,通过计算数据点最临近数据点平均值而获得预测值。

3.2模型构建

data=pd.read_csv('../data/res_mile.csv')
x = data.iloc[:, 0:3]
y = data.iloc[:, 3:]
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8, random_state=6)
# 标准化处理
x_stand = StandardScaler()
x_train = x_stand.fit_transform(x_train)
x_test = x_stand.transform(x_test)

kr = KNeighborsRegressor(n_neighbors=12)
kr.fit(x_train, y_train)
y_pre = kr.predict(x_test)
mse = np.sqrt(mean_squared_error(y_test, y_pre))
print('均方误差:', mse)
print('测试集评分:', r2_score(y_test, y_pre))
x_index = [i for i in range(x_test.shape[0])]
plt.figure()
plt.title('predict mileage')
plt.plot(x_index[2300:2400], y_test[2300:2400], c='r', label="True value")
plt.plot(x_index[2300:2400], y_pre[2300:2400], c='g', label="Predict value")
plt.xlabel('sample')
plt.ylabel('mileage')
plt.legend(loc="best")
plt.show()

在这里插入图片描述
  基于多元线性回归模型计算得到的残差,结合SOC和总电压对续驶里程进行预测,最终R2为0.999,均方误差为0.0798

4.问题

  模型应用的时候,残差无法得知,只能知道一个大致的范围。
  机器学习主要是在某一个数据集上面建立算法,不断的优化,但不一定适用于其他数据集,有区别于数据挖掘。
  数据集中的续驶里程大概在0~70的范围内,对更远距离的预测可能会存在一定的误差。

这个错误是由于无法连接到本地主机的10248端口导致的。这个端口通常是kubelet进程监听的端口,用于健康检查。出现这个错误可能是由于kubelet进程没有正确启动或者配置错误导致的。 解决这个问题的方法是检查kubelet进程的状态和配置。你可以按照以下步骤进行操作: 1. 检查kubelet进程是否正在运行。你可以使用以下命令检查kubelet进程的状态: ```shell systemctl status kubelet ``` 如果kubelet进程没有运行,你可以使用以下命令启动它: ```shell systemctl start kubelet ``` 2. 检查kubelet的配置文件。你可以使用以下命令查看kubelet的配置文件路径: ```shell kubelet --kubeconfig /etc/kubernetes/kubelet.conf --config /var/lib/kubelet/config.yaml --bootstrap-kubeconfig /etc/kubernetes/bootstrap-kubelet.conf config view ``` 确保配置文件中的端口号和地址正确,并且与你的环境相匹配。 3. 检查网络连接。你可以使用以下命令检查是否可以连接到localhost的10248端口: ```shell curl -sSL http://localhost:10248/healthz ``` 如果无法连接,请确保端口没有被防火墙或其他网络配置阻止。 4. 检查docker的配置。有时候,kubelet进程依赖于docker进程。你可以按照以下步骤检查docker的配置: - 创建/etc/docker目录: ```shell sudo mkdir /etc/docker ``` - 编辑/etc/docker/daemon.json文件,并添加以下内容: ```json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "registry-mirrors": ["https://tdhp06eh.mirror.aliyuncs.com"] } ``` - 重启docker进程: ```shell systemctl restart docker ``` 请注意,以上步骤是一种常见的解决方法,但具体解决方法可能因环境而异。如果以上步骤无法解决问题,请提供更多的错误信息和环境配置,以便我们能够更好地帮助你。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

being蓓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值