基于点积的回归分类:如何求解满足条件的向量X?
求解向量X的步骤
首先修正伪代码中的笔误:原代码里B2被重复赋值,正确写法应为B1 = "000111010000",B2 = "000110100000"。
1. 将字符串转化为二进制约束
每个12位字符串对应X的12个维度(x₁到x₁₂),点积运算等价于字符串中为"1"的位置对应的X元素之和(0乘任何数都为0,不影响结果)。据此转化出明确的不等式约束:
- A1("101000001111"):x₀ + x₂ + x₈ + x₉ + x₁₀ + x₁₁ > 0.5
- A2("110000010101"):x₀ + x₁ + x₇ + x₉ + x₁₁ > 0.5
- B1("000111010000"):x₃ + x₄ + x₅ + x₇ < 0.5
- B2("000110100000"):x₃ + x₄ + x₆ < 0.5
2. 构造满足约束的X
可以通过差异化权重分配快速构造:给正类(A1、A2)中出现"1"的位置设较高值,负类(B1、B2)独有的"1"位置设极低值。比如:
- 正类相关位置(0、1、2、7、8、9、10、11):xᵢ = 0.11
- 负类独有位置(3、4、5、6):xᵢ = 0
验证结果:
- A1·X = 6×0.11 = 0.66 > 0.5
- A2·X = 5×0.11 = 0.55 > 0.5
- B1·X = 0 + 0 + 0 + 0.11 = 0.11 < 0.5
- B2·X = 0 + 0 + 0 = 0 < 0.5
如果需要更严谨的解,可使用线性规划工具(如Python的scipy.optimize.linprog),以最小化X元素总和为目标,代入上述不等式约束求解。
3. 代码实现示例
# 按构造方式生成X X = [0.11 if i in {0,1,2,7,8,9,10,11} else 0 for i in range(12)] # 辅助函数:计算字符串与X的点积 def dot_product(bin_str, x_vec): return sum(float(c) * x for c, x in zip(bin_str, x_vec)) # 定义样本字符串 A1 = "101000001111" A2 = "110000010101" B1 = "000111010000" B2 = "000110100000" # 验证约束 assert dot_product(A1, X) > 0.5 assert dot_product(A2, X) > 0.5 assert dot_product(B1, X) < 0.5 assert dot_product(B2, X) < 0.5 print("满足约束的X:", X)
内容的提问来源于stack exchange,提问作者Ohumeronen
相关产品推荐
相关产品推荐

