如何利用python實(shí)現(xiàn)kmeans聚類(lèi)
一、先上手?jǐn)]代碼!
1、首先是導(dǎo)入所需要的庫(kù)和數(shù)據(jù)
import pandas as pd
import numpy as np
import random
import math
import matplotlib.pyplot as plt
# 這兩行代碼解決 plt 中文顯示的問(wèn)題
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('13信科學(xué)生成績(jī).xlsx')
data = np.array(df)
df.head(10)先給大伙們看看數(shù)據(jù)集長(zhǎng)啥樣:

用matplotlib簡(jiǎn)單的可視化一下初始數(shù)據(jù):
# 輸入數(shù)據(jù)
x = data.T[0]
y = data.T[1]
plt.scatter(x, y, s=50, c='r') # 畫(huà)散點(diǎn)圖
plt.xlabel('平時(shí)') # 橫坐標(biāo)軸標(biāo)題
plt.ylabel('期末') # 縱坐標(biāo)軸標(biāo)題
plt.show()
2、接下來(lái)就是kmeans的核心算法了
k=3
i = 1
min1 = data.min(axis = 0)
max1 = data.max(axis = 0)
#在數(shù)據(jù)最大最小值中隨機(jī)生成k個(gè)初始聚類(lèi)中心,保存為t
centre = np.empty((k,2))
for i in range(k):
centre[i][0] = random.randint(min1[0],max1[0])#平時(shí)成績(jī)
centre[i][1] = random.randint(min1[1],max1[1])#期末成績(jī)
while i<500:
#計(jì)算歐氏距離
def euclidean_distance(List,t):
return math.sqrt(((List[0] - t[0])**2 + (List[1] - t[1])**2))
#每個(gè)點(diǎn)到每個(gè)中心點(diǎn)的距離矩陣
dis = np.empty((len(data),k))
for i in range(len(data)):
for j in range(k):
dis[i][j] = euclidean_distance(data[i],centre[j])
#初始化分類(lèi)矩陣
classify = []
for i in range(k):
classify.append([])
#比較距離并分類(lèi)
for i in range(len(data)):
List = dis[i].tolist()
index = List.index(dis[i].min())
classify[index].append(i)
#構(gòu)造新的中心點(diǎn)
new_centre = np.empty((k,2))
for i in range(len(classify)):
new_centre[i][0] = np.sum(data[classify[i]][0])/len(classify[i])
new_centre[i][1] = np.sum(data[classify[i]][1])/len(classify[i])
#比較新的中心點(diǎn)和舊的中心點(diǎn)是否一樣
if (new_centre == centre).all():
break
else:
centre = new_centre
i = i + 1
# print('迭代次數(shù)為:',i)
print('聚類(lèi)中心為:',new_centre)
print('分類(lèi)情況為:',classify)注意?。?!這里的k是指分成k類(lèi),讀者可以自行選取不同的k值做實(shí)驗(yàn)

3、可視化部分(將不用類(lèi)用不同顏色區(qū)分開(kāi)來(lái)~~)
mark = ['or', 'ob', 'og', 'ok','sb', 'db', '<b', 'pb'] #紅、藍(lán)、綠、黑四種顏色的圓點(diǎn)
#mark=['sb', 'db', '<b', 'pb']
plt.figure(3)#創(chuàng)建圖表1
for i in range(0,k):
x=[]
y=[]
for j in range(len(classify[i])):
x.append(data[classify[i][j]][0])
y.append(data[classify[i][j]][1])
plt.xlim(xmax=105,xmin=45)
plt.ylim(ymax=85,ymin=-5)
plt.plot(x,y,mark[i])
#plt.show()一起來(lái)康康可視化結(jié)果8??!

二、接下來(lái)是調(diào)庫(kù)代碼?。╯klearn)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics
df = pd.read_excel('13信科學(xué)生成績(jī).xlsx')
data = np.array(df)
y_pred=KMeans(n_clusters=3,random_state=9).fit_predict(data)
plt.scatter(data[:,0],data[:,1],c=y_pred)
plt.show()
print(metrics.calinski_harabasz_score(data,y_pred))可視化結(jié)果和手?jǐn)]的結(jié)果略有差別,有可能是數(shù)據(jù)集的問(wèn)題,也有可能是k值選取的問(wèn)題,各位親們不需要擔(dān)心?。?!

