选择不重叠的最佳质量群集

时间:2018-05-10 00:49:48

标签: cluster-analysis greedy

说,我已经对我的数据集进行了聚类,并且有10个聚类。这些集群不重叠。但现在假设我在所有数据点中更改了某些功能并再次进行群集。现在我还有10个集群。 如果我重复说再说3次,最后我会有50个星团。 每个群集都有一个与其相关的分数,该分数是根据其成分数据点计算的。

这50个群集现在具有重叠的数据点。我想从这50个集群中选择所有可能的非重叠集群,但总得分最高。

一种方法是贪婪的方法,我根据从最高到最小的分数对聚类进行排序。然后选择最高得分的群集。然后从那里继续选择具有已经选择的聚类的非重叠数据点的聚类。但它似乎并不是最佳解决方案,尽管速度很快。

示例:说我有5个具有以下分数的群集:

C1 =(A,B,C,D,E,F)得分= 10

C2 =(A,B,C)分数= 6

C3 =(D,E,F)得分= 6

C4 =(G,H,I,J)得分= 5

C5 =(K,L)得分= 7

贪婪的方法将返回{C1,C4,C5},总分为10 + 5 + 7 = 22,而更好的选择是{C2,C3,C4,C5},总分为6 + 6 + 5 + 7 = 24。

我正在寻找另一种能够提供最佳解决方案或更好解决方案的方法,而不是上面提到的贪婪方法。

1 个答案:

答案 0 :(得分:1)

您可以使用操作研究技术解决此问题。

使用

模拟此问题,就像设置分区问题一样
Objective function: maximize score
Constraints: each data point is covered exactly once

然后使用MIP求解器或任何其他技术(例如Hill登山者,遗传算法等)解决它。问题的规模非常小,因此可以通过任何优化算法解决。我也在研究类似的问题,但在航空公司机组调度领域。我的问题规模如此之大,以至于可能的船员时刻表(相当于你的星团)对于大约4500个航班(相当于你的数据点)的航班时刻表而言是万亿组合;)

我已经在python中编写了你的​​例子,我使用了Gurobi的MIP求解器,免费提供学术用途。您也可以使用其他MIP求解器。

这是python代码:

from gurobipy import *
import string

data_points = string.ascii_uppercase[:12]

clusters = []
clusters.append(string.ascii_uppercase[:6])
clusters.append(string.ascii_uppercase[:3])
clusters.append(string.ascii_uppercase[3:6])
clusters.append(string.ascii_uppercase[6:10])
clusters.append(string.ascii_uppercase[10:12])

matrix = {}
for dp in string.ascii_uppercase[:12]:
    matrix[dp] = [0]*5

for i in range(0, len(clusters)):
    for dp in clusters[i]:
        matrix[dp][i] = 1

cost = [10, 6, 6, 5, 7]

# Gurobi MIP model
m = Model("Jitin's cluster optimization problem")
m.params.outputflag = 1
x = m.addVars(len(clusters), vtype=GRB.INTEGER, name='x')
indices = range(0, len(clusters))
coef_x = dict()
obj = 0.0
for i in indices:
    coef_x[i] = cost[i]
    obj += coef_x[i] * x[i]
m.setObjective(obj, GRB.MAXIMIZE)
flight_in_pairings = [[] for i in range(0, 4228)]
for dp,j in zip(data_points, range(0, len(data_points))):
    m.addConstr(sum([x[i]*matrix[dp][i] for i in range(0, len(matrix[dp]))]) == 1, "C"+str(j))
m.optimize()
print('Final Obj:', m.objVal)
m.write('results.sol')

代码的输出:

# Solution for model Jitin's cluster optimization problem
# Objective value = 24
x[0] 0
x[1] 1
x[2] 1
x[3] 1
x[4] 1