機器學習十大經典算法之K-Means聚類算法

2021-01-07 人工智慧cv

聚類介紹

聚類在機器學習,數據挖掘,模式識別,圖像分析以及生物信息等領域有廣泛的應用。聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離(一般是歐式距離)等。

聚類的應用

在商務上,聚類能幫助市場分析人員從客戶基本庫中發現不同的客戶群,並且用購買模式來刻畫不同的客戶群的特徵。在生物學上,聚類能用於推導植物和動物的分類,對基因進行分類,獲得對種群中固有結構的認識。聚類在地球觀測資料庫中相似地區的確定,汽車保險單持有者的分組,及根據房子的類型、價值和地理位置對一個城市中房屋的分組上也可以發揮作用。聚類也能用於對Web上的文檔進行分類,以發現信息。諸如此類,聚類有著廣泛的實際應用。

K-Means聚類算法簡介

K-Means是發現給定數據集的 K 個簇的聚類算法, 之所以稱之為 K-均值是因為它可以發現 K 個不同的簇, 且每個簇的中心採用簇中所含值的均值計算而成。簇個數 K 是用戶指定的, 每一個簇通過其質心(centroid), 即簇中所有點的中心來描述。聚類與分類算法的最大區別在於, 分類的目標類別已知, 而聚類的目標類別是未知的。

K-Means聚類算法步驟

K-Means聚類步驟是一個循環迭代的算法,具體·步驟如下:

1、先隨機選取K個對象作為初始的聚類中心,隨機選擇K個初始中心點;2、計算每個對象與各個種子聚類中心之間的距離,按照距離初始中心點最小的原則,把每個對象分配給距離它最近的聚類中心。聚類中心以及分配給它們的對象就代表一個聚類。3、一旦全部對象都被分配了,每個聚類的聚類中心會根據聚類中現有的對象被重新計算。這個過程將不斷重複直到滿足某個終止條件。終止條件可以是以下任何一個:1)沒有(或最小數目)對象被重新分配給不同的聚類。2)沒有(或最小數目)聚類中心再發生變化。3)誤差平方和局部最小。

因此得到相互分離的球狀聚類,在這些聚類中,均值點趨向收斂於聚類中心。 一般會希望得到的聚類大小大致相當,這樣把每個觀測都分配到離它最近的聚類中心(即均值點)就是比較正確的分配方案。

K-Means的數學描述

聚類是把相似的物體聚在一起,這個相似度(或稱距離)是用歐氏距離來衡量的。

給定兩個樣本 與 ,其中n表示特徵數 ,X和Y兩個向量間的歐氏距離(Euclidean Distance)表示為:

k-means算法是把數據給分成不同的簇,目標是同一個簇中的差異小,不同簇之間的差異大,這個目標怎麼用數學語言描述呢?我們一般用誤差平方和作為目標函數(想想線性回歸中說過的殘差平方和、損失函數,是不是很相似),公式如下:

其中C表示聚類中心,如果x屬於這個簇,則計算兩者的歐式距離,將所有樣本點到其中心點距離算出來,並加總,就是k-means的目標函數。實現同一個簇中的樣本差異小,就是最小化SSE。

可以通過求導來求函數的極值,我們對SSE求偏導看看能得到什麼結果:

式中m是簇中點的數量,發現了沒有,這個C的解,就是X的均值點。多點的均值點應該很好理解吧,給定一組點 ,其中 ,這組點的均值向量表示為:

K-Means偽代碼

function K-Means(輸入數據,中心點個數K)獲取輸入數據的維度Dim和個數N 隨機生成K個Dim維的點while(算法未收斂) 對N個點:計算每個點屬於哪一類。 對於K個中心點: 1,找出所有屬於自己這一類的所有數據點 2,把自己的坐標修改為這些數據點的中心點坐標 end 輸出結果:end

K-Means優缺點

優點:

屬於無監督學習,無須準備訓練集原理簡單,實現起來較為容易結果可解釋性較好缺點:

聚類數目k是一個輸入參數。選擇不恰當的k值可能會導致糟糕的聚類結果。這也是為什麼要進行特徵檢查來決定數據集的聚類數目了。可能收斂到局部最小值, 在大規模數據集上收斂較慢對於異常點、離群點敏感K-Means算法實現

