k_means是一種聚類演算法,也是無監督學習演算法。
在乙個典型的監督學習中,我們有乙個有標籤的訓練集,我們的目標是找到能夠區分正
樣本和負樣本的決策邊界,在這裡的監督學習中,我們有一系列標籤,我們需要據此擬合一
個假設函式。與此不同的是,在非監督學習中,我們的資料沒有附帶任何標籤。
資料看起來可以分成幾個點集(簇),乙個能夠找到圈出這些點集的演算法被稱為聚類演算法。
k-均值是乙個迭代演算法,
主要操作是簇分配和移動聚類中心。
假設我們想要將資料聚類成 n 個組,其方法為:
首先選擇?個隨機的點,稱為聚類中心(cluster centroids);
對於資料集中的每乙個資料,按照距離?個中心點的距離,將其與距離最近的中心點關
聯起來,與同乙個中心點關聯的所有點聚成一類。
計算每乙個組的平均值,將該組所關聯的中心點移動到平均值的位置。
重複步驟 2-4 直至中心點不再變化。
通俗講就是遍歷每個樣本,根據每乙個點與那選擇的k個中心的距離遠近,把點與距離最近的中心關聯起來。
再移動聚類中心,就是計算分成的每個簇求平均值,平均值即為新的聚類中心點。
然後不斷重複以上兩個步驟進行迭代。直到中心質點不再發生變化。
k_means演算法輸入的是資料集和k(簇的個數),資料集是沒有標籤的向量,並且規定是n維,不是n+1維。
k_means演算法第一步是隨機選取k個中心,並且迴圈遍歷所有資料,計算和每個中心的距離,並將其歸到哪乙個簇。就是找到能夠使點到中心點最小的k值,然後歸為一簇,計算距離一般用平方,這是慣例。這就是簇分配步驟。
第二步移動中心聚點,重新計算每個簇的均值,重新規定新的質點。如果遇到沒有聚點的中心,一般選擇刪除。
k_means演算法的優化目標
優化目標是使每個點到聚類中心距離的平方和最小,這也是k_means的代價函式。也叫失真代價函式和k_means演算法的失真。
他要找到每個點所屬的簇和中心質點來使代價函式取得最小值。
簇分配的步驟就是在保持聚類中心的位置不變來最小化代價函式。
移動中心質點使通過改變u的值來最小化代價函式。所以k_means演算法的實質是分別通過找到每個點距離最近的簇和移動中心質點來最小化代價函式。然後保持迭代,最後達到聚類目標。
再來說一下,如何選擇k值,一般通過觀察就可以確定k的值,但是由於無監督學習的特性,使得k沒有確定的值,我們只能通過一些規定來確定一些比較合適的k值。
比如「肘部法則」,就是把k值當作橫座標,代價函式的值作為縱座標。畫出函式影象,如果有明顯的拐點,我們就選擇拐點作為k值。
不過一般影象都是平滑的曲線,不容易看出拐點。那麼可以根據實際情況,按照實際需求來決定k值。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
class kmeans():
def __init__(self, x, k, max_iters = 10):
'''max_iters:最大迭代次數
x:資料集
k:分成的群數'''
self.x = x
self.k = k
self.max_iters = max_iters
#返回x的每行所屬的中心點索引
def findclosestcentroids(self, centroids):
# 總共有len(x)行資料,所以idx是乙個 len(x) * 1的矩陣
idx = np.zeros(len(self.x )).reshape( self.x .shape[0],-1)
for i in range(len(self.x )):
mindistance = float('inf');#初始化無限大
index = 0
for k in range(len(centroids)):
#計算每個點到相應質心的距離
distance = np.sum(np.power(self.x [i]-centroids[k],2))
#不斷更新最近的質心資訊
if(distance首先先隨機找出k個質心。然後進行簇分類和移動質心並且不斷迭代。
kmeans演算法(python實現)
import numpy as np import matplotlib.pyplot as plt initialize center函式通過使用numpy庫的 zeros函式和random.uniform函式,隨機選取 了k個資料做聚類中心,並將結果存放在 了k個資料做聚類中心,並將結果存放在 ...
python簡易實現k means
用dist存放所有資料到中心的距離,有n行 n組資料 k 1列 前k列分別存放到第i個類中心的距離,最後一列存放分到了第幾類 usr bin env python coding utf 8 import numpy as np n 100 x np.arange 100 y np.arange 20...
k means演算法實現python
import numpy as np import matplotlib.pyplot as plt 兩點距離 defdistance e1,e2 return np.sqrt e1 0 e2 0 2 e1 1 e2 1 2 集合中心 defmeans arr return np.array np....