Python中使用K-means算法
python中使用K-means算法
k-means是機器學習中最常用的聚類算法,關于k-means算法的數學原理、算法、偽碼等已有相當豐富的文獻,在此不再贅述。
1、調用以下庫
importnumpyasnp#用于抽樣和生成隨機數
fromsklearn.clusterimportKMeans#sklearn自帶的Kmeans算法,用于嚴重本文算法結果是否正確
importmatplotlib.pyplotasplt#結果可視化
importsys#需要用到sys.exit()函數
若不需要驗證聚類結果是否可以不使用Sklearn庫。
2、生成用于訓練的隨機數據
np.set_printoptions(suppress=True)#令numpy的結果不以科學計數法的方式輸出
Data=np.array([[1.0,2.0],[1.5,1.8],[3,4],[6,8],[8,8],[1,0.6],
[9,11],[7,10]])#你也可以通過抽樣的方式來更快的獲得測試數據
3、定義用于選擇隨機初始點和簇數(k)的函數
defK_means(data,k):
globalMean
mean=[]
a=np.max(data[:,0])
b=np.min(data[:,0])
c=np.max(data[:,1])
d=np.min(data[:,1])
foriinrange(k):
x=np.random.uniform(a,b,1)
#此處返回array
y=np.random.uniform(c,d,1)#此處返回array
mean.append([float(x),float(y)])
Mean=np.array(mean)
returnMean
在上面的代碼中,為了限定初始點(x,y)的位置不會超出樣本點的范圍,因此均勻抽樣的上下限是指訓練數據(a,b)和(c,d)的最小橫距。
4、定義可視化函數,繪制測試數據散點圖
defvision(data,cell):
plt.figure(figsize=(12,6))
ax1=plt.subplot(121)
ax1.scatter(Data[:,0],Data[:,1])#原始數據散點圖
ax1.scatter(point[:,0],point[:,0])#同時將隨機選取的初始點表示出來
plt.xlabel("x")
plt.ylabel("y")
plt.title("scatterof"+"rural"+"data")
ax2=plt.subplot(122)
ax2.scatter(Data[:,0],Data[:,1])#原始數據散點圖
ax2.scatter(data[:,0],data[:,1])#經過迭代后最終確定的聚類點
plt.xlabel("x")
plt.ylabel("y")
plt.title("scatterof"+cell+"data")
plt.show()
聚類結果的可視化對于判斷聚類結果的準確性至關重要。
5、定義迭代過程,通過不斷計算各個樣本對聚類點的歐式聚類,來不斷更新聚類點
defiteration(Data,point):
A=[]
B=[]
foriinrange(len(Data)):
d1=np.sqrt(sum(pow(Data[i]-point[0],2)))
d2=np.sqrt(sum(pow(Data[i]-point[1],2)))
ifd1>d2:
A.append(list(Data[i]))
else:
B.append(list(Data[i]))
iflen(A)==len(Data)orlen(B)==len(Data):
print("初始化錯誤")
sys.exit(0)
new_x1=np.mean(np.array(A)[:,0])
new_y1=np.mean(np.array(A)[:,1])
new_x2=np.mean(np.array(B)[:,0])
new_y2=np.mean(np.array(B)[:,1])
new_point=np.array([[new_x1,new_y1],[new_x2,new_y2]])
returnnew_point
注意,上段代碼中加入了一個if語句
iflen(A)==len(Data)orlen(B)==len(Data):
print("初始化錯誤")
sys.exit(0)
由于初始點是隨機產生的,所以這個條件語句是非常必要的,因此有可能所有的樣本點都只接近一個聚類中心而遠離另一個聚類中心,這樣就不能形成兩個聚類中心,程序將會報錯,因此我們需要排除出現這種情況的可能性。一旦所有樣本點都接近一個聚類中心時令程序停止。
以上就是Python中使用K-means算法,希望能對大家有所幫助!更多Python學習教程請關注IT培訓機構:千鋒教育。

相關推薦HOT
更多>>
pythonfor循環是什么
pythonfor循環是什么在做遍歷的時候,對于一些數據的反復循環執行,我們會用到for循環的語句。可以說這是新手入門必學的語句之一,在很多基礎循...詳情>>
2023-11-13 07:46:36
pythoncontextmanager()的轉換
python中contextmanager()的轉換1、說明當發出請求時,requests庫會在將請求實際發送到目標服務器之前準備該請求。請求準備包括像驗證頭信息和...詳情>>
2023-11-13 06:34:35
python使用items()遍歷鍵值對
python使用items()遍歷鍵值對字典可以用來存儲各種方式的信息,所以有很多方式可以通過字典的所有鍵值對、鍵或值。說明1、即使通過字典,鍵值對...詳情>>
2023-11-13 04:24:15
python實例方法中self的作用
python實例方法中self的作用說明1、無論是創建類的構造方法還是實例方法,最少要包含一個參數self。2、通過實例的self參數與對象進行綁定,程序...詳情>>
2023-11-13 03:46:48