k-均值聚類演算法
首先,隨機確定k個初始點作為質心,然後將資料集中的每個點分配到乙個簇中,即為每個點找距其最近的質心,並將其分配給該質心對應的簇,然後每個簇的質心更新為該簇所有點的平均值。演算法流程如下:
建立k個點作為起始質心(一般隨機選擇)
任意乙個點所屬簇的結果發生改變時
對資料集中每個點
對每個質心
計算資料與質心間的距離
將資料劃分到與它最近的簇
對於每個簇,重新計算質心(所有點的均值)
二分k-均值演算法
首先將所有點作為乙個簇,然後將該簇一分為二,之後選擇其中乙個簇繼續劃分,選擇哪乙個簇取決於是否可以很大程度降低sse(誤差平方和)的值,迴圈直到得到指定的簇。演算法流程如下:
將所有點看成乙個簇
當簇數目小於k時
對於每乙個簇
計算總誤差
在給定的簇上面進行k均值聚類(k=2)
計算將該簇一分為二之後的總誤差
選擇使得誤差最小的那個簇進行劃分操作
from numpy import *
def loaddataset(filename):
datamat =
fr = open(filename)
for line in fr.readlines():
curline = line.strip().split('\t')
fltline = [float(x) for x in curline]
return datamat
def disteclud(veca,vecb):
return sqrt(sum(power(veca - vecb, 2)))
def randcent(dataset,k):
n = shape(dataset)[1]
centroids = mat(zeros((k,n)))
for j in range(n):
minj = min(dataset[:,j])
rangej = float(max(dataset[:,j]) - minj)
centroids[:,j] = mat(minj + rangej * random.rand(k,1))
return centroids
def kmeans(dataset,k,distmeas=disteclud,createcent=randcent):
m = shape(dataset)[0]
clusterassment = mat(zeros((m,2)))
centroids = createcent(dataset,k)
clusterchanged = true
while clusterchanged:
clusterchanged = false
for i in range(m):
mindist = inf
minindex = -1
for j in range(k):
distji = distmeas(centroids[j,:],dataset[i,:])
if distji < mindist:
mindist = distji
minindex = j
if clusterassment[i,0] != minindex:
clusterchanged = true
clusterassment[i,:] = minindex,mindist**2
print(centroids)
for cent in range(k):
ptsinclust = dataset[nonzero(clusterassment[:,0].a == cent)[0]]
centroids[cent,:] = mean(ptsinclust,axis=0)
return centroids,clusterassment
def bikmeans(dataset,k,distmeas=disteclud):
m = shape(dataset)[0]
clusterassment = mat(zeros((m,2)))
centorid0 = mean(dataset,axis=0).tolist()[0]
centlist = [centorid0]
for j in range(m):
clusterassment[j,1] = distmeas(mat(centorid0),dataset[j,:])**2
while (len(centlist) < k):
lowestsse = inf
for i in range(len(centlist)):
ptsincurrcluster = dataset[nonzero(clusterassment[:,0].a == i)[0],:]
centroidmat,splitclustass = kmeans(ptsincurrcluster,2,distmeas)
ssesplit = sum(splitclustass[:,1])
ssenotsplit = sum(clusterassment[nonzero(clusterassment[:,0].a != i)[0],1])
print(ssesplit,ssenotsplit)
if (ssesplit + ssenotsplit) < lowestsse:
bestcenttosplit = i
bestnewcents = centroidmat
bestclustass = splitclustass.copy()
lowestsse = ssenotsplit + ssesplit
bestclustass[nonzero(bestclustass[:,0].a == 1)[0],0] = len(centlist)
bestclustass[nonzero(bestclustass[:,0].a == 0)[0],0] = bestcenttosplit
centlist[bestcenttosplit] = bestnewcents[0,:].tolist()[0]
clusterassment[nonzero(clusterassment[:,0].a == bestcenttosplit)[0],:] = bestclustass
return mat(centlist),clusterassment
dataset = mat(loaddataset('testset.txt'))
a,b = bikmeans(dataset,3)
機器學習 初識機器學習
1.什麼是機器學習?對於機器學習到現在都還沒有統一的定義,但是,通過乙個例子和較權威的定義來理解機器學習,最後附上我個人對機器學習的理解 2.監督學習 1 監督學習基本思想 我們資料集中的每個樣本都有相應的 正確答案 即每個樣本都是真實值,再根據這些樣本作出 舉乙個房價預售的例子來說明 eg 下面圖...
機器學習 機器學習目錄
注 後期有時間的話會對每乙個演算法進行講解。1 普通線性回歸 2 廣義線性模型 3 邏輯回歸 4 線性判定分析1 決策樹基本原理與構建 2 cart演算法 3 回歸決策樹 4 分類決策樹1 貝葉斯定理與樸素貝葉斯 2 高斯貝葉斯分類器 3 多項式貝葉斯分類器 4 伯努利貝葉斯分類器 5 遞增式學習1...
機器學習一 機器學習概要
回歸 是指把實函式在樣本點附近加以近似的有監督的模式識別問題。對乙個或多個自變數和因變數之間關係進行建模,求解的一種統計方法。分類 是指對於指定的模式進行識別的有監督的模式識別問題。異常檢測 是指尋找輸入樣本ni 1i 1 n中所包含的異常資料的問題。常採用密度估計的方法 正常資料為靠近密度中心的資...