おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

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__']

インスタンス変数がセットされていない…。原因を究明中です。