1. 程式人生 > >k均值演算法,k-means演算法原理

k均值演算法,k-means演算法原理

一 經典的k-均值聚類 

 思路:  



  1 隨機建立k個質心(k必須指定,二維的很容易確定,視覺化資料分佈,直觀確定即可);


  2 遍歷資料集的每個例項,計算其到每個質心的相似度,這裡也就是歐氏距離;把每個例項都分配到距離最近的質心的那一類,用一個二維陣列資料結構儲存,第一列是最近質心序號,第二列是距離;


  3 根據二維陣列儲存的資料,重新計算每個聚簇新的質心;


  4 迭代2 和 3,直到收斂,即質心不再變化;

二 二分k-均值聚類演算法

  二分k-均值聚類演算法是基於經典k-均值演算法實現的;裡面呼叫經典k-均值(k=2),把一個聚簇分成兩個,迭代到分成k個停止;

  具體思路:

  1 把整個資料集看成一個聚簇,計算質心;並用同樣的資料結構二維陣列儲存每個例項到質心的距離;

  2 對每一個聚簇進行2-均值聚類劃分;

  3 計算劃分後的誤差,選擇所有被劃分的聚簇中總誤差最小的劃分儲存;

  4 迭代2 和 3 直到聚簇數目達到k停止;

首先二分-K均值是為了解決k-均值的使用者自定義輸入簇值k所延伸出來的自己判斷k數目,其基本思路是:

為了得到k個簇,將所有點的集合分裂成兩個簇,從這些簇中選取一個繼續分裂,如此下去,直到產生k個簇。

虛擬碼:

初始化簇表,使之包含由所有的點組成的簇。
repeat
   從簇表中取出一個簇。
   {對選定的簇進行多次二分試驗}
   for i=1 to 試驗次數 do
       使用基本k均值,二分選定的簇。
   endfor
   從二分試驗中選擇具有最小誤差的兩個簇。
   將這兩個簇新增到簇表中。
until 簇表中包含k個簇
比如要分成5個組,第一次分裂產生2個組,然後從這2個組中選一個目標函式產生的誤差比較大的,分裂這個組產生2個,這樣加上開始那1個就有3個組了,然後再從這3個組裡選一個分裂,產生4個組,重複此過程,產生5個組。這算是一中基本求精的思想。二分k均值不太受初始化的困擾,因為它執行了多次二分試驗並選取具有最小誤差的試驗結果,還因為每步只有兩個質心。

優缺點

基礎k-means
優點:原理簡單,實現容易
缺點:
1.收斂太慢
2.演算法複雜度高O(nkt)
3.不能發現非凸形狀的簇,或大小差別很大的簇
4.需樣本存在均值(限定資料種類)
6.需先確定k的個數
7.對噪聲和離群點敏感
8.最重要是結果不一定是全域性最優,只能保證區域性最優。
Spark應用k-means演算法

相關推薦

k均值演算法k-means演算法原理

一 經典的k-均值聚類   思路:     1 隨機建立k個質心(k必須指定,二維的很容易確定,視覺化資料分佈,直觀確定即可);   2 遍歷資料集的每個例項,計算其到每個質心的相似度,這裡也就是歐氏距離;把每個例項都分配到距離最近的質心的那一類,用一個二維陣列資料結構儲

java實現K-means演算法k-means聚類演算法原理