from collections import defaultdictfrom random import uniformfrom math import sqrtdef point_avg(points):"""Accepts a list of points, each with the same number of dimensions. NB. points can have more dimensions than 2 Returns a new point which is the center of all the points. """ dimensions = len(points[0]) new_center = []for dimension in xrange(dimensions): dim_sum = 0 # dimension sumfor p in points: dim_sum += p[dimension]# average of each dimension new_center.append(dim_sum / float(len(points)))return new_centerdef update_centers(data_set, assignments):""" Accepts a dataset and a list of assignments; the indexes of both lists correspond to each other. Compute the center for each of the assigned groups. Return `k` centers where `k` is the number of unique assignments. """ new_means = defaultdict(list) centers = []for assignment, point in zip(assignments, data_set): new_means[assignment].append(point)for points in new_means.itervalues(): centers.append(point_avg(points))return centersdef assign_points(data_points, centers):""" Given a data set and a list of points betweeen other points, assign each point to an index that corresponds to the index of the center point on it's proximity to that point. Return a an array of indexes of centers that correspond to an index in the data set; that is, if there are N points in `data_set` the list we return will have N elements. Also If there are Y points in `centers` there will be Y unique possible values within the returned list. """ assignments = []for point in data_points: shortest = () # positive infinity shortest_index = 0for i in xrange(len(centers)): val = distance(point, centers[i])if val < shortest: shortest = val shortest_index = i assignments.append(shortest_index)return assignmentsdef distance(a, b):""" """ dimensions = len(a) _sum = 0for dimension in xrange(dimensions): difference_sq = (a[dimension] - b[dimension]) ** 2 _sum += difference_sqreturn sqrt(_sum)def generate_k(data_set, k):""" Given `data_set`, which is an array of arrays, find the minimum and maximum for each coordinate, a range. Generate `k` random points between the ranges. Return an array of the random points within the ranges. """ centers = [] dimensions = len(data_set[0]) min_max = defaultdict(int)for point in data_set:for i in xrange(dimensions): val = point[i] min_key = 'min_%d' % i max_key = 'max_%d' % iif min_key not in min_max or val < min_max[min_key]: min_max[min_key] = valif max_key not in min_max or val > min_max[max_key]: min_max[max_key] = valfor _k in xrange(k): rand_point = []for i in xrange(dimensions): min_val = min_max['min_%d' % i] max_val = min_max['max_%d' % i] rand_point.append(uniform(min_val, max_val)) centers.append(rand_point)return centersdef k_means(dataset, k): k_points = generate_k(dataset, k) assignments = assign_points(dataset, k_points) old_assignments = Nonewhile assignments != old_assignments: new_centers = update_centers(dataset, assignments) old_assignments = assignments assignments = assign_points(dataset, new_centers)return zip(assignments, dataset)# points = [# [1, 2],# [2, 1],# [3, 1],# [5, 4],# [5, 5],# [6, 5],# [10, 8],# [7, 9],# [11, 5],# [14, 9],# [14, 14],# ]# print k_means(points, 3)

參考文獻

https://zhuanlan.zhihu.com/p/75477709

