python fit函数_Gaussian NB fit()函数需要固定长度的向量

在使用GaussianNB的fit()函数进行训练时,遇到一个问题:如果训练样本X中的向量长度不一致,fit()会抛出异常。针对这个问题,应该如何正确地调整数据并调用fit()函数?当前的代码示例导致了DeprecationWarning和ValueError。

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

我正在尝试实施这样的高斯NB训练。但是国民生产总值()如果X的维数不相等(即X内的所有列表的长度都必须相同),则抛出异常。如果我的训练样本是不同长度的向量,那么调用fit()的正确方法是什么?在def train(X, Y):

gnb = GaussianNB()

gnb.fit(X, Y)

return gnb

>>> X = [[1,2,3], [4,5,6,7], [8,9]]

>>> Y = [1,1,1]

>>> snb.train(X, Y)

/Library/Python/2.7/site-packages/sklearn/utils/validation.py:395:

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17

and will raise ValueError in 0.19. Reshape your data either using

X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1)

if it contains a single sample.

DeprecationWarning)

Traceback (most recent call last):

File "", line 1, in

File "snb.py", line 113, in train

gnb.fit(X, Y)

File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line

182, in fit

X, y = check_X_y(X, y)

File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py",

line 521, in check_X_y

ensure_min_features, warn_on_dtype, estimator)

File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py",

line 402, in check_array

array = array.astype(np.float64)

