scipy.optimize.minimize()最优化函数失效问题

       在使用minimize()函数最优化时,有时候会遇到输出的解和设定的初始值一样,即似乎该函数失效了,并没有求出最优的解。对于这种情况,很可能是因为误差容忍度的设置问题。对于最优化,其利用的数值算法是有停止条件的,不可能一直运算下去,其中误差容忍度就是这个停止条件,即当两次值的差值小于这个容忍度的时候,其就会停止运算,返回结果了。因此,对于这种情况,有可能是目标函数值太小,甚至已经小于了容忍度,这样刚开始运算就停止了,就会让人误以为是函数失效了。对此解决办法有两个,一是重新设置容忍度,即minimize()的tol参数,把其设的小一点,比如你的目标函数值再1e-5左右,则你可以设为1e-8或1e-10之类的,其默认值似乎是1e-5还是1e-6;第二个办法是加大你的目标函数值的尺度,比如乘以1e5或1e6之类的。总之只要保证你的目标函数值和tol相差一定的数量级即可,具体的数量级取决于你对误差的要求,一般5个左右的数量级就可以了。

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score from scipy.optimize import minimize import matplotlib.pyplot as plt from pathlib import Path # ------------------ 数据预处理 ------------------ # 设置文件路径 excel_path = Path("C:/Users/Administrator/Desktop/augmented_data3.xlsx") # 读取数据 data = pd.read_excel(excel_path, sheet_name='Sheet1') # 特征工程处理 # 检查并转换分类变量(仅对真正需要编码的列进行处理) cat_cols = [] le = LabelEncoder() # 假设'燃尽风位置'是分类变量,进行编码 if data['燃尽风位置'].dtype == 'object': data['燃尽风位置'] = le.fit_transform(data['燃尽风位置']) cat_cols.append('燃尽风位置') # 确保温度保持为连续数值(移除之前的字符串转换) X = data[['掺氨比', '过量空气系数', '燃尽风位置', '主燃区温度']] y = data['NO排放浓度'] def iqr_outlier_removal(df, cols, factor=1.5): """基于IQR的离群值过滤""" for col in cols: Q1 = df[col].quantile(0.25) Q3 = df[col].quantile(0.75) print(f"{col}边界值: [{Q1 - factor*(Q3-Q1):.2f}, {Q3 + factor*(Q3-Q1):.2f}]") IQR = Q3 - Q1 df = df[(df[col] >= Q1 - factor*IQR) & (df[col] <= Q3 + factor*IQR)] return df # 指定需要处理的连续型列(包括目标变量) continuous_cols = ['掺氨比', '过量空气系数', '燃尽风位置', '主燃区温度'] # 执行过滤(注意保持特征与目标变量的同步过滤) print("原始数据量:", len(data)) data = iqr_outlier_removal(data, continuous_cols) print("过滤后数据量:", len(data)) IQR离群值过滤没生效
03-08
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值