機器學習筆記之K means聚類

2021-09-20 08:38:43 字數 4539 閱讀 7113

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個簇的質心的距離 歐式或者曼哈頓 取...