Matlab中如何调整参数P最小化指示变量向量A与B的差异?
解决方法:选择参数P最小化0-1向量A与B的差异
一、基础场景(不含D变量)
先对生成B的不等式做变形,明确P对每个样本的影响:
√(C[i]+10) - P > √(C[i])
等价于 P < √(C[i]+10) - √(C[i])
我们把每个样本对应的阈值记为 T[i] = sqrt(C[i]+10) - sqrt(C[i]),那么:
- 若P < T[i],则B[i]=1;否则B[i]=0
目标是找到P,让A和B的误分类数(sum(A~=B))最少。最优P一定出现在阈值T的分界点上,因此我们只需检查这些分界点及相邻中点即可。
Matlab 实现代码
% 给定输入数据 C = [10, 1, 100, 1000, 1]; A = [1, 0, 0, 1, 0]; % 计算每个样本的阈值T T = sqrt(C + 10) - sqrt(C); % 生成候选P值:覆盖所有阈值点、相邻中点及边界 sorted_T = sort(T); candidate_P = [sorted_T(1)-1; (sorted_T(1:end-1)+sorted_T(2:end))/2; sorted_T(end)+1]; min_error = Inf; best_P = NaN; % 遍历候选P,找到误分类最少的最优解 for p = candidate_P % 向量化生成B向量(替代循环,提升效率) B = (sqrt(C+10) - p > sqrt(C))'; % 计算误分类数 error = sum(A ~= B); % 更新最优P if error < min_error min_error = error; best_P = p; elseif error == min_error % 若多个P效果相同,取更小的P if p < best_P best_P = p; end end end fprintf('最优P值:%.4f,最小误分类数:%d\n', best_P, min_error);
二、扩展场景(含D变量)
当不等式改为 √(C[i]+10) - P*D[i] > √(C[i]),变形后需分D[i]的符号讨论:
- 若D[i] > 0:P < (√(C[i]+10)-√(C[i]))/D[i](记为T_new[i])
- 若D[i] < 0:不等式两边除以负数,不等号变向 → P > (√(C[i]+10)-√(C[i]))/D[i](记为T_new[i])
- 若D[i] = 0:原不等式恒成立,B[i]固定为1(无法通过P调整)
Matlab 实现代码
% 给定输入数据(新增D变量) C = [10, 1, 100, 1000, 1]; A = [1, 0, 0, 1, 0]; D = [2, -1, 3, 0.5, -2]; % 示例D向量 % 计算每个样本的新阈值T_new及D的符号 T_new = (sqrt(C + 10) - sqrt(C)) ./ D; D_sign = sign(D); % 生成候选P值(排除D=0导致的无穷值) valid_T = T_new(~isinf(T_new)); sorted_T_new = sort(valid_T); candidate_P = [sorted_T_new(1)-1; (sorted_T_new(1:end-1)+sorted_T_new(2:end))/2; sorted_T_new(end)+1]; min_error = Inf; best_P = NaN; % 遍历候选P找最优解 for p = candidate_P B = zeros(size(A)); for i = 1:length(A) if D(i) > 0 B(i) = (p < T_new(i)); elseif D(i) < 0 B(i) = (p > T_new(i)); else B(i) = 1; % D=0时B[i]固定为1 end end error = sum(A ~= B); if error < min_error min_error = error; best_P = p; elseif error == min_error if p < best_P best_P = p; end end end fprintf('含D变量的最优P值:%.4f,最小误分类数:%d\n', best_P, min_error);
补充说明
- 若偏好连续损失函数(如平方损失
sum((A-B).^2)),只需将误差计算语句替换即可,核心逻辑不变。 - 大数据集下尽量使用向量化操作替代循环,能显著提升运行效率。
内容的提问来源于stack exchange,提问作者R124
相关产品推荐
相关产品推荐

