python之kmeans數據聚類算法

2021-01-10 侃侃網際網路技術

一 Kmeans原理

kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖1假設每個點的維度是n,即每個點有n個特徵維度,計算這些點數據到數據中心A、B、C的距離,從而將每個數據歸類到A或B或C。

圖1

歐式距離公式:

圖2

假設1點的數據為:

A中心數據為:

歐式公式計算為:

圖3

kmeans實現邏輯:

需要輸入待聚類的數據和欲聚類簇數k

1.隨機生成k個初始點作為質心

2.將數據集中的數據按照距離質心的遠近分到各個簇中

3.對每個簇的數據求平均值,作為新的質心,重複上一步,直到所有的簇不再改變

k是聚類個數,可以根據我們的經驗給數值,也可以通過程序初步預測k設置為多少對聚類最準確。本章通過變化k的個數,計算k取不同值時,最後的誤差多少,誤差越小,則k最準確。

二 數據準備

對數據進行聚類,要對測試數據進行清洗。一般代碼都是對數值型數據進行計算,所以如果測試數據是漢字或其他類型的信息,我們要對其進行量化。本案例通過鏈家數據進行測試,通過學習,可以學習python機器學習的一般步驟和整個過程。圖4是初始數據,其中面積特徵、格局特徵、裝修特徵都需要量化成數值型,大家可以根據實際情況進行量化。比如精裝對應80,簡裝對應30,毛坯對應10等,本文對這些數值進行如下量化,同時將面積的單位平米去掉,最終訓練數據見圖5.

簡裝:0 精裝:1 毛坯:3

東:0 西:1 南:2 北:3

圖4
圖5

三 程序

1、對初始k進行預測

# 歐氏距離計算

def distEclud(x,y):

return np.sqrt(np.sum((x-y)**2)) # 計算歐氏距離

# 為給定數據集構建一個包含K個隨機質心的集合

def randCent(dataSet,k):

m,n = dataSet.shape

centroids = np.zeros((k,n))

for i in range(k):

index = int(np.random.uniform(0,m))

centroids[i,:] = dataSet[index,:]

return centroids

def cost(dataMat, k, distMeas=distEclud, createCent=randCent,iterNum=300):

# 獲取樣本數和特徵數

m, n = np.shape(dataMat)

# 初始化一個矩陣來存儲每個點的簇分配結果

# clusterAssment包含兩個列:一列記錄簇索引值,第二列存儲誤差(誤差是指當前點到簇質心的距離,後面會使用該誤差來評價聚類的效果)

clusterAssment = np.mat(np.zeros((m, 2)))

# 創建質心,隨機K個質心

centroids = createCent(dataMat, k)

clusterChanged = True

while iterNum > 0:

clusterChanged = False

# 遍歷所有數據找到距離每個點最近的質心,

# 可以通過對每個點遍歷所有質心並計算點到每個質心的距離來完成

for i in range(m):

minDist = np.inf

minIndex = -1

for j in range(k):

# 計算數據點到質心的距離

distJI = distMeas(centroids[j, :], dataMat[i, :])

# 如果距離比minDist(最小距離)還小,更新minDist(最小距離)和最小質心的index(索引)

if distJI < minDist:

minDist = distJI

minIndex = j

# 更新簇分配結果為最小質心的index(索引),minDist(最小距離)的平方

clusterAssment[i, :] = minIndex, minDist ** 2

iterNum -= 1;

# print(centroids)

# 遍歷所有質心並更新它們的取值

for cent in range(k):

# 通過數據過濾來獲得給定簇的所有點

ptsInClust = dataMat[np.nonzero(clusterAssment[:, 0].A == cent)[0]]

# 計算所有點的均值,axis=0表示沿矩陣的列方向進行均值計算

centroids[cent, :] = np.mean(ptsInClust, axis=0)

# 返回給定迭代次數後誤差的值

return np.mat(clusterAssment[:,1].sum(0))[0,0]

調用上述方法預測k,見圖6,所以k可以取值:2、3、5等,可以結合實際需要進行選取。本文數據可能比較不典型,正常情況下,曲線應該是單一方向的上升或下降趨勢,我們取轉折點作為k的值。

dataSet = loadDataSet("test.txt")

allcost=[]

x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

k=1

while k <19:

a=cost(dataSet, 2, distMeas=distEclud, createCent=randCent,iterNum=300)

allcost.append(a)

k = k+1

圖6

2 kmean算法程序

圖7

3、繪製數據點

本文數據不是二維數據,而是5維數據,我們需要安裝plotly來實現多維數據的繪製,從繪製的數據點我們可以形象的看出數據都聚集在2大塊,所以聚類K應該取2比較合適。

