今天要對乙個1000個個記錄,每個記錄有n個屬性的文字進行聚類,採用的是二分k均值方法。
演算法思想:
我參考了pang-ning tan資料探勘導論裡p317
相對於kmeans的優點是不受其初始質心的影響。
#coding utf-8#python 3.4
#2015-4-3
#fitz yin
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)#
獲取下乙個迴圈待分的簇編號
(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 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...