二分kmeans python實現

2022-09-13 22:12:29 字數 3412 閱讀 7438

今天要對乙個1000個個記錄,每個記錄有n個屬性的文字進行聚類,採用的是二分k均值方法。

演算法思想:

我參考了pang-ning tan資料探勘導論裡p317

相對於kmeans的優點是不受其初始質心的影響。

#coding utf-8

#python 3.4

#2015-4-3

#fitz yin

#[email protected]

from sklearn.cluster import

kmeans

import

numpy as np

defmakedict(f):

#建立行號和每行資料間的字典關係

a = [line.split() for line in

f] data_dict ={}

for i in

range(len(a)):

data_dict[i] =a[i]

return

data_dict

defkmeans(data):

#kmeans演算法

data =np.array(data)

computer=kmeans(n_clusters=2)

computer.fit(data)

labels =computer.labels_

one_class =

zero_class =

for i in

range(len(labels)):

if labels[i] == 1:

#0類的行號

else:#

1類的行號

centers = computer.cluster_centers_#

找到中心

cohesion_0,cohesion_1 = -1,-1#

初始化,自己和自己的cos是1

for i in

zero_class:

cohesion_0 += judge_cos(data[i],centers[0])#

0類cos評價

for i in

one_class:

cohesion_1 += judge_cos(data[i],centers[1])#

1類cos評價

return

zero_class,one_class,cohesion_0,cohesion_1

defjudge_cos(x,y):

#cos評價函式

af,bf,ab =0,0,0

for i in

range(len(x)):

af = float(x[i])*float(x[i])

bf = float(y[i])*float(y[i])

ab = float(x[i])*float(y[i])

if af == 0 or bf ==0:

print('

error')

return

0

#本例中不出現全是0情況

else

: cos_value = ab/(np.sqrt(af)*np.sqrt(bf))

return

cos_value

defgettransdict(split_set,split_number):

#建立kmeans計算的矩陣和原來矩陣 兩個行號之間的字典關係

a =split_set[split_number][0]

transdict ={}

for i in

range(len(a)):

transdict[i] =a[i]

return

transdict

defgetsplitset(split_set,split_number):

#簇中去掉要分的簇

new_split_set =

for i in

range(len(split_set)):

if i ==split_number:

pass

else

:

return

new_split_set

defgetsplitnumber(split_set):

#找尋待分簇的編號

split_number =0

temp =

for i in

range(len(split_set)):

for i in

range(len(temp)):

if temp[split_number] split_number =i

return

split_number

defmain():

f = open('

train.txt

','r

',encoding='

utf-8

').readlines()

data_dict =makedict(f)

k = 3#

分類個數

#sse = 0.001

split_set = [[[i for i in range(1000)],0]]#

此處1000是行號

split_number = 0#

需要分類的簇標號

while len(split_set) !=k:

transdict = gettransdict(split_set,split_number)#

轉換字典

array2kmeans = [data_dict[i] for i in split_set[split_number][0]]#

獲取二分kmeans計算矩陣

zero_class,one_class,cohesion_0,cohesion_1 =kmeans(array2kmeans)

real_zero_class = [transdict[i] for i in zero_class]#

**後的簇0

real_one_class = [transdict[i] for i in one_class]#

**後的簇1

split_set = getsplitset(split_set,split_number)#

將總的簇中去掉分的大的簇

#總的簇中加入分完的小簇

split_number = getsplitnumber(split_set)#

獲取下乙個迴圈待分的簇編號

print

(split_set)

#[[[行號1類],sse1],[[行號2類],sse2],[[行號三類],sse3]]

if__name__ == '

__main__':

main()

實訓日記(二) 分鏡

碎碎念 上次是第一次編寫,用的那個編輯器在首行縮排這一點上糾結好久.怎麼都縮不上,導致最後那篇劇本看起來有點亂糟糟的。然後這次隨意點到了富文字編輯器,感覺確實好用多了 小聲 我愛了!寫完才發現那個專案列表前面的點點不能縮排 微笑 看來是各有優劣。剛過去的兩周我們完成的任務是分鏡的編寫,將劇本視覺化。...

二分查詢演算法 Binary Search 的實現

第乙個實現是基於迭代方式 a sorted array key value the position of the key in the array.if this key is not found,return 1 public int binarysearchiteration int arra...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...