附:對(duì)k-means算法的認(rèn)識(shí)
1.優(yōu)點(diǎn)
(1)算法快速、簡(jiǎn)單。
(2)對(duì)大數(shù)據(jù)集有較高的效率并且是可伸縮性的。
(3)時(shí)間復(fù)雜度近于線(xiàn)性,而且適合挖掘大規(guī)模數(shù)據(jù)集。K-Means聚類(lèi)算法的時(shí)間復(fù)雜度是O(nkt) ,其中n代表數(shù)據(jù)集中對(duì)象的數(shù)量,t代表著算法迭代的次數(shù),k代表著簇的數(shù)目。
2.缺點(diǎn)
(1)聚類(lèi)是一種無(wú)監(jiān)督的學(xué)習(xí)方法,在 K-means 算法中 K 是事先給定的,K均值算法需要用戶(hù)指定創(chuàng)建的簇?cái)?shù)k,但這個(gè) K 值的選定是非常難以估計(jì)的。
(2)在 K-means 算法中,首先需要根據(jù)初始聚類(lèi)中心來(lái)確定一個(gè)初始劃分,然后對(duì)初始劃分進(jìn)行優(yōu)化。這個(gè)初始聚類(lèi)中心的選擇對(duì)聚類(lèi)結(jié)果有較大的影響,一旦初始值選擇的不好,可能無(wú)法得到有效的聚類(lèi)結(jié)果,這也成為 K-means算法的一個(gè)主要問(wèn)題。
(3)從 K-means 算法框架可以看出,該算法需要不斷地進(jìn)行樣本分類(lèi)調(diào)整,不斷地計(jì)算調(diào)整后的新的聚類(lèi)中心,因此當(dāng)數(shù)據(jù)量非常大時(shí),算法的時(shí)間開(kāi)銷(xiāo)是非常大的。所以需要對(duì)算法的時(shí)間復(fù)雜度進(jìn)行分析、改進(jìn),提高算法應(yīng)用范圍,而這導(dǎo)致K均值算法在大數(shù)據(jù)集上收斂較慢。
總結(jié)
到此這篇關(guān)于如何利用python實(shí)現(xiàn)kmeans聚類(lèi)的文章就介紹到這了,更多相關(guān)python實(shí)現(xiàn)kmeans聚類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
提高Python生產(chǎn)力的五個(gè)Jupyter notebook插件
Jupyter Notebook 因其可用性和實(shí)用性而成為數(shù)據(jù)分析和機(jī)器學(xué)習(xí)模型領(lǐng)域最流行的 IDE,它也是很多數(shù)據(jù)初學(xué)者的首選 IDE。它最具特色的是,擁有豐富的插件、擴(kuò)展數(shù)據(jù)處理能力和提升工作效率2021-11-11
Python3使用TCP編寫(xiě)一個(gè)簡(jiǎn)易的文件下載器功能
這篇文章主要介紹了Python3使用TCP編寫(xiě)一個(gè)簡(jiǎn)易的文件下載器功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
Python之sklearn數(shù)據(jù)預(yù)處理中fit(),transform()與fit_transform()的區(qū)別
這篇文章主要介紹了Python之sklearn數(shù)據(jù)預(yù)處理中fit(),transform()與fit_transform()的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python?mistune庫(kù)靈活的Markdown解析器使用實(shí)例探索
本文將深入介紹Python?Mistune,包括其基本概念、安裝方法、示例代碼以及一些高級(jí)用法,以幫助大家充分利用這一工具來(lái)處理Markdown文本2024-01-01
python正則表達(dá)式修復(fù)網(wǎng)站文章字體不統(tǒng)一的解決方法
python正則表達(dá)式修復(fù)網(wǎng)站文章字體不統(tǒng)一的解決方法,需要的朋友可以參考一下2013-02-02
Python實(shí)現(xiàn)智能貪吃蛇游戲的示例代碼
我想大家都玩過(guò)諾基亞上面的貪吃蛇吧,這篇文章將帶你一步步用python語(yǔ)言實(shí)現(xiàn)一個(gè)snake小游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-07-07

