add: top cut model initial implementation
This commit is contained in:
@@ -58,6 +58,36 @@ def fit_piece_wise_linear(d, C, M=1000):
|
||||
return m.X, c0.X, b.X, aic
|
||||
|
||||
|
||||
def fit_cut(d, C):
|
||||
"""
|
||||
Fits a simple linear regression model to the given data.
|
||||
However the top 10% of points are used to derive a constant which is added as a constraint to the optimization problem.
|
||||
This results in a piece-wise linear function of two parts, where the first part is a linear function while the second function is a constant.
|
||||
|
||||
Parameters:
|
||||
d (array-like): Distance values.
|
||||
C (array-like): Corresponding centrality values.
|
||||
|
||||
Returns:
|
||||
tuple: Optimize slope (m), intercept (t) and breaking point (b)
|
||||
"""
|
||||
n = len(d)
|
||||
cut = math.floor(n * 0.1)
|
||||
b = sum(C[n - cut..n]) / cut
|
||||
|
||||
model = gp.Model("Top Cut")
|
||||
|
||||
m = model.addVar(vtype=GRB.CONTINUOUS, name="m")
|
||||
t = model.addVar(vtype=GRB.CONTINUOUS, name="t")
|
||||
|
||||
model.setObjective(gp.quicksum((C[i] - t - m * d[i])**2 for i in range(n - cut, n)), GRB.MINIMIZE)
|
||||
for i in range(n - cut, n):
|
||||
model.addConstr(b >= m * d[i] + t)
|
||||
model.optimize()
|
||||
|
||||
return m.X, t.X, b
|
||||
|
||||
|
||||
def fit_linear_regression(d, C):
|
||||
"""
|
||||
Fits a simple linear regression model to the given data using optimization.
|
||||
|
||||
Reference in New Issue
Block a user