相關焦點

  • 機器學習之SKlearn(scikit-learn)的K-means聚類算法
    Sklearn聚類算法對比Sklearn聚類算法官方列舉了不同的算法,大家可以根據自己的數據特徵,以及需要解決的問題,選擇不同的算法,本期我們首先簡單了解一下K-means算法Sklearn聚類算法的K-means
  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。
  • K-Means聚類算法詳解
    寫在前面如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等無監督算法:聚類,降維,關聯規則, PageRank等為了詳細的理解這些原理
  • 機器學習算法之K-means算法
    K-means舉例shi'li1 K-means算法簡介k-means算法是一種聚類算法,所謂聚類,即根據相似性原則聚類與分類最大的區別在於,聚類過程為無監督過程,即待處理數據對象沒有任何先驗知識,而分類過程為有監督過程,即存在有先驗知識的訓練數據集。2 K-means算法原理k-means算法中的k代表類簇個數,means代表類簇內數據對象的均值(這種均值是一種對類簇中心的描述),因此,k-means算法又稱為k-均值算法。
  • 聚類算法之Kmeans
    5、我們言簡意賅地提了一下SVM的特點及其應用場景,並給出了svm在sklearn中相關的算法及參數的說明。沒事嘮兩句在傳統機器學習領域裡,主要涉及的任務有回歸、分類、聚類、推薦等。聚類算法之Kmeans聚類算法其實有很多,包括層次聚類,密度聚類,譜聚類等等。
  • k-means聚類算法原理總結
    目錄1. k-means聚類算法原理2. k-means聚類算法步驟3. k-means++聚類優化算法4.小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖3kmeans實現邏輯:需要輸入待聚類的數據和欲聚類簇數k1.隨機生成k個初始點作為質心
  • K-Means聚類算法
    是一種聚類算法,與之前提到的樸素貝葉斯等算法不同,它屬於無監督學習。簡單來說,之前的算法中我們是利用特徵 x 和類別 y 來進行訓練、分類的,而無監督學習是指不需要我們提供具體的類別 y ,而讓數據自己聚在一起,形成 k 個簇,以實現分類的目的。具體方法是通過對給定的樣本進行劃分,分為 k 個簇,使得簇內的點儘量緊密的連在一起,而簇間的距離儘量大,評判的標準就是通過歐氏距離。
  • k-means聚類算法從入門到精通
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理 。目錄1. k-means聚類算法原理2. k-means聚類算法步驟3. k-means++聚類優化算法4.
  • 機器學習之分類算法K-Means介紹與代碼分析(篇四)
    k-平均聚類的目的是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。這個問題將歸結為一個把數據空間劃分為Voronoi cells的問題。這個問題在計算上是NP困難的,不過存在高效的啟發式算法。
  • k-means算法
    k-means算法原理K-means中心思想:事先確定常數K,常數K意味著最終的聚類類別數,首先隨機選定初始點為質心,並通過計算每一個樣本與質心之間的相似度
  • 詳解 kmeans 聚類算法
    也是聚類算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較注重應用。看了Andrew Ng的這個講義後才有些明白K-means後面包含的EM思想。聚類屬於無監督學習,以往的回歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x,比如假設宇宙中的星星可以表示成三維空間中的點集。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。
  • 聚類算法入門:k-means
    比如垃圾分類就是分類算法,你知道豬能吃的是溼垃圾,不能吃的是幹垃圾……;打掃房間時你把雜物都分分類,這是聚類,你事先不知道每個類別的標準。二、劃分聚類方法: K-means:對於給定的樣本集,按照樣本之間的距離(也就是相似程度)大小,將樣本集劃分為K個簇(即類別)。
  • 算法雜貨鋪——k均值聚類(K-means)
    本文首先介紹聚類的基礎——距離與相異度,然後介紹一種常見的聚類算法 ——k均值和k中心點聚類,最後會舉一個實例:應用聚類方法試圖解決一個在體育界大家頗具爭議的問題——中國男足近幾年在亞洲到底處於幾流水平。4.2、相異度計算      在正式討論聚類前,我們要先弄清楚一個問題:如何定量計算兩個可比較元素間的相異度。
  • 數據挖掘十大算法 ——The k-means algorithm(二)
    the IEEE International Conference on Data Mining (ICDM) 2006年12月評選出了數據挖掘領域的十大經典算法:C4.5、k-Means、SVM、Apriori
  • K-means 聚類算法及其代碼實現
    K-means算法是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類算法,具有的特點是:本文章介紹
  • 基本的k-means算法流程
    與kNN雖然都是以k打頭,但卻是兩類算法——kNN為監督學習中的分類算法,而k-means則是非監督學習中的聚類算法;二者相同之處:均利用近鄰信息來標註類別。 聚類是數據挖掘中一種非常重要的學習流派,指將未標註的樣本數據中相似的分為同一類,正所謂「物以類聚,人以群分」嘛。k-means是聚類算法中最為簡單、高效的,核心思想:由用戶指定k個初始質心(initial centroids),以作為聚類的類別(cluster),重複迭代直至算法收斂。
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    將機器學習分為4個領域,分別是分類(classification)、聚類(clustering)、回歸(regression)和降維(dimensionality reduction)。k-mk-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • 使用K-means 算法進行客戶分類
    應用機器學習技術就很有可能為客戶創造價值。,xn),其中每一個觀測值都是d維實數向量,K均值聚類旨在將n個觀測值劃分為k(k≤n)個集合S={S1,S2,...,Sk}以最小化聚類內的平方和,其中µi是Si中的點的平均值。保證K-Means算法收斂到局部最優。