现在我有一个表数据,有50000行(例如表示不同的用户)和两列:一个是类“a”到“E”的标签,另一个是小数点为0.0到14000000.00的分数。 我的任务是根据第二列的分数,给用户添加一个新标签,从“a”到“E”。你知道吗
在这里,我希望尽可能减少旧标签(第一列)到新标签的更改。你知道吗
类“A”-“E”被认为是有序的,因此我首先为每个用户的更改分配“loss”:比如A->;B是loss=1.0,A->;C是loss=2.0,等等,然后在Python上尝试了一些scipy minimize函数来最小化整个用户的总损失,为A<;>;B,B<;>;C,C<;>;D,D<;>;E、 但效果不好(从我给出的初始点开始就没有改变),这并不奇怪,因为损失函数是一个阶跃函数,几乎所有地方的梯度都为零。你知道吗
这是我给你的参考资料。obj3是一个计算总损失的函数,输入一个列表,其中四个元素按此顺序表示D<;>;E、C<;>;D、B<;>;C、a<;>;B的截止点。因为D<;>;E的截止点总是小于C<;>;D的截止点,以此类推,所以我使用了三个约束条件:
b = (0,max(df['score']))
bounds = (b,b,b,b)
constraints = [
{'type': 'ineq', 'fun': lambda x: x[1] - x[0]},
{'type': 'ineq', 'fun': lambda x: x[2] - x[1]},
{'type': 'ineq', 'fun': lambda x: x[3] - x[2]},
]
sol = minimize(obj3, thres_init, method='SLSQP', bounds=bounds, constraints=constraints)
sol.x
旧标签和新标签可以有一些洗牌(如按分数降序排列,旧标签类似于'aabdeabd…',一次性暴力方法可能不一定能很好地工作,我想(还没有尝试)
使用排序的唯一得分列表的索引(有5000个唯一得分),我还想到了一些元启发式方法,比如GA(因为现在我们的搜索空间更小,但它是组合优化),但我不确定是否值得投入时间。你知道吗
有人知道解决这个优化问题的算法吗??你知道吗
先谢谢你。你知道吗
考虑值为
0->5
的类A->E
。你知道吗设
Y
为按递增顺序排序的数组得分例如:
Y = [1,2,5,...,14*1e6]
设
X
为赋值前的关联值类例如:
X = [0,5,2,3,...1]
假设我们想要在
c_i
,i = 0 to 3
,c_j > c_i if j > i
位置进行4
切割给定的
c_i
组合的成本是sum_i( |X[0:c_i] - i| )
我们可以编写非常愚蠢的最小化函数(不是有效的python)
相关的动态方法如下
空间复杂度:O(n\u分数) 时间复杂度:O(n\u削减*n\u得分*n\u得分)
下面的似乎起作用,但也没有真正测试过。所以要小心。。。你知道吗
相关问题 更多 >
编程相关推荐