k-means清書しました。

まだまだ汚いですが、清書しました。
もう書きたくないです。笑
というわけで最終版になりそうですねー。
ベクトルはIndexで管理したいんですけど、
平均を求めるときとか少しめんどくさいんですよね。
まぁネストしてる関数だから、その関数上で使えればいいんですけどね。

 1:  def kmeans(D, k, C=None, sim=simcos):
 2:      import numpy
 3:      import copy
 4:      class Cluster(list):
 5:          def __init__(self, initlist=None, initmean=None):
 6:              if initlist is not None:
 7:                  self = initlist
 8:              if initmean is not None:
 9:                  self.mean = initmean
10:              else:
11:                  self.mean = 0
12:          def setmean(self, mean=None):
13:              if not self:
14:                  print "test"
15:                  return
16:              elif mean is None:
17:                  l = list()
18:                  for i in self:
19:                      l.append(D[i])
20:                  self.mean = numpy.array(l).sum(axis=0)
21:              else:
22:                  self.mean = mean
23:          def init(self):
24:              del self[:]
25:          def __repr__(self):
26:              str = ""
27:              str += "-----------------------------------------------------------------\n"
28:              str += "{"
29:              for i in self:
30:                  str += repr(i)+" "
31:              str += "}\n"
32:              str += "mean:"+repr(self.mean)
33:              return str
34:      def sim(v1, v2):
35:          return numpy.dot(v1, v2) / (numpy.sqrt(numpy.dot(v1, v1)) * numpy.sqrt(numpy.dot(v2, v2)))
36:      def initclusters(c=None):
37:          if c is None:
38:              #ベクトルはクラスタリングせずに、初期値だけ与えておく
39:              m = D.sum(axis=0)
40:              l = m / k
41:              c = []
42:              for i in range(k):
43:                  c.append(Cluster(initmean=l*(i+1)))
44:              return c
45:          else:
46:              new = copy.deepcopy(c)
47:              for i in new:
48:                  i.init()
49:              return new
50:      def argmax(v):
51:          max = -float("inf")
52:          maxindex = 0
53:          for i in range(len(c)):
54:              s = sim(v, c[i].mean)
55:              if max < s:
56:                  max, maxindex = s, i
57:          return maxindex
58:      def estimatemean():
59:          for i in c:
60:              i.setmean()
61:              i.mean
62:      if C is None:
63:          c = initclusters()
64:      else:
65:          pass
66:      old = None
67:      while old != c:
68:          old = copy.deepcopy(c)
69:          c = initclusters(c)
70:          for i in range(len(D)):
71:              j = argmax(D[i])
72:              c[j].append(i)
73:          #更新
74:          estimatemean()
75:          for i, j in enumerate(c):
76:              print i, repr(j)
77:          print ""

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中