圖8

x:面積,y:朝向,z:總價,實現三維圖形,格局特徵我們通過點大小描繪,裝修特徵我們通過點顏色標誌,通過如此,5維數據都可以在圖上展示出來了。

import pandas as pd

import plotly

import plotly.graph_objs as go

dataPath = 'C:/Users/xzx/Desktop/linkHomeData.xlsx'

data = pd.read_excel(dataPath,sheet_name='Sheet2')

#Set marker properties

markersize = data['geju']/3

markercolor = data['zhuangxiu']

#Make Plotly figure

fig1 = go.Scatter3d(x=data['mianji'],

y=data['chaoxiang'],

z=data['price'],

marker=dict(size=markersize,

color=markercolor,

opacity=0.9,

reversescale=True,

colorscale='Blues'),

line=dict (width=0.02),

mode='markers')

#Make Plot.ly Layout

mylayout = go.Layout(scene=dict(xaxis=dict( title="面積"),

yaxis=dict( title="朝向"),

zaxis=dict(title="總價")),)

#Plot and save html

plotly.offline.plot({"data": [fig1],

"layout": mylayout},

auto_open=True,

filename=("5D Plot.html"))

圖9

四 總結

本文講述了kmeans算法的原理,聚類中心K個數的選取,kmeans算法的一般步驟,以及如何繪製多維圖形。

