Python:集合知プログラミング(インスタンス変数について)
これはオライリーの集合知プログラミングで出てくるサンプルプログラムを少々変えたものです。
内容はクラスがbicluster,関数がEuclidean,hcluster2つが宣言されているだけです。で最後に
biclusterのオブジェクトを作成して内容を確認するだけです。だから実際には2つの関数は使われていません。
#! /usr/bin/env python # class_cluster.py class bicluster: def __init__(self,vec,left=None,right=None,distance=0.0,id=None): self.left=left self.right=right self.vec=vec self.id=id self.distance=distance def Euclidean(list1,list2): sum=0 for i in range(len(list1)): for j in range(len(list2)): sum+=list1[i]*list1[j] return sum**1/2 def hcluster(rows,distance=Euclidean): distance={} currentclustid=-1 clust=[bicluster(rows[i],id=i) for i in range(len(rows))] while len(clust)>1: lowestpair=(0,1) closest=distance(clust[0].vec,clust[1].vec) for i in range(len(clust)): for j in range(i+1,len(clust)): if (clust[i].id, clust[j].id) not in distances: distances[(clust[i].id,clust[j].id)]=distance(clust[i].vec,clust[j].vec) d=distances[(clust[i].vec,clust[j].vec)] if d<closest: closest=d lowestpair=(i,j) mergevec=[ (clust[lowestpair[0]].vec[i]+clust[lowestpair[1]].vec[i])/2.0 for i in range(len(clust[0].vec))] newcluster=bicluster(mergevec,left=clust[lowestpair[0]], right=clust[lowestpair[1]], distance=closest,id=currentclustid) currentclustid-=1 del clust[lowestpair[1]] del clust[lowestpair[0]] clust.append(newcluster) test=bicluster(1) print dir(bicluster)
実行結果
$ class_cluster.py ['__doc__', '__init__', '__module__']
…インスタンス変数がセットされていない…。原因を究明中です。