试图在Iris Fisher数据集上实现K邻域。怎么了?谢谢。
import matplotlib as mpl
import math
f=open('Iris.txt', 'r')
row_array=f.readlines()
all_points=[]
class point(object):
def __init__(self, x, y):
self.x=x
self.y=y
class pair(object):
def __init__(self, d, i):
self.d= d
self.ind=i
k=4
for i in range(150):
tmp_rec=[4, 5]
for a in range(2):
tmp =row_array[i][0 + 8*a] + row_array[i][1 + 8*a] + row_array[i][2 + 8*a]
tmp_rec[a]=float(tmp)
all_points.append(point(tmp_rec[0], tmp_rec[1]))
learn_points=[all_points[i] for i in range(25)]
learn_points.append([all_points[50 + i] for i in range(25)])
learn_points.append([all_points[100 + i] for i in range(25)])
def d(i, j):
return math.sqrt(pow(all_points[i].x-all_points[j].x,2) + pow(all_points[i].y- all_points[j].y, 2))
def byDist_key(pair):
return pair.d
def K_neig(i):
tmp=[pair(d(i,j), j) for j in range(25)]
tmp.append([pair(d(i,50 + j), 50 + j) for j in range(25)])
tmp.append([pair(d(i,100 + j), 100 + j) for j in range(25)])
tmp=sorted(tmp, key = byDist_key)
return [tmp[L].i for L in range(k)]
def votes(klass, i):
tmp=K_neig(i)
s=0
for j in tmp:
if (j>=klass * 50 and j <klass * 50 +50):
s+=1.0 / pow(d(i, j), 2)
return s
def klass(i):
m= -1
ind=-1
for j in range(3):
if(votes(j, i)>=max):
max= votes(j, i)
ind = j
return ind
n = 3
m = 3
confusion = [[0] * m for i in range(n)]
for i in range(3):
t= 50 * i
for j in range(25):
confusion[i][klass(t + j)]+=1
confusion
f.close()
但是程序返回:
<ipython-input-88-cbe26db1600f> in byDist_key(pair)
26 return math.sqrt(pow(all_points[i].x-all_points[j].x,2) + pow(all_points[i].y- all_points[j].y, 2))
27 def byDist_key(pair):
---> 28 return pair.d
29 def K_neig(i):
30 tmp=[pair(d(i,j), j) for j in range(25)]
AttributeError: 'list' object has no attribute 'd'