problem 1109

Language of FatMouse 

问题十分简单,关键在于数据量大直接循环做会超时。这里采用先排序再二分搜索的方法。排序用qsort(),搜索用bsearch()(不知道怎么用的看这里 c语言中几个很有用的函数)。

还可以用树来做,建一个二十六叉树,这样时间和空间效率都将提升不少,不过比排序做要麻烦。

Accepted1109C00:00.563628K

#include<stdio.h>
#include<string
.h>
#include
<stdlib.h>
struct  s
{
    
char a[11
];
    
char b[11
];
}d[
100008
];
char w[100008][11
];
int cmp(const void* a,const void*
 b)
{
    
return strcmp((*(struct s*)a).b,(*(struct s*
)b).b);
}
int cmp1(const void* a,const void*
 b)
{
    
return strcmp((char *)a,(*(struct s*
)b).b);
}
void
 solve()
{
    
char temp[22
];
    
int
 cnt1,cnt2,k;
    cnt1 
= cnt2 = k = 0
;
    
while(1
)
    {
        
int i = 0,j = 0
;
        gets(temp);
        
if(temp[0== 0
)
            
break
;
        
while(temp[i] != ' '
)
            d[cnt1].a[i] 
= temp[i++
];
        
while(temp[++i] != 0
)
            d[cnt1].b[j
++=
 temp[i]; 
        cnt1
++
;
    }
    
while(scanf("%s",w[cnt2++]) !=
 EOF);
    cnt2
--
;
    qsort(d,cnt1,
sizeof(d[0
]),cmp);
    
for(k = 0; k < cnt2; k++
)
    {
        
struct s*
 t;
        t 
= bsearch(w[k],d,cnt1,sizeof(d[0
]),cmp1);
        t 
== NULL ? puts("eh") : puts(t->
a);
    }
}
void
 main()
{
#ifndef ONLINE_JUDGE
    freopen(
"test.txt","r",stdin);
#endif
    solve();
#ifndef ONLINE_JUDGE
    fclose(stdin);
#endif
}
ValueError Traceback (most recent call last) Cell In[13], line 101 99 algorithm.mutOper.Pm = 0.2 # 修改变异算子的变异概率 100 algorithm.recOper.XOVR = 0.9 # 修改交叉算子的交叉概率 --> 101 res = ea.optimize(algorithm, 102 verbose=True, 103 drawing=1, 104 outputMsg=True, 105 drawLog=False, 106 saveFlag=True, 107 dirName = 'D:/Desktop/煤溶胀-机器学习/代码/VD-代码/SVR预测/Final/TG' 108 ) File ~\.conda\envs\python3.9\lib\site-packages\geatpy\optimize.py:104, in optimize(algorithm, seed, prophet, verbose, drawing, outputMsg, drawLog, saveFlag, dirName, **kwargs) 102 algorithm.drawing = drawing if drawing is not None else algorithm.drawing 103 # 开始求解 --> 104 [optPop, lastPop] = algorithm.run(prophetPop) 105 # 生成结果 106 result = {} File ~\.conda\envs\python3.9\lib\site-packages\geatpy\algorithms\moeas\nsga2\moea_NSGA2_templet.py:86, in moea_NSGA2_templet.run(self, prophetPop) 84 if prophetPop is not None: 85 population = (prophetPop + population)[:NIND] # 插入先知种群 ---> 86 self.call_aimFunc(population) # 计算种群的目标函数值 87 [levels, _] = self.ndSort(population.ObjV, NIND, None, population.CV, self.problem.maxormins) # 对NIND个个体进行非支配分层 88 population.FitnV = (1 / levels).reshape(-1, 1) # 直接根据levels来计算初代个体的适应度 File ~\.conda\envs\python3.9\lib\site-packages\geatpy\Algorithm.py:209, in Algorithm.call_aimFunc(self, pop) 207 if self.problem is None: 208 raise RuntimeError('error: problem has not been initialized. (算法类中的问题对象未被初始化。)') --> 209 self.problem.evaluation(pop) # 调用问题类的evaluation() 210 self.evalsNum = self.evalsNum + pop.sizes if self.evalsNum is not None else pop.sizes # 更新评价次数 211 # 格式检查 File ~\.conda\envs\python3.9\lib\site-packages\geatpy\Problem.py:218, in Problem.evaluation(self, pop) 216 evalVarsCallFlag = True 217 if evalVarsCallFlag: --> 218 return_object = self.evalVars(pop.Phen) 219 if type(return_object) != tuple: 220 pop.ObjV = return_object Cell In[13], line 60, in MyProblem.evalVars(self, X) 54 svr_tg = SVR(kernel = 'poly' 55 , C = param_svr[tar_name[0]][0] 56 , gamma = param_svr[tar_name[0]][1] 57 , epsilon = param_svr[tar_name[0]][2] 58 ).fit(chara_scal, vd_scal.iloc[:,0]) 59 pre_tg = np.round(svr_tg.predict(x_pred_scal), 2).reshape(-1,1) ---> 60 scal_tg = tg_scal.inverse_transform(pre_tg) 62 svr_tem = SVR(kernel = 'poly' 63 , C = param_svr[tar_name[1]][0] 64 , gamma = param_svr[tar_name[1]][1] 65 , epsilon = param_svr[tar_name[1]][2] 66 ).fit(chara_scal, vd_scal.iloc[:,1]) 67 pre_tem = np.round(svr_tem.predict(x_pred_scal), 2).reshape(-1,1) File ~\.conda\envs\python3.9\lib\site-packages\sklearn\preprocessing\_data.py:1107, in StandardScaler.inverse_transform(self, X, copy) 1105 else: 1106 if self.with_std: -> 1107 X *= self.scale_ 1108 if self.with_mean: 1109 X += self.mean_ ValueError: non-broadcastable output operand with shape (500,1) doesn't match the broadcast shape (500,28)
03-23
<think>好,用户遇到了一个ValueError,错误信息是“non-broadcastable output operand with shape (500,1) doesn't match the broadcast shape (500,28)”。需要仔细分析问题所在。首先,用户在使用StandardScaler的inverse_transform方法时出现形状不匹配的问题。错误提示显示输出的形状是(500,1),但期望的是(500,28)。这说明在逆变换时,输入的数据维度与scaler原本拟合的数据维度不一致。 可能的原因是用户在对目标变量进行标准化时,scaler(tg_scal)是在一个形状为(n_samples, 1)的数据上拟合的,但现在试图将预测后的数据(形状(500,1))应用到这个scaler上,但该scaler可能原本拟合的是一个有28个特征的数据。例如,如果用户错误地将一个单变量的scaler应用到了多变量数据上,或者在训练scaler时用了特征数据,而在逆变换时用了目标变量数据,就会导致维度不匹配。 接下来需要检查代码中的StandardScaler的使用情况。用户可能在定义tg_scal时,错误地使用了特征数据的scaler,而不是目标变量的scaler。例如,如果chara_scal是用特征数据训练的scaler,而目标变量vd_scal用了不同的scaler,但在逆变换时错误地使用了特征数据的scaler,就会导致这个问题。 具体来看用户代码中的这一行: scal_tg = tg_scal.inverse_transform(pre_tg) 这里,pre_tg的形状是(500,1),而tg_scal可能是在训练时被错误地拟合到了28个特征的数据上,导致在逆变换时期望输入的形状是(500,28),而实际输入的是(500,1),从而引发错误。 解决办法是确保用于目标变量逆变换的scaler(tg_scal)是专门针对该目标变量训练的,且其形状匹配。例如,应该在预处理阶段,为目标变量单独训练一个scaler,而不是使用特征变量的scaler。检查是否在训练scaler时正确地区分了特征和目标变量,确保每个目标变量有自己的scaler实例,并且在逆变换时使用对应的scaler。 此外,可能用户在数据预处理阶段将特征和目标变量分开标准化,但保存或调用scaler时出现了混淆。需要确认tg_scal是否真的对应目标变量的scaler,而不是特征的。例如,如果特征数据有28个维度,而目标变量只有1个,但错误地将特征scaler用于目标变量,就会出现此问题。 总结解决步骤: 1. 确认tg_scal是否正确初始化和拟合。确保它是用目标变量的训练数据(如vd_scal.iloc[:,0])进行fit的,而不是特征数据。 2. 检查是否在训练scaler时,目标变量被错误地reshape成(样本数, 28)而不是(样本数, 1),导致scaler期望28个特征。 3. 如果目标变量确实是单变量,确保其形状是二维的,如(n_samples, 1),而不是一维的(n_samples,),因为StandardScaler需要二维输入。 4. 确保在预测后,pre_tg的形状与tg_scal期望的输入形状一致。如果tg_scal拟合的是单变量,则pre_tg的形状应为(n_samples, 1),此时逆变换应正常。 可能的代码修正示例: 在训练scaler时,确保为目标变量单独创建并拟合: ```python from sklearn.preprocessing import StandardScaler # 假设vd_scal是目标变量,包含两列(两个目标) tg_scaler = StandardScaler().fit(vd_scal.iloc[:, [0]]) # 注意使用双括号保持二维结构 tem_scaler = StandardScaler().fit(vd_scal.iloc[:, [1]]) # 预测后逆变换 pre_tg = svr_tg.predict(x_pred_scal).reshape(-1, 1) scal_tg = tg_scaler.inverse_transform(pre_tg) # 此时tg_scaler期望(样本数,1) ``` 确保在fit和inverse_transform时数据维度正确,避免混淆特征和目标变量的scaler。</think>### ValueError问题分析与解决步骤 你遇到的错误是由于`StandardScaler`逆变换时**数据形状不匹配**导致的。具体来说: ``` ValueError: non-broadcastable output operand with shape (500,1) doesn't match the broadcast shape (500,28) ``` #### 错误原因分析 1. **scaler拟合维度与预测维度不一致** - `tg_scal`(StandardScaler对象)在训练时拟合了**28个特征**的数据(例如形状为`(n_samples, 28)`),但在预测后尝试用它对**单列数据**(形状`(500,1)`)进行逆变换。 - `inverse_transform()`要求输入数据维度必须与训练时的维度一致。此处期望`(500,28)`,但实际输入`(500,1)`。 2. **代码关键点定位** ```python scal_tg = tg_scal.inverse_transform(pre_tg) # pre_tg形状为(500,1) ``` - 问题出在`tg_scal`的拟合对象可能是**特征数据**(如`chara_scal`,假设有28列),而不是**目标变量**`vd_scal.iloc[:,0]`。 --- #### 解决方案步骤 1. **确认scaler的拟合对象** - **目标变量标准化**:确保`tg_scal`是专门针对目标变量(如`vd_scal.iloc[:,0]`)训练的,而不是特征数据。 - 正确代码示例: ```python # 训练时对目标变量进行scaler拟合 tg_scaler = StandardScaler().fit(vd_scal.iloc[:, [0]]) # 注意双括号保持二维结构 ``` 2. **检查数据维度一致性** - 确保`pre_tg`的维度与`tg_scal`训练时的维度一致。例如: ```python pre_tg = svr_tg.predict(x_pred_scal).reshape(-1, 1) # 确保形状为(n_samples,1) scal_tg = tg_scaler.inverse_transform(pre_tg) # 输入形状匹配 ``` 3. **避免特征与目标scaler混淆** - 如果代码中存在多个scaler(如特征scaler和目标scaler),需严格区分命名和使用: ```python # 特征scaler(假设特征有28列) chara_scaler = StandardScaler().fit(X_train_features) # X_train_features形状为(n,28) # 目标scaler(每个目标单独一个) tg_scaler = StandardScaler().fit(y_train_tg) # y_train_tg形状为(n,1) ``` --- #### 验证与调试建议 1. **打印scaler的均值和方差** ```python print("tg_scal.mean_:", tg_scal.mean_) print("tg_scal.scale_:", tg_scal.scale_) ``` - 如果输出长度是28,说明错误地拟合到了特征数据。 2. **检查目标变量标准化流程** - 确保目标变量的标准化和逆变换使用同一个scaler实例: ```python # 标准化目标变量 y_train_tg_scaled = tg_scaler.transform(y_train_tg) # 预测后逆变换 y_pred_tg = tg_scaler.inverse_transform(pre_tg) ``` --- ### 总结 此错误的核心是**数据预处理阶段scaler的应用对象错误**。请检查`tg_scal`的初始化位置,确保它仅针对目标变量(如`vd_scal`的某一列)进行拟合,而非特征数据。修正后即可解决维度不匹配问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值