資源簡(jiǎn)介
python界面GUI實(shí)現(xiàn)k-means聚類算法,基于tkinter的界面簡(jiǎn)單代碼開發(fā)。k-means算法是自己寫的,不是調(diào)用的庫函數(shù)。程序最后可以實(shí)現(xiàn),隨機(jī)生成樣本點(diǎn),設(shè)置聚類中心數(shù),區(qū)分顏色顯示聚類結(jié)果,無限次迭代,退出等。
代碼片段和文件信息
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?tkinter
from??tkinter??import?ttk
from?matplotlib.backends.backend_tkagg?import?FigureCanvasTkAgg?NavigationToolbar2TkAgg
‘‘‘歐式距離‘‘‘
def?ecludDist(x?y):
????return?np.sqrt(sum(np.square(np.array(x)?-?np.array(y))))
‘‘‘曼哈頓距離‘‘‘
def?manhattanDist(x?y):
????return?np.sum(np.abs(x?-?y))
‘‘‘夾角余弦‘‘‘
def?cos(x?y):
????return?np.dot(x?y)/(np.linalg.norm(x)?*?np.linalg.norm(y))
‘‘‘計(jì)算簇的均值點(diǎn)‘‘‘
def?clusterMean(dataset):
????return?sum(np.array(dataset))?/?len(dataset)
‘‘‘生成隨機(jī)均值點(diǎn)‘‘‘
def?randCenter(dataset?k):
????temp?=?[]
????while?len(temp)?????????index?=?np.random.randint(0?len(dataset)-1)
????????if??index?not?in?temp:
????????????temp.append(index)
????return?np.array([dataset[i]?for?i?in?temp])
‘‘‘以數(shù)據(jù)集的前k個(gè)點(diǎn)為均值點(diǎn)‘‘‘
def?orderCenter(dataset?k):
????return?np.array([dataset[i]?for?i?in?range(k)])
def?quit():???????????????????????
????“““點(diǎn)擊退出按鈕時(shí)調(diào)用這個(gè)函數(shù)“““
????root.quit()??#?結(jié)束主循環(huán)
????root.destroy()??#?銷毀窗口
‘‘‘聚類‘‘‘
def?kMeans(dataset?dist?center?k):
????global?flagfa
????#all_kinds用于存放中間計(jì)算結(jié)果
????all_kinds?=?[]
????for?_?in?range(k):
????????temp?=?[]
????????all_kinds.append(temp)
????#計(jì)算每個(gè)點(diǎn)到各均值點(diǎn)的距離??
????for?i?in?dataset:
????????temp?=?[]
????????for?j?in?center:
????????????temp.append(dist(i?j))
????????all_kinds[temp.index(min(temp))].append(i)
????#打印中間結(jié)果????
????for?i?in?range(k):
????????print(‘第‘+str(i)+‘組:‘?all_kinds[i]?end=‘\n‘)
????flag?+=?1
????print(‘************************迭代‘+str(flag)+‘次***************************‘)
????#更新均值點(diǎn)
????center_?=?np.array([clusterMean(i)?for?i?in?all_kinds])
????if?(center_?==?center).all():
????????print(‘結(jié)束‘)
????????#f?=?plt.figure(figsize=(54)dpi=100)
????????#a?=?f.add_subplot(111)??#?添加子圖:1行1列第1個(gè)
????????for?i?in?range(k):
????????????print(‘第‘+str(i)+‘組均值點(diǎn):‘?center_[i]?end=‘\n‘)
????????????a.scatter([j[0]?for?j?in?all_kinds[i]]?[j[1]?for?j?in?all_kinds[i]]?marker=‘*‘)
????????a.grid()
????????plt.show()
????????canvas.draw
評(píng)論
共有 條評(píng)論