python - 急求問——關于iteritems不能用的問題
問題描述
明天就是畢設中期答辯了,想趕一下進度,現在是做貝葉斯網絡預測模型,在網上找了一個例子,想跑一下試試,結果報錯iteritems用不了,好像是Python版本的問題,想問問有沒有什么比較快速一點的解決辦法,救急如救火,先謝謝各位了
# Example of Naive Bayes implemented from Scratch in Pythonimport csvimport randomimport mathdef loadCsv(filename): lines = csv.reader(open(filename, 'rb')) dataset = list(lines) for i in range(len(dataset)):dataset[i] = [float(x) for x in dataset[i]] return datasetdef 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 separateByClass(dataset): separated = {} for i in range(len(dataset)):vector = dataset[i]if (vector[-1] not in separated): separated[vector[-1]] = []separated[vector[-1]].append(vector) return separateddef 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 summariesdef summarizeByClass(dataset): separated = separateByClass(dataset) summaries = {} for classValue, instances in separated.iteritems():summaries[classValue] = summarize(instances) return summariesdef 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)) * exponentdef calculateClassProbabilities(summaries, inputVector): probabilities = {} for classValue, classSummaries in summaries.iteritems():probabilities[classValue] = 1for i in range(len(classSummaries)): mean, stdev = classSummaries[i] x = inputVector[i] probabilities[classValue] *= calculateProbability(x, mean, stdev) return probabilitiesdef 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 bestLabel = classValue return bestLabeldef getPredictions(summaries, testSet): predictions = [] for i in range(len(testSet)):result = predict(summaries, testSet[i])predictions.append(result) return predictionsdef 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.0def main(): filename = ’pima-indians-diabetes.data.csv’ splitRatio = 0.67 dataset = loadCsv(filename) trainingSet, testSet = splitDataset(dataset, splitRatio) print(’Split {0} rows into train={1} and test={2} rows’).format(len(dataset), len(trainingSet), len(testSet)) # prepare model summaries = summarizeByClass(trainingSet) # test model predictions = getPredictions(summaries, testSet) accuracy = getAccuracy(testSet, predictions) print(’Accuracy: {0}%’).format(accuracy)main()
報錯如下:
Traceback (most recent call last): File 'E:/Data/BEYES/data_test.py', line 101, in <module> main() File 'E:/Data/BEYES/data_test.py', line 91, in main dataset = loadCsv(filename) File 'E:/Data/BEYES/data_test.py', line 8, in loadCsv dataset = list(lines)_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
數據格式如下,文件名為pima-indians-diabetes.data.csv:
6,148,72,35,0,33.6,0.627,50,11,85,66,29,0,26.6,0.351,31,08,183,64,0,0,23.3,0.672,32,11,89,66,23,94,28.1,0.167,21,00,137,40,35,168,43.1,2.288,33,15,116,74,0,0,25.6,0.201,30,03,78,50,32,88,31.0,0.248,26,110,115,0,0,0,35.3,0.134,29,02,197,70,45,543,30.5,0.158,53,18,125,96,0,0,0.0,0.232,54,14,110,92,0,0,37.6,0.191,30,010,168,74,0,0,38.0,0.537,34,110,139,80,0,0,27.1,1.441,57,01,189,60,23,846,30.1,0.398,59,15,166,72,19,175,25.8,0.587,51,17,100,0,0,0,30.0,0.484,32,10,118,84,47,230,45.8,0.551,31,17,107,74,0,0,29.6,0.254,31,11,103,30,38,83,43.3,0.183,33,01,115,70,30,96,34.6,0.529,32,13,126,88,41,235,39.3,0.704,27,08,99,84,0,0,35.4,0.388,50,07,196,90,0,0,39.8,0.451,41,19,119,80,35,0,29.0,0.263,29,111,143,94,33,146,36.6,0.254,51,1
問題解答
回答1:lines = csv.reader(open(filename, 'rb'))
是誰教你的?建議這樣寫:
def loadCsv(filename): dataset = [] with open(filename) as f:reader = csv.reader(f)for row in reader: dataset.append([float(x) for x in row]) return dataset
文檔里有例子的。
當然還能再省三行,不過那樣就對新手不太友好了。
PS: 報錯里根本沒有提到 iteritems。這是個 Python 2.x 才需要的方法,Python 3.x 里直接用 items 就可以了。
相關文章:
1. javascript - jquery選擇的dom元素如何更新?2. 視頻 - html5 video的autoplay 在智能手機上不運作?3. javascript - H5頁面無縫輪播4. python - Django問題 ’WSGIRequest’ object has no attribute ’user’5. mysql輸入賬號密碼后跳出一大堆內容后但卻進不了mysql?6. javascript - nodejs中使用request庫怎么抓取網頁中的圖片7. mysql服務無法啟動1067錯誤,誰知道正確的解決方法?8. .......9. 數據庫 - mysql boolean型無法插入true10. python - flask jinjia2 中怎么定義嵌套變量
