2017-08-29 8 views
0

Je veux vérifier si mes données sont linéairement séparables ou non. Pour cela j'utilise les équations mentionnées à ce link. Voici le code que j'utilise:Comment spécifier dynamiquement les contraintes dans la pâte?

try: 
     import os 
     #import random 
     import traceback 
     import datetime 
     #import numpy as np 
     import scipy.io as sio 
     import pulp 
     os.system('cls') 
     dicA = sio.loadmat('A1.mat') 
     A = dicA.get('A1')   
     var = pulp.LpVariable.dicts("var",range(11),pulp.LpContinuous) 
     A = A[:,0:10] 
     model = pulp.LpProblem("Data linearly seaparable", pulp.LpMinimize) 
     model+= 0 
     print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 
     for i in range(len(A)): 
      expr = pulp.LpAffineExpression() 
      for j in range(len(A[i])): 
       expr += var[j]*A[i][j] 
      expr+= var[10] <= -1 
      model+= expr 
     print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 
     model.solve() 
     print(pulp.LpStatus[model.status]) 
     print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 
except: 
     print('exception') 
     tb = traceback.format_exc() 
     print(tb) 
finally: 
     print('reached finally') 

Et voici la sortie que je reçois:

C:\Users\puneet\Anaconda3\lib\site-packages\pulp\pulp.py:1348: UserWarning: Overwriting previously set objective. 
    warnings.warn("Overwriting previously set objective.") 
2017-08-29 10:06:21 
exception 
Traceback (most recent call last): 
    File "C:/Hackerearth Challenge/Machine Learning #3/LInearlySeaparblePulp.py", line 31, in <module> 
    model.solve() 
    File "C:\Users\puneet\Anaconda3\lib\site-packages\pulp\pulp.py", line 1664, in solve 
    status = solver.actualSolve(self, **kwargs) 

    File "C:\Users\puneet\Anaconda3\lib\site-packages\pulp\solvers.py", line 1362, in actualSolve 
    return self.solve_CBC(lp, **kwargs) 
    File "C:\Users\puneet\Anaconda3\lib\site-packages\pulp\solvers.py", line 1384, in solve_CBC 
    tmpMps, rename = 1) 
    File "C:\Users\puneet\Anaconda3\lib\site-packages\pulp\pulp.py", line 1484, in writeMPS 
    f.write(" LO BND  %-8s % .12e\n" % (n, v.lowBound)) 
TypeError: must be real number, not str 

reached finally 

J'ajoute 0 à préciser qu'il n'y a pas de fonction objectif tel que mentionné dans le lien . Aussi puisqu'il y a environ 12000 lignes dans une variable, donc j'essaie de créer dynamiquement des contraintes. Mais il semble qu'il y ait un problème dans ça. Alors, qu'est-ce que je fais de mal?

+1

Le retraçage suggère que quelque chose que vous utilisez est une chaîne au lieu d'un nombre. Je me demandais si cela avait à voir avec la façon dont vous importez les données – thomaskeefe

Répondre

2
var = pulp.LpVariable.dicts("var",range(11),pulp.LpContinuous) 

doit être

var = pulp.LpVariable.dicts("var",range(11),cat=pulp.LpContinuous) 

comme LpVariable.dicts fn ressemble à ceci

def dicts(self, name, indexs, lowBound = None, upBound = None, cat = LpContinuous, indexStart = []): 
+0

Merci, il a résolu l'erreur. J'ai aussi obtenu le résultat sans limite. Cela implique-t-il que les données ne sont pas linéairement séparables? –