一、背景
煤礦地磅產生了一系列資料:
我想從這些資料中,取出最能反映當前車輛重量的資料(有很多資料是車輛上磅過程中產生的資料)。我於是想到了聚類演算法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 ...