/** * 需要所有point 以及族中心list * * @author:Yien * @when:2018年5月20日下午3:14:09 * @Description:TOD

模式識別導論大作業(k均值演算法感知器演算法fisher演算法貝葉斯決策特徵提取)

模式識別導論大作業 一、      K均值聚類 1.      功能描述: 利用K-均值演算法將150個模式樣本分成3類別。分別計算最後演算法所用的迭代次數,最終聚類中心以及每個類別中對應模式樣本的序號。 2.      帶註釋的原始碼 #include "st

C++實現的簡單k近鄰演算法K-Nearest-NeighbourK-NN)

</#include<map> #include<vector> #include<stdio.h> #include<cmath> #include<cstdlib> #include<algorithm> #include<

機器學習實戰:K-均值及二分K-均值聚類演算法

# coding=utf-8 ''' Created on Feb 16, 2011 k Means Clustering for Ch10 of Machine Learning in Action #@author: Peter Harrington ''' from

KNN演算法k 鄰近(python)

1.原理 利用歐式距離計算各個特徵的相似度,歐式距離越小,相似度越大。 2.程式碼: from numpy import * import operator from os import listdir def kNNClassify(inX, da

聚類之K均值聚類和EM演算法

這篇部落格整理K均值聚類的內容,包括: 1、K均值聚類的原理; 2、初始類中心的選擇和類別數K的確定; 3、K均值聚類和EM演算法、高斯混合模型的關係。   一、K均值聚類的原理 K均值聚類(K-means)是一種基於中心的聚類演算法,通過迭代,將樣本分到K個類中,使得每個樣本與其所屬類

K近鄰(k-Nearest NeighborKNN)演算法一種基於例項的學習方法

1. 基於例項的學習演算法 0x1:資料探勘的一些相關知識脈絡 本文是一篇介紹K近鄰資料探勘演算法的文章,而所謂資料探勘,就是討論如何在資料中尋找模式的一門學科。 其實人類的科學技術發展的歷史,就一直伴隨著資料探勘,人們一直在試圖中資料中尋找模式, 獵人在動物遷徙的行為中尋找模式 農夫在莊稼的生

貪心演算法遞迴演算法動態規劃演算法比較與總結

一般實際生活中我們遇到的演算法分為四類: 一>判定性問題 二>最優化問題 三>構造性問題 四>計算性問題 而今天所要總結的演算法就是著重解決 最優化問題 《演算法之道》對三種演算法進行了歸納總結,如下表所示: 分

西瓜書 課後習題5.5 標準bp演算法累計bp演算法

import numpy as np def dataSet(): ''' 西瓜3.0資料集離散化 ''' X = np.mat('2,3,3,2,1,2,3,3,3,2,1,1,2,1,3,1,2;\ 1,1,1,1,1,2,2,2,2,

問題:求n以內的所有素數。要求給出自然語言描述的演算法並且實現演算法。事先分析演算法的時間複雜度和空間複雜度。/*如果錯誤或相關改進的歡迎提出謝謝!*/

/*2018.10.20上傳,該貼還有部分需要完善,比如2輸不出,還有許多可以優化的地方,未完,待更~~*/ #include <stdio.h> #include <math.h> #include <time.h> void pr

何為啟發式演算法——退火演算法蟻群演算法遺傳演算法

一、退火演算法 模擬退火演算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。 模擬退火演算法新解的產生和接受

廣度優先演算法深度優先演算法和DijKstra演算法

我們經常會碰到最短路徑問題,而最短路徑問題的解決方法多種多樣,廣度優先搜尋(BFS),深度優先搜尋(DFS)和DijKstra演算法貌似都能解決這個問題,這裡就簡單介紹一下這些演算法,分析一下它們的適用範圍。 一、原理剖析: 1 廣度優先搜尋(BFS)

Java資料結構:四種基本演算法(窮舉演算法遞推演算法分治演算法概論演算法

1,窮舉演算法 主要解決雞兔同籠類似問題 public class 窮舉演算法 { public static void main(String[] args) { int head = 35; int foot = 94; int j = 0; i

HMM前向演算法維位元演算法後向演算法前向後向演算法程式碼

typedef struct { int N; /* 隱藏狀態數目;Q={1,2,…,N} */ int M; /* 觀察符號數目; V={1,2,…,M}*/ double **A; /* 狀態轉移矩陣A[1..N][1..N]. a[i][j] 是從t時刻狀態i到t+1

面試演算法之字串匹配演算法Rabin-Karp演算法詳解

既然談論到字串相關演算法,那麼字串匹配是根本繞不過去的坎。在面試中,面試官可能會要你寫或談談字串的匹配演算法,也就是給定兩個字串,s 和 t, s是要查詢的字串,t是被查詢的文字,要求你給出一個演算法,找到s在t中第一次出現的位置,假定s為 acd, t為a

遺傳演算法粒子群演算法蟻群演算法對比

遺傳演算法適合求解離散問題,具備數學理論支援,但是存在著漢明懸崖等問題.粒子群演算法適合求解實數問題,演算法簡單,計算方便,求解速度快,但是存在著陷入區域性最優等問題.蟻群演算法適合在圖上搜索路徑問題,計算開銷會大.要將三種演算法進行混合,就要針對特定問題,然後融合其中的優勢

ANSI-X99MAC演算法和PBOC的3DES MAC演算法附DES演算法工具

/************************************************** * PBOC-3DES MAC計算 **************************************************/

c模擬記憶體分配演算法(首次適應演算法最佳適應演算法最壞適應演算法

#include<bits/stdc++.h> using namespace std; /*定義記憶體的大小為100*/ #define MEMSIZE 100 /*如果小於此值,將不再分割記憶體*/ #define MINSIZE 2 /*記憶體分割槽空間表結構*/ typedef str

Rocchio演算法其他分類演算法通用閾值確定方法

通過對PR曲線的繪製,瞭解閾值設定對PR值影響的狀況,這裡假定P,R都是重要的,採用角平分線和該曲線的交點,交點處為PR值達到最佳的點,作為調和平均數F-measure,P,R均取高值,該指標才可能高。 下圖為公交分類過程中,閾值不同,描出的不同點,通過計算夾角餘玄設定為0。