0
Ich möchte ein Histogramm der Rohdaten in 784 Dimensionen erhalten. Hier ist mein Code:'numpy.darray' Objekt hat kein Attribut 'iteritems'
import sys,os
from math import *
import random
from numpy import *
import matplotlib.pyplot as plt
import datasets
waitForEnter=False
def exampleDistance(x1, x2):
dist = 0.
for i,v1 in x1.iteritems():
v2 = 0.
if x2.has_key(i): v2 = x2[i]
dist += (v1 - v2) * (v1 - v2)
for i,v2 in x2.iteritems():
if not x1.has_key(i):
dist += v2 * v2
return sqrt(dist)
def computeDistances(data):
#N = len(data)
#D = len(data[0])
N, D = data.shape
dist = []
for n in range(N):
for m in range(n):
dist.append(exampleDistance(data[n],data[m])/sqrt(D))
return dist
Dims = [784]
#Cols = ['#FF0000', '#880000', '#000000', '#000088', '#0000FF']
Cols = ['#FF0000']
Bins = arange(0, 1, 0.02)
plt.xlabel('distance/sqrt(dimensionality)')
plt.ylabel('# of pairs of points at that distance')
#plt.title('dimensionality versus uniform point distances')
plt.title('dimensionality versus digits data point distances')
for i,d in enumerate(Dims):
distances = computeDistances(datasets.DigitData.X)
print "D=%d, average distance=%g" % (d, mean(distances) * sqrt(d))
plt.hist(distances,
Bins,
histtype='step',
color=Cols[i])
if waitForEnter:
plt.legend(['%d dims' % d for d in Dims])
plt.show(False)
x = raw_input('Press enter to continue...')
plt.legend(['%d dims' % d for d in Dims])
plt.savefig('fig.pdf')
plt.show()
Aber es ist etwas nicht in Ordnung:
Traceback (most recent call last):
File "HW3.py", line 56, in <module>
distances = computeDistances(datasets.DigitData.X)
File "HW3.py", line 39, in computeDistances
dist.append(exampleDistance(data[n],data[m])/sqrt(D))
File "HW3.py", line 23, in exampleDistance
for i,v1 in x1.iteritems():
AttributeError: 'numpy.ndarray' object has no attribute 'iteritems'
Außerdem ist hier die Ziffer Datensätze:
class DigitData:
Xall,Yall = loadDigitData('data/1vs2.all')
N,D = Xall.shape
N0 = int(float(N) * 0.5)
X = Xall[0:N0,:]
Y = Yall[0:N0]
Xte = Xall[N0:,:]
Yte = Yall[N0:]
Dann, wie kann ich es beheben? Als Python Anfänger bin ich sehr verwirrt von Plotten.
Danke für die Beantwortung. Ich weiß, iteritems() wird für Dictionary nicht array verwendet. Die Funktion def exampleDistance (x1, x2): wird von Prof. gegeben. Sie ließ uns diese Funktion verwenden, um die Entfernung zu berechnen. Ich denke, ich muss die Änderung in exampleDistance (x1, x2) minimieren, aber ich weiß nicht wie? – JennyShen
können Sie versuchen, 'iteritems' mit' items' in Ihrer Funktion zu ändern, ändern Sie es in 'für i, v1 in x1.items()'? –
Angenommen, Sie haben ein Wörterbuch mit Schlüsseln, versuchen Sie 'für i, v1 in enumerate (x1.iteritems(), 1):'. Dies sollte den Trick machen. Hier setzt '1' den Index von 1 ausgehend. –