2017-05-01 5 views
0

Es folgt mein Python-CodeTypeerror: nicht unterstützte Operandtyp (e) für: - 'Liste' und 'schweben'

import csv 
import random 
import math 



def separateByClass(dat): 
    separated = {} 
    for i in range(len(dat)): 
     vector = dat[i] 
     if (vector[-1] not in separated): 
      separated[vector[-1]] = [] 
     separated[vector.pop()].append(vector) 
    return separated 

def splitDataset(dataset, splitRatio): 
    trainSize = int(len(dataset) * splitRatio) 
    trainSet = [] 
    copy = list(dataset) 
    while len(trainSet) < trainSize: 
     index = random.randrange(len(copy)) 
     trainSet.append(copy.pop(index)) 
    return [trainSet, copy] 

def mean(numbers): 
    return sum(numbers)/float(len(numbers)) 

def stdev(numbers): 
    avg = mean(numbers) 
    variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1) 
    return math.sqrt(variance) 

def summarize(dataset): 
    summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)] 
    del summaries[-1] 
    return summaries 

def summarizeByClass(dataset): 
    separated = separateByClass(dataset) 
    summaries = {} 
    for classValue, instances in separated.iteritems(): 
     summaries[classValue] = summarize(instances) 
    return summaries 

def calculateProbability(x, mean, stdev): 
    exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2)))) 
    return (1/(math.sqrt(2*math.pi) * stdev)) * exponent 

def calculateClassProbabilities(summaries, inputVector): 
    probabilities = {} 
    for classValue, classSummaries in summaries.iteritems(): 
     probabilities[classValue] = 1 
     for i in range(len(classSummaries)): 
      mean, stdev = classSummaries[i] 
      x = inputVector[i] 
      probabilities[classValue] *= calculateProbability(x, mean, stdev) 
    return probabilities 

def predict(summaries, inputVector): 
    probabilities = calculateClassProbabilities(summaries, inputVector) 
    bestLabel, bestProb = None, -1 
    for classValue, probability in probabilities.iteritems(): 
     if bestLabel is None or probability > bestProb: 
      bestProb = probability 
      print bestProb 
      bestLabel = classValue 
    return bestLabel 

def getPredictions(summaries, testSet): 
    predictions = [] 
    for i in range(len(testSet)): 
     result = predict(summaries, testSet[i]) 
     predictions.append(result) 
    return predictions 

def getAccuracy(testSet, predictions): 
    correct = 0 
    for i in range(len(testSet)): 
     if testSet[i][-1] == predictions[i]: 
      correct += 1 
    return (correct/float(len(testSet))) * 100.0 

def main(str): 
    #clustered data 
    filename = 'a.csv' 
    lines = csv.reader(open(filename, "rb")) 
    a=list(lines) 
    for i in range(len(a)): 
     a[i]=[float(x) for x in a[i]] 


    #main data 
    filename = 'h.csv' 
    lines = csv.reader(open(filename, "rb")) 
    data = list(lines) 
    for i in range(len(data)): 
     data[i] = [float(x) for x in data[i]] 
     data[i].append(a[i][1]) 

    s = separateByClass(data) 

    count=True 
    for key,values in s.items(): 
     if count: 
      a=values 
      count=False 
     b=values 

    trainingSet1, testSet1 = splitDataset(a, 0.67) 
    trainingSet, testSet = splitDataset(b, 0.67) 
    trainingSet.extend(trainingSet1) 
    testSet.extend(testSet1) 
    summaries = summarizeByClass(trainingSet) 
    testset=str 
    predictions = predict(summaries, testSet) 
    accuracy = getAccuracy(testSet, predictions) 
    result = predict(summaries, testset) 
    returnValue.append(accuracy) 
    returnValue.append(result) 
    print returnValue 

def ab(): 
    st=[70.0,1.0,4.0,130.0,322.0,0.0,2.0,109.0,0.0,2.4,2.0,3.0,3.0,1.0] 
    a=main(st) 
    return a 
ab() 

The two files used a.csv and h.csv contains 2 and 14 colums respectively. The code runs perfectly fine if the accuracy was not computed. ie only when the predict() is used.

Es gibt den Fehler wie folgt.

Traceback (most recent call last): 
File "D:\nowedit\P.py", line 126, in <module> 
ab() 
File "D:\nowedit\P.py", line 124, in ab 
a=main(st) 
File "D:\nowedit\P.py", line 115, in main 
predictions = predict(summaries, testSet) 
File "D:\nowedit\P.py", line 60, in predict 
probabilities = calculateClassProbabilities(summaries, inputVector) 
File "D:\nowedit\P.py", line 56, in calculateClassProbabilities 
probabilities[classValue] *= calculateProbability(x, mean, stdev) 
File "D:\nowedit\P.py", line 46, in calculateProbability 
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2)))) 
TypeError: unsupported operand type(s) for -: 'list' and 'float' 
+0

Hier 'math.pow (x-mean, 2)', wo 'x' ist __list__ und' mean' ist __float__. Liste - Float wird nicht unterstützt. – amarnath

Antwort

0

Wenn Sie diese Zeile in calculateProbability hinzufügen (x, Mittelwert, STABW) Funktion:

print("%s%s%s" % (type(x), type(mean), type(stdev)) 

Sie, dass x sehen eine Liste ist und meine ist ein Schwimmer.

Da die Fehlerzustände:

TypeError: unsupported operand type(s) for -: 'list' and 'float' 

Sie können keine Liste verwenden und schweben als Parameter für diese mathematische Funktion.

Verwandte Themen