k-means聚類是聚類分析中比較基礎的演算法,屬於典型的非監督學習演算法。
其定義為對未知標記的資料集,按照資料內部存在的資料特徵將資料集劃分為多個不同的類別,使類別內的資料盡可能接近,類別間的資料相似度比較大。用於衡量距離的方法主要有曼哈頓距離、歐氏距離、切比雪夫距離,其中歐氏距離較為常用。
演算法原理如下:
1.建立k個點作為初始質心(通常是隨機選擇)
2.當任意乙個點的簇分類結果發生改變時
2.1對資料的每乙個點,計算每乙個質心與該資料點的距離,將資料點分配到距其最近的簇
2.2對於每乙個簇,計算簇中所有點的均值並將均值作為質心
停止條件為:所有的點類別劃分都不再改變為止
k均值聚類演算法原理簡單易懂,聚類效果較好,但是其缺陷也較為明顯:
1、對離群值比較敏感;
2、聚類個數的選擇會影響最終聚類效果;
3、初始化聚類中心的選擇會影響聚類效果。
以下是k-means聚類的偽**:
演算法實現:
經典的k-means均值聚類**演算法實現並不複雜,以下給出r語言實現過程:
## !/user/bin/env rstudio 1.1.423
## -*- coding: utf-8 -*-
## k-means model
library("dplyr")
library('magrittr')
library('ggplot2')
rm(list = ls())
gc()
資料輸入、標準化:
data_input
歐式距離計算:
disteclud
隨機質心選擇:
randcentre
return (centres)
}
k-means聚類構建:
kmeans_cluster
}if(clusterassment[i,1] != minindex)
}for(cent in 1:k)
print(centres)
}return (
list(
centres = centres,
clusterassment = clusterassment))
}
聚類模型執行與結果輸出:
以下是基於python的k-means演算法原始碼實現:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.metrics import confusion_matrix
from matplotlib import pyplot as plt
資料輸入與標準化:
def datainput():
data = pd.read_csv("d:/python/file/iris.csv")
data.columns = ['sepal_length','sepal_width','petal_length','petal_width','class']
print(data.shape,'\n',data.head())
data.iloc[:,0:-1] = preprocessing.scale(data.iloc[:,0:-1])
data['class_c'] = pd.factorize(data['class'])[0]
return data.iloc[:,0:-2],data.iloc[:,-1]
歐式距離計算:
def disteclud(veca, vecb)
return np.sqrt(np.sum(np.power(veca - vecb, 2)))
#隨機質心選擇函式:
def randcentre(dataset, k):
n = dataset.shape[1]
centres = np.mat(np.zeros((k,n)))
for j in range(n):
minj = np.min(dataset.iloc[:,j])
rangej = np.float(np.max(dataset.iloc[:,j]) - minj)
centres[:,j] = np.mat(minj + rangej * np.random.rand(k,1))
return centres
聚類演算法原始碼:
def kmeans(dataset,k):
m = dataset.shape[0]
clusterassment = np.mat(np.zeros((m,2)))
centres = randcentre(dataset,k)
clusterchanged = true
while clusterchanged:
clusterchanged = false
for i in range(m):
mindist = np.inf;minindex = -1
for j in range(k):
distji = disteclud(centres[j,:],dataset.iloc[i,:].values)
if distji < mindist:
mindist = distji
minindex = j
if clusterassment[i,0] != minindex:
clusterchanged = true
clusterassment[i,:] = minindex,mindist**2
print(centres)
for cent in range(k):
index = np.nonzero(clusterassment[:,0].a== cent)[0].tolist()
ptsinclust = dataset.iloc[index,:]
centres[cent,:] = np.mean(ptsinclust,axis=0).values
return centres,clusterassment
聚類演算法執行與結果輸出:
以上是原生k-means演算法的簡單實現,其中最為核心的聚類演算法模組幾乎高度還原了偽**的核心思想,但是鑑於聚類分析中異常值、k值選擇以及初始聚類中心的選擇都會影響最終的聚類效果,所以在使用k-means聚類演算法時要選擇合適的k值以及初始聚類質心,並合理處理資料中的異常值問題。
機器學習筆記 kMeans聚類
優點 容易實現。缺點 可能收斂到區域性最小值,在大規模資料集上收斂較慢。適用資料型別 數值型資料 k 均值演算法 先隨機確定k個初始點作為質心,然後將資料集中的每個點分配到乙個簇中,具體來講為每個點找距其最近的質心,並將其分配給該質心所對應的簇。再每個簇更新質心為該簇所有點的平均值。import n...
機器學習之Kmeans聚類
本次學習總結 1 理解相似度度量的各種方法及其相互聯絡 2 掌握k means演算法思路及其使用條件 3 層次聚類的思路和方法 4 密度聚類並能夠應用於實踐 dbscan 密度最大值聚類 5 譜聚類演算法 譜聚類演算法與pca之間的關係 聚類的定義 聚類就是將大量未知標註的資料,按照資料的內在相似性...
機器學習之聚類演算法 K Means
參考 聚類演算法可以分為 中心點方法 層次聚類方法 基於密度方法 基於網格 基於模型方法。其中最為經典的是k means演算法 k means屬於中心點方法 也有叫劃分方法 演算法經典簡單。演算法 人工選取k值,並選取k個點作為k個簇的質心 對所有樣本分別計算到k個簇的質心的距離 歐式或者曼哈頓 取...