ValueError: setting an array element with a sequence.

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, Matern, ConstantKernel from skopt import gp_minimize from skopt.space import Real from skopt.utils import use_named_args from skopt.plots import plot_convergence, plot_objective from scipy.optimize import minimize from sklearn.preprocessing import StandardScaler import warnings from sklearn.exceptions import ConvergenceWarning # 设置美观的绘图风格 sns.set(style="whitegrid", palette="muted", font_scale=1.1) plt.rcParams['font.family'] = 'DejaVu Sans' plt.rcParams['axes.labelsize'] = 12 plt.rcParams['xtick.labelsize'] = 10 plt.rcParams['ytick.labelsize'] = 10 # 读取数据 df = pd.read_excel('FEM_data.xlsx') print("数据预览:") print(df.head()) # 检查数据分布 plt.figure(figsize=(12, 8)) sns.pairplot(df, diag_kind='kde') plt.suptitle('Feature and Target Distribution', y=1.02) plt.tight_layout() plt.savefig('data_distribution.png', dpi=300) plt.show() # 分离特征和目标 X = df[['f_nb', 'E', 'po', 'v_r', 'e_0.2', 'P', 'r']].values S = df['S'].values.reshape(-1, 1) # 需要最小化 RM = df['RM'].values.reshape(-1, 1) # 需要最大化 # 标准化特征和目标 scaler_X = StandardScaler().fit(X) scaler_S = StandardScaler().fit(S) scaler_RM = StandardScaler().fit(RM) X_scaled = scaler_X.transform(X) S_scaled = scaler_S.transform(S).ravel() RM_scaled = scaler_RM.transform(RM).ravel() # 定义组合目标:S越小越好,RM越大越好 -> 最小化 [S_scaled - RM_scaled] combined_target = S_scaled - RM_scaled # 为贝叶斯优化定义参数空间 param_space = [ Real(0.1, 0.9, name='f_nb'), # Continuous variable Real(120000, 280000, name='E'), # Young's modulus Real(0.27, 0.34, name='po'), # Poisson's ratio Real(0.314, 10.314, name='v_r'), # Volume ratio Real(680, 875, name='e_0.2'), # Yield strength Real(0, 4000, name='P'), # Load Real(21, 25, name='r') # Radius ] # 创建GPR模型 - 进一步扩大核参数边界防止收敛问题 def create_kernel(): return ConstantKernel(1.0, constant_value_bounds=(1e-6, 1e3)) * Matern( length_scale=1.0, length_scale_bounds=(1e-6, 1e3), nu=2.5 ) + ConstantKernel(1.0, constant_value_bounds=(1e-6, 1e3)) * RBF( length_scale=0.5, length_scale_bounds=(1e-6, 1e3) ) kernel = create_kernel() gpr = GaussianProcessRegressor( kernel=kernel, alpha=1e-5, # 减小噪声项 n_restarts_optimizer=25, # 增加重启次数 random_state=42, normalize_y=True # 内部标准化目标值 ) # 训练初始GPR模型 gpr.fit(X_scaled, combined_target) print(f"初始GPR模型参数: {gpr.kernel_}") # 定义贝叶斯优化目标函数 @use_named_args(param_space) def objective(**params): # 提取参数值 param_values = np.array([params[dim.name] for dim in param_space]).reshape(1, -1) # 标准化输入 param_scaled = scaler_X.transform(param_values) # 预测组合目标 mean_pred, std_pred = gpr.predict(param_scaled, return_std=True) # 获取置信下界 (Lower Confidence Bound) - 平衡探索与开发 lcb = mean_pred - 0.5 * std_pred return lcb[0] # 返回标量值 # 运行贝叶斯优化 - 使用8个初始点(2的幂) res_gp = gp_minimize( func=objective, dimensions=param_space, n_calls=50, # 额外评估次数 n_random_starts=8, # 使用2的幂(8个)初始点 initial_point_generator='sobol', # 更好的空间覆盖 random_state=42, acq_func='EI' ) print("\n贝叶斯优化结果:") print(f"最优参数组合: {res_gp.x}") print(f"最佳目标值: {res_gp.fun}") # 获取最优参数 optimal_params = np.array(res_gp.x).reshape(1, -1) optimal_params_scaled = scaler_X.transform(optimal_params) # 预测最优点的组合目标值 combined_pred = gpr.predict(optimal_params_scaled) # 分别预测S和RM的标准化值 # 创建新的GPR模型用于S和RM gpr_S = GaussianProcessRegressor( kernel=create_kernel(), # 使用相同的核结构 alpha=1e-5, n_restarts_optimizer=25, # 增加重启次数 random_state=42, normalize_y=True ) gpr_S.fit(X_scaled, S_scaled) gpr_RM = GaussianProcessRegressor( kernel=create_kernel(), # 使用相同的核结构 alpha=1e-5, n_restarts_optimizer=25, # 增加重启次数 random_state=42, normalize_y=True ) gpr_RM.fit(X_scaled, RM_scaled) # 预测最优点的S和RM S_pred_scaled = gpr_S.predict(optimal_params_scaled) RM_pred_scaled = gpr_RM.predict(optimal_params_scaled) # 反标准化得到实际值 S_pred = scaler_S.inverse_transform(S_pred_scaled.reshape(-1, 1)) RM_pred = scaler_RM.inverse_transform(RM_pred_scaled.reshape(-1, 1)) print("\n预测最优值:") print(f"S_min: {S_pred[0][0]:.2f}") print(f"RM_max: {RM_pred[0][0]:.2f}") # 可视化优化过程 plt.figure(figsize=(12, 8)) plot_convergence(res_gp) plt.title('Bayesian Optimization Convergence', fontsize=14) plt.tight_layout() plt.savefig('bo_convergence.png', dpi=300) plt.show() # 绘制目标函数响应面 - 传递所有维度名称 dimension_names = [dim.name for dim in param_space] plt.figure(figsize=(16, 12)) ax = plot_objective(res_gp, dimensions=dimension_names) plt.suptitle('Objective Function Response Surface', fontsize=16) plt.tight_layout(rect=[0, 0, 1, 0.96]) # 为标题留出空间 plt.savefig('objective_response.png', dpi=300) plt.show() # 分析参数敏感性 sensitivity = [] # 创建包装函数,处理参数传递问题 def wrapped_objective(params): """包装函数,处理参数传递问题""" param_dict = {dim.name: val for dim, val in zip(param_space, params)} return objective(**param_dict) # 使用中心差分法计算梯度 delta = 0.05 base_params = np.array(res_gp.x) for idx, dim in enumerate(param_space): # 上限参数值 up_params = base_params.copy() up_params[idx] = min(up_params[idx] + delta * (dim.bounds[1] - dim.bounds[0]), dim.bounds[1]) up_score = -wrapped_objective(up_params) # 下限参数值 low_params = base_params.copy() low_params[idx] = max(low_params[idx] - delta * (dim.bounds[1] - dim.bounds[0]), dim.bounds[0]) low_score = -wrapped_objective(low_params) sensitivity.append({ 'parameter': dim.name, 'absolute_sensitivity': up_score - low_score, 'relative_sensitivity': (up_score - low_score) / (abs(up_params[idx] - low_params[idx]) + 1e-10), 'range': dim.bounds }) # 创建参数敏感性数据框 sensitivity_df = pd.DataFrame(sensitivity).sort_values('absolute_sensitivity', ascending=False) # 绘制参数敏感性 plt.figure(figsize=(12, 7)) sns.barplot( y='parameter', x='absolute_sensitivity', data=sensitivity_df, palette='viridis' ) plt.xlabel('Sensitivity to Objective Function', fontsize=12) plt.ylabel('Parameter', fontsize=12) plt.title('Parameter Sensitivity Analysis', fontsize=14) plt.tight_layout() plt.savefig('parameter_sensitivity.png', dpi=300) plt.show() # 打印完整优化报告 print("\n=================== OPTIMIZATION REPORT ===================") print(f"最优参数组合 (原始值):") for dim, val in zip(param_space, res_gp.x): print(f"- {dim.name}: {val:.4f} (范围: [{dim.bounds[0]}, {dim.bounds[1]}])") # 计算实际提升百分比 S_mean = df['S'].mean() RM_mean = df['RM'].mean() S_improvement = (S_mean - S_pred[0][0]) / S_mean * 100 RM_improvement = (RM_pred[0][0] - RM_mean) / RM_mean * 100 print(f"\n目标提升预测:") print(f"S最小值 (预测): {S_pred[0][0]:.2f} (降幅: {S_improvement:.1f}%)") print(f"RM最大值 (预测): {RM_pred[0][0]:.2f} (增幅: {RM_improvement:.1f}%)") print("\n参数敏感性排序:") print(sensitivity_df[['parameter', 'absolute_sensitivity']].to_string(index=False)) # 保存优化结果 params_names = [dim.name for dim in param_space] results_df = pd.DataFrame([res_gp.x], columns=params_names) results_df['S_pred'] = S_pred[0][0] results_df['RM_pred'] = RM_pred[0][0] results_df.to_csv('optimization_results.csv', index=False) print("\n优化结果已保存到 optimization_results.csv")报错:TypeError: objective() got an unexpected keyword argument 'f_nb'
最新发布
07-03
### 使用 `scipy.optimize.curve_fit` 进行非线性最小二乘法拟合 为了实现非线性最小二乘法的数据拟合,可以利用 `scipy.optimize` 子模块下的 `curve_fit` 函数[^1]。此函数能够帮助估计模型参数的最佳值以及这些参数的不确定性。 下面是一个具体的例子,展示如何使用 `curve_fit` 来拟合一组数据到给定的形式——这里选用的是高斯分布形式: #### 高斯函数定义 首先定义要拟合的目标函数,在本例中为一维高斯函数: ```python import numpy as np def gaussian(x, a, b, c): """ 定义高斯函数 """ return a * np.exp(-(x - b)**2 / (2 * c**2)) ``` #### 数据准备 接着创建一些模拟数据用于测试目的,并加入少量噪声使其更接近实际情况: ```python # 创建自变量范围 x_data = np.linspace(-10, 10, num=50) # 设定真实参数值并生成因变量观测值加上随机误差项 y_true = gaussian(x_data, 2.5, 1., 1.) y_noise = 0.2 * np.random.normal(size=x_data.size) y_measured = y_true + y_noise ``` #### 参数初始化与拟合过程 之后设置初始猜测值,并调用 `curve_fit` 执行实际的拟合操作: ```python from scipy.optimize import curve_fit initial_guesses = [1, 0, 1] params_optimized, params_covariance = curve_fit( f=gaussian, xdata=x_data, ydata=y_measured, p0=initial_guesses ) print('Optimal parameters:', params_optimized) ``` 上述代码片段展示了完整的流程,从构建目标函数至最终获得最优解的过程[^4]。 通过这种方式可以获得最佳匹配输入数据集的参数集合及其对应的协方差矩阵。对于某些特殊情况,当雅可比矩阵不是满秩的时候,不同的求解器可能会有不同的处理方式;例如,“lm”算法在这种情况下会返回含有无穷大(`np.inf`)的结果,而其他两种方法则采用摩尔-彭罗斯广义逆来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值