k - mean 알고리즘 구현
#################################################
import random
import time
t1 = time.time()
dataset = []
with open('iries.txt', 'r') as f:
for line in f:
ds = tuple([ float(x) for x in line.split() ])
dataset.append(ds)
#for x in dataset:
# print x[0], x[1], x[2], x[3]
#
def distance(x, y):
z = 0
for i in range(4):
z = z + pow((x[i] - y[i]), 2)
return pow(z, 0.5)
#print distance(dataset[1], dataset[2])
def get_means(ds):
a = b = c = d = 0.0
l = len(ds)
for x in ds:
a += x[0]
b += x[1]
c += x[2]
d += x[3]
return (a/l, b/l, c/l , d/l)
def gettotaldistance(clusters):
'''
[[(1,2,3,4), [(2,3,4,5),(3,4,5,6)...]], [(6,7,8,9),[...]],...]
'''
sum = 0
for cluster in clusters:
for point in cluster[1]:
sum += distance(cluster[0], point)
return sum
def push_into_cluster(clusters, point):
c = 0
d = distance(clusters[0][0], point)
for x in range(1, len(clusters)):
temp = distance(clusters[x][0], point)
if temp < d:
d = temp
c = x
clusters[c][1].append(point)
def kmeans(k = 3):
rn_center = random.sample(dataset, k)
clusters = []
for x in rn_center:
clusters.append([x, []])
print clusters
oldtotal = 999999999
while True:
for point in dataset:
push_into_cluster(clusters, point)
for cluster in clusters:
cluster[0] = get_means(cluster[1])
newtotal = gettotaldistance(clusters)
if oldtotal - newtotal > 1:
oldtotal = newtotal
for cluster in clusters:
cluster[1] = []
else:
print '============================'
for x in clusters:
print '-------------------------'
print x[0]
break
kmeans(k = 5)
print time.time() - t1
그 중에서 iries. txt 는 http://www.codeforge.cn/read/186226/irises.txt__html
다음은 pprocess 모듈 을 사용 하여 병렬 계산 한 k - maeans 알고리즘 입 니 다. 그러나 그다지 좋 지 않 습 니 다. 조금 만 병렬 계산 을 사 용 했 습 니 다. 병렬 계산 에 익숙 하지 않 습 니 다.
import random
import time
import pprocess
t1 = time.time()
limit = 2 #core num
dataset = []
with open('iries.txt', 'r') as f:
for line in f:
ds = tuple([ float(x) for x in line.split() ])
dataset.append(ds)
#for x in dataset:
# print x[0], x[1], x[2], x[3]
#
def distance(x, y):
z = 0
for i in range(4):
z = z + pow((x[i] - y[i]), 2)
return pow(z, 0.5)
#print distance(dataset[1], dataset[2])
def get_means(ds):
a = b = c = d = 0.0
l = len(ds)
for x in ds:
a += x[0]
b += x[1]
c += x[2]
d += x[3]
return (a/l, b/l, c/l , d/l)
def gettotaldistance(clusters):
'''
[[(1,2,3,4), [(2,3,4,5),(3,4,5,6)...]], [(6,7,8,9),[...]],...]
'''
td = 0
results = pprocess.Map(limit = limit)
calc = results.manage(pprocess.MakeParallel(distance))
for cluster in clusters:
for point in cluster[1]:
calc(cluster[0], point)
td = sum(results)
print '------------------', results, td
return td
def push_into_cluster(clusters, point):
#results = pprocess.pmap(lambda x: distance(x, point), [ y[0] for y in clusters], limit = limit)
#print '#########', results
#minvalue = min(results)
#print minvalue
c = 0
d = distance(clusters[0][0], point)
for x in range(1, len(clusters)):
temp = distance(clusters[x][0], point)
if temp < d:
d = temp
c = x
clusters[c][1].append(point)
def kmeans(k = 3, eps = 1):
rn_center = random.sample(dataset, k)
clusters = []
for x in rn_center:
clusters.append([x, []])
print clusters
oldtotal = 999999999
while True:
for point in dataset:
push_into_cluster(clusters, point)
for cluster in clusters:
cluster[0] = get_means(cluster[1])
newtotal = gettotaldistance(clusters)
if oldtotal - newtotal > eps:
oldtotal = newtotal
for cluster in clusters:
cluster[1] = []
else:
print '============================'
for x in clusters:
print '-------------------------'
print x[0]
break
kmeans(k = 5, eps = 0.5)
print time.time() - t1
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.