相關焦點

  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。什麼是聚類聚類是根據數據的屬性將數據分為兩個或更多組的任務,更確切地說,是基於數據中或多或少明顯的某些模式。
  • 你需要的最全面的K-means聚類指南
    K-means聚類介紹回想一下簇的第一個屬性,它表明簇中的點應該彼此相似。因此,我們的目標是最小化簇內點之間的距離。有一種算法試圖通過它們的質心最小化簇中點的距離,那就是K-means聚類技術。K-means是一種基於質心的算法,或基於距離的算法,我們計算將點分配給一個簇的距離。在K-means中,每個聚類都與一個質心相關聯。
  • 機器學習之分類算法K-Means介紹與代碼分析(篇四)
    維基百科,自由的百科全書中提到K-平均算法(英文:k-means clustering)源於信號處理中的一種向量量化方法,現在則更多地作為一種聚類分析方法流行於數據挖掘領域。k-平均聚類的目的是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。
  • 使用Python進行K均值聚類
    K-means聚類是無監督學習的一部分,我們使用的是未標記的數據集,這個算法會自動為我們將數據分組成聚類。它是目前最流行、應用最廣泛的聚類算法之一。它用於各種應用程式,例如市場細分,圖像細分等。該算法將接受兩個輸入:a)K(它是您想要的群聚類數)b)訓練數據集表示形式:K =聚類數C稱為聚類質心m =訓練實例數idx C(i)=已將實例X(i)分配給聚類的聚類質心看一個示例,使您可以清楚地看到此符號聚類分配步驟:在此步驟中,我們將根據數據集中最接近的聚類質心向數據集中分配一個聚類質心,並為分配的數據集上色
  • 有了K均值聚類,為什麼還需要DBSCAN聚類算法?
    所有聚類法都使用相同的方法,即首先計算相似度,然後使用相似度將數據點聚類為組或群。本文將重點介紹具有噪聲的基於密度的聚類方法(DBSCAN)。既然已經有了K均值聚類,為什麼還需要DBSCAN這樣的基於密度的聚類算法呢?K均值聚類可以將鬆散相關的觀測聚類在一起。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    -Kmeans1 6-15聚類Kmeans2 6-16聚類DBSCAN 6-17聚類層次聚類 6-18聚類圖分裂 6-19關聯-關聯規則1 6-20關聯-關聯規則2 6-21半監督-標籤傳播算法 6-22本章小結 7-1分類評估 混淆矩陣 7-2分類評估
  • 機器學習之基於sklearn的KMeans聚類
    聚類算法,無監督學習的代表算法,又叫做「無監督分類」即在訓練的時候只需要特徵矩陣,不需要真實值標籤可以有效地幫助我們探索數據的自然分布一、KMeans算法的運行過程運行的流程如下:自動聚類時的質心點的每步驟變化如下:
  • 高斯混合模型(GMM):理念、數學、EM算法和python實現
    高斯混合模型是一種流行的無監督學習算法。GMM方法類似於K-Means聚類算法,但是由於其複雜性,它更健壯,更有用。K-means聚類使用歐式距離函數來發現數據中的聚類。只要數據相對於質心呈圓形分布,此方法就可以很好地工作。
  • 集成聚類系列(三)圖聚類算法詳解
    圖聚類算法研究現狀聚類分析是一種常用的機器學習技術,它的目的是將一個數據點劃分為幾個類。同一個類的數據之間具有較高的相似性,不同的類之間的相似度較低。很多研究已表明圖聚類是一種極具競爭力的聚類算法,圖聚類是一種基於圖劃分理論的算法。與其他聚類算法相比,圖聚類算法有些明顯的優勢。
  • 深度剖析:數據科學家需懂的5種聚類算法
    【IT168 資訊】聚類是一種涉及數據點分組的機器學習技術。給定一組數據點,我們可以使用聚類算法將每個數據點分類到一個特定的組中。理論上,屬於同一組的數據點應具有相似的屬性和特徵,而不同組中的數據點應具有高度不同的屬性和特徵。聚類是無監督學習的一種方法,是在許多領域使用統計數據分析的常用技術。
  • 「Workshop」第十期:聚類
    數據標準化當變量是由不同的標度測量的時候,最好要對數據進行標準化使之可以進行比較;一般情況在下對變量進行縮放使之:標準差是1,均值是0;當變量的均值或者標準差相差較大的時候也可以對數據進行scale:center(x)可以是均值或者中位數;scale(x)可以是標準差,四分位間距,或者絕對中位差
  • 基於KNN和Kmeans算法利用MNIST數據集實現手寫數字識別
    Kmeans算法發展狀況K-means算法(Lloyod,1982)是簡單而又有效的統計聚類算法,使機器能夠將具有相同屬性的樣本歸置到一塊兒。與分類不同,對於一個分類器,通常需要告訴它「這個樣本被分成哪些類」這樣一些標籤,在最理想情況下,一個分類器會從所得到的訓練集中進行「學習」,我們將這種提供訓練的過程稱為「監督學習」。
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...
    選自EliteDataScience機器之心編譯參與:蔣思源、晏奇在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。
  • 聚類模型之Python調參
    K-Means 首先是k-means的scikit-learn實現: 如圖所示,我們介紹幾個重要的參數: 1.init 該參數指初始化聚類中心的方式,默認為k-means++,你也可以選擇random。
  • 數據科學家們必須知道的5種聚類算法
    聚類是一種無監督學習方法,也是一種統計數據分析的常用技術,被廣泛應用於眾多領域。在數據科學中,我們可以通過聚類算法,查看數據點屬於哪些組,並且從這些數據中獲得一些有價值的信息。今天,我們一起來看看數據科學家需要了解的5種流行聚類算法以及它們的優缺點。
  • Kmeans中的K值確定*
    上篇文章為大家介紹了我們常用的聚類算法Kmenas算法,也為大家整理了一點小案例,今天為大家繼續分享我們Kmenas算法,對Kmenas算法來說,如何確定簇數K值是一個至關重要的問題,為了解決這個問題,通常會選用探索法,即給定不同的k值下,對比某些評估指標的變動情況,進而選擇一個比較合理的k值,在這我們上篇文章給大家推薦了三種方法(簇內離差平方和拐點法,輪廓係數法和間隔統計量法
  • 聚類算法簡析(一):樸素貝葉斯算法的場景案例
    本文作者通過一些場景案例,帶領大家了解一下樸素貝葉斯算法作為聚類算法中的一員,如何來區分各類數組。通過一組參數模型來區分互斥群組中的個體十分常見,我們可以使用樸素貝葉斯分析來應用於這種場景,取決於模型的相似矩陣算法常常運用在估算決策論框架的矩陣中。
  • Python開發簡單爬蟲【學習資料總結】
    語言基礎:(帶你熟悉python語言的特性,學會使用python開發環境,使用python開發一些簡單的案例) (1)Python3入門,數據類型,字符串 (2)判斷/循環語句,函數, (3)類與對象,繼承,多態 (4)tkinter界面編程
  • 再來一頓賀歲宴 | 從K-Means到Capsule
    K-Means新探既然本文不斷強調 Capsule 是通過聚類來抽象特徵的,那麼就有必要來細談一下聚類算法了。Capsule 所使用的聚類算法,其實是 K-Means 的變種。聚類算法有很多,理論上每種聚類算法都是可能的,然而要將聚類算法嵌入到 Capsule 中,還需要費上一點周折。
  • 子空間聚類概述及Python完整實現
    這篇文章解決了以下問題:處理高維數據的挑戰是什麼?什麼是子空間聚類?如何在python中實現子空間聚類算法高維數據包括具有幾十到幾千個特徵(或維度)的輸入。這是一個典型的上下文問題,例如在生物信息學(各種排序數據)或NLP中,如果詞彙量非常大,就會遇到這種情況。