0
生の数字データのヒストグラムを784次元で取得したいと考えています。ここで が私のコードです:'numpy.ndarray'オブジェクトには '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()
しかし、間違って何かがある:加え
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'
は、ここ桁のデータセットは次のとおりです。
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:]
次に、どのように私はそれを修正することができますか? Pythonの初心者として、私はプロットの非常に混乱しています。
お返事ありがとうございます。私はiteritems()が辞書ではなく配列に使われていることを知っています。しかし、関数def exampleDistance(x1、x2)は教授によって与えられます。私はexampleDistance(x1、x2)の変更を最小限に抑えなければならないと思いますが、どうやってそれを行うのか分かりません。 – JennyShen
'iteritems'をあなたの関数で' items'を使って変更しようとすると、 'for i、v1 in x1.items()'に変更できますか? –
キーを持つ辞書があると仮定して、列挙(x1.iteritems()、1): 'でi、v1のために'を試してください。これはトリックを行う必要があります。ここで '1 'はインデックスを1から始めるように設定しています。 –