資料探勘之KMeans演算法應用與簡單理解

2021-09-25 15:17:21 字數 2927 閱讀 6037

一、背景

煤礦地磅產生了一系列資料:

我想從這些資料中,取出最能反映當前車輛重量的資料(有很多資料是車輛上磅過程中產生的資料)。我於是想到了聚類演算法kmeans,該演算法思想比較簡單。

二、演算法步驟

1、從樣本中隨機取出k個值,作為初始中心

2、以k個中心劃分這些資料,分為k個組

3、重新計算出每個組的中心,作為新中心

4、如果初始中心和新中心不相等,則把新中心作為初始中心,重複2,3。反之,結束

注意:

1、我沒有用嚴格的演算法定義,怕不好理解

2、kmeans善於處理球形資料,因此隨機取k個質心,每個質心吸引離它最近的資料

3、由於質心的取值是不科學的,所以需要不斷地計算調整,直到質心名副其實

三、演算法分析及特點

1、從演算法步驟當中可以看出有兩個問題,需要解決:

首先,如何計算每個組(簇)的質心?

其次,如何把值劃分到不同的組?

2、解決上面兩個問題,因場景和要求不同而有不同的小演算法,由於我的資料是一維的,而不是點,所以可以簡單處理:

a、以每個組的平均值作為質心

b、根據值離質心的距離(相減),選擇距離最近的組加入

3、此演算法有兩個缺點:

1)某個組(簇)劃分不充分,還可以再劃分為更小的組。(容易陷入區域性最優)

2)需要使用者指定k,聚類結果對初始質心的選擇較為敏感(初始選擇不同,聚類結果可能不同)

4、優點:簡單易理解和上手

四、實現

public

class

kmeans

//如果聚類中心不同

if (!equal(nc, c))

else

break

; }

return

g; }

/** 聚類中心函式

* 簡單的一維聚類返回其算數平均值

* 可擴充套件

*/public

static

decimal center(decimal

p)

/** 給定 decimal 型陣列 p 和聚類中心 c。

* 根據 c 將 p 中元素聚類。返回二維陣列。

* 存放各組元素。

*/public

static

decimal group(decimal p, decimal

c)

//找出最小距離

int ci =min(d);

//標記屬於哪一組

gi[i] =ci;

}//存放分組結果

decimal g = new

decimal

[c.length];

//遍歷每個聚類中心,分組

for (int i = 0; i < c.length; i++)

}//返回分組結果

return

g; }

/** 計算兩個點之間的距離, 這裡採用最簡單得一維歐氏距離, 可擴充套件。

*/public

static

decimal distance(decimal x, decimal

y)

/** 返回給定 decimal 陣列各元素之和。

*/public

static

decimal sum(decimal

p)

/** 給定 decimal 型別陣列,返回最小值得下標。

*/public

static

int min(decimal

p)

}return

i; }

/** 判斷兩個 decimal 陣列是否相等。 長度一樣且對應位置值相同返回真。

*/public

static

bool equal(decimal a, decimal

b)

}return

true

; }

}

客戶端呼叫:

1

static

void main(string

args)210

catch

(exception)

1115

16decimal p = ;

1718 list plist = new list();

1920

var lines =file.readalllines(path);

2122

foreach (var line in

lines)

2329

30 p =plist.toarray();

3132 k = 5;33

decimal

g;34 g =kmeans.cluster(p, k);

35for (int i = 0; i < g.length; i++)

3641 console.writeline("

----------------------");

42}43console.readkey();

4445 }

注意:

1、如果資料檔案為空或不存在,則用初始化的p陣列,作為測試資料

2、檔案中的資料,見開篇截圖

資料探勘之K Means演算法

k means思想 將n個樣本分成k個聚類,每個聚類裡的樣本關聯性 或者說是相似性 比較高。舉個例子,假如有5個樣本,每個樣本是乙個2維向量,分別記做a,b,c,d,e,我要將他們分成2個聚類,第一步是隨機選2個樣本 也可以是虛擬的 把它們當做中心點,然後將 a,b,c,d,e歸類到距離最小的那個中...

資料探勘經典演算法之 K means演算法

k means 是一種基於距離的排他的聚類劃分方法。上面的 k means 描述中包含了幾個概念 給定乙個 n 個物件的資料集,它可以構建資料的 k 個劃分,每個劃分就是乙個簇,並且 k n。同時還需滿足 每個組至少包含乙個物件。每個物件必須屬於且僅屬於乙個簇。如圖所示,簡單的來說,k means聚...

資料探勘演算法 k means

k means 演算法r實現 先用setwd設定工作空間,如d盤,並將相關資料拷貝到該目錄下 setwd d k means 讀入資料 data read.csv d k means data km kmeans data,center 3 print km km size sum km size ...