k-meansを書き直した
自分のコードみて無駄なところを省いた。
いろんな人の参考にしたけど、自分のコードがくそすぎた。
(さっさとknnを実装して公開します。はい。)
使い方:
import Rkmeans as R
k = 2
p = R.kms(input,k)
p.kmeans(input,k)
#-*- coding:utf-8 -*- #使い方 #import Rkmeans as R #R.kms(input,k) import numpy as np class kms: def __init__(self,input,k): #入力データの行と列の数を決める #列 self.nDATA = np.shape(input)[0] #行 self.nK = np.shape(input)[1] #初期化 self.mu = np.random.rand(k,self.nK) self.r = np.zeros((self.nDATA,k)) def kmeans(self,input,k,update=100): for i in xrange(update): OLD = (self.r).copy() self.r = self.E_step(input) if np.all( self.r == OLD): break self.mu = self.M_step(input) return self.r def E_step(self,input): for n in xrange(np.shape(self.r)[0]): for k in xrange(np.shape(self.r)[1]): if k == np.argmin(((input[n]-self.mu)**2).sum(axis=1)): self.r[n][k] = 1 else: self.r[n][k] = 0 return self.r def M_step(self,input): A = np.dot((self.r).T,input) B = (self.r).sum(axis=0) for n in xrange(np.shape(self.mu)[0]): for k in xrange(np.shape(self.mu)[1]): self.mu[n][k] = A[n][k]/B[n] return self.mu