① 粒子群優化演算法的PSO
演化計算可以用來研究神經網路的三個方面:網路連接權重,網路結構(網路拓撲結構,傳遞函數),網路學習演算法。
不過大多數這方面的工作都集中在網路連接權重,和網路拓撲結構上。在GA中,網路權重和/或拓撲結構一般編碼為染色體(Chromosome),適應函數(fitness function)的選擇一般根據研究目的確定。例如在分類問題中,錯誤分類的比率可以用來作為適應值。 這里用一個簡單的例子說明PSO訓練神經網路的過程。這個例子使用分類問題的基準函數 (Benchmark function)IRIS數據集。(Iris 是一種鳶尾屬植物) 在數據記錄中,每組數據包含Iris花的四種屬性:萼片長度,萼片寬度,花瓣長度,和花瓣寬度,三種不同的花各有50組數據. 這樣總共有150組數據或模式。
我們用3層的神經網路來做分類。現在有四個輸入和三個輸出。所以神經網路的輸入層有4個節點,輸出層有3個節點我們也可以動態調節隱含層節點的數目,不過這里我們假定隱含層有6個節點。我們也可以訓練神經網路中其他的參數。不過這里我們只是來確定網路權重。粒子就表示神經網路的一組權重,應該是4*6+6*3=42個參數。權重的范圍設定為[-100,100] (這只是一個例子,在實際情況中可能需要試驗調整).在完成編碼以後,我們需要確定適應函數。對於分類問題,我們把所有的數據送入神經網路,網路的權重有粒子的參數決定。然後記錄所有的錯誤分類的數目作為那個粒子的適應值。現在我們就利用PSO來訓練神經網路來獲得盡可能低的錯誤分類數目。PSO本身並沒有很多的參數需要調整。所以在實驗中只需要調整隱含層的節點數目和權重的范圍以取得較好的分類效果。
② R語言-KNN演算法
1、K最近鄰(k-NearestNeighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
2、KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
3、KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比。
簡言之,就是將未標記的案例歸類為與它們最近相似的、帶有標記的案例所在的類 。
原理及舉例
工作原理:我們知道樣本集中每一個數據與所屬分類的對應關系,輸入沒有標簽的新數據後,將新數據與訓練集的數據對應特徵進行比較,找出「距離」最近的k(通常k<20)數據,選擇這k個數據中出現最多的分類作為新數據的分類。
演算法描述
1、計算已知數據集中的點與當前點的距離
2、按距離遞增次序排序
3、選取與當前數據點距離最近的K個點
4、確定前K個點所在類別出現的頻率
5、返回頻率最高的類別作為當前類別的預測
距離計算方法有"euclidean"(歐氏距離),」minkowski」(明科夫斯基距離), "maximum"(切比雪夫距離), "manhattan"(絕對值距離),"canberra"(蘭式距離), 或 "minkowski"(馬氏距離)等
Usage
knn(train, test, cl, k = 1, l = 0, prob =FALSE, use.all = TRUE)
Arguments
train
matrix or data frame of training set cases.
test
matrix or data frame of test set cases. A vector will be interpreted as a row vector for a single case.
cl
factor of true classifications of training set
k
number of neighbours considered.
l
minimum vote for definite decision, otherwisedoubt. (More precisely, less thank-ldissenting votes are allowed, even
ifkis increased by ties.)
prob
If this is true, the proportion of the votes for the
winning class are returned as attributeprob.
use.all
controls handling of ties. If true, all distances equal
to thekth largest are
included. If false, a random selection of distances equal to thekth is chosen to use exactlykneighbours.
kknn(formula = formula(train), train, test, na.action = na.omit(), k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts = c('unordered' = "contr.mmy", ordered = "contr.ordinal"))
參數:
formula A formula object.
train Matrix or data frame of training set cases.
test Matrix or data frame of test set cases.
na.action A function which indicates what should happen when the data contain 』NA』s.
k Number of neighbors considered.
distance Parameter of Minkowski distance.
kernel Kernel to use. Possible choices are "rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian", "rank" and "optimal".
ykernel Window width of an y-kernel, especially for prediction of ordinal classes.
scale Logical, scale variable to have equal sd.
contrasts A vector containing the 』unordered』 and 』ordered』 contrasts to use
kknn的返回值如下:
fitted.values Vector of predictions.
CL Matrix of classes of the k nearest neighbors.
W Matrix of weights of the k nearest neighbors.
D Matrix of distances of the k nearest neighbors.
C Matrix of indices of the k nearest neighbors.
prob Matrix of predicted class probabilities.
response Type of response variable, one of continuous, nominal or ordinal.
distance Parameter of Minkowski distance.
call The matched call.
terms The 』terms』 object used.
iris%>%ggvis(~Length,~Sepal.Width,fill=~Species)
library(kknn)
data(iris)
dim(iris)
m<-(dim(iris))[1]
val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))
建立訓練數據集
data.train<-iris[-val,]
建立測試數據集
data.test<-iris[val,]
調用kknn 之前首先定義公式
formula : Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris.kknn<-kknn(Species~.,iris.train,iris.test,distance=1,kernel="triangular")
summary(iris.kknn)
# 獲取fitted.values
fit <- fitted(iris.kknn)
# 建立表格檢驗判類准確性
table(iris.valid$Species, fit)
# 繪畫散點圖,k-nearest neighbor用紅色高亮顯示
pcol <- as.character(as.numeric(iris.valid$Species))
pairs(iris.valid[1:4], pch = pcol, col = c("green3", "red")[(iris.valid$Species != fit)+1]
二、R語言knn演算法
install.packages("class")
library(class)
對於新的測試樣例基於距離相似度的法則,確定其K個最近的鄰居,在K個鄰居中少數服從多數
確定新測試樣例的類別
1、獲得數據
2、理解數據
對數據進行探索性分析,散點圖
如上例
3、確定問題類型,分類數據分析
4、機器學習演算法knn
5、數據處理,歸一化數據處理
normalize <- function(x){
num <- x - min(x)
denom <- max(x) - min(x)
return(num/denom)
}
iris_norm <-as.data.frame(lapply(iris[,1:4], normalize))
summary(iris_norm)
6、訓練集與測試集選取
一般按照3:1的比例選取
方法一、set.seed(1234)
ind <- sample(2,nrow(iris), replace=TRUE, prob=c(0.67, 0.33))
iris_train <-iris[ind==1, 1:4]
iris_test <-iris[ind==2, 1:4]
train_label <-iris[ind==1, 5]
test_label <-iris[ind==2, 5]
方法二、
ind<-sample(1:150,50)
iris_train<-iris[-ind,]
iris_test<-iris[ind,1:4]
iris_train<-iris[-ind,1:4]
train_label<-iris[-ind,5]
test_label<-iris[ind,5]
7、構建KNN模型
iris_pred<-knn(train=iris_train,test=iris_test,cl=train_label,k=3)
8、模型評價
交叉列聯表法
table(test_label,iris_pred)
實例二
數據集
http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data
導入數據
dir <-'http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'wdbc.data <-read.csv(dir,header = F)
names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean','area_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concave points_max_mean','symmetry_max_mean','fractal dimension_max_mean')
table(wdbc.data$Diagnosis)## M = malignant, B = benign
wdbc.data$Diagnosis <- factor(wdbc.data$Diagnosis,levels =c('B','M'),labels = c(B ='benign',M ='malignant'))
③ 如何用python實現隨機森林分類
大家如何使用scikit-learn包中的類方法來進行隨機森林演算法的預測。其中講的比較好的是各個參數的具體用途。
這里我給出我的理解和部分翻譯:
參數說明:
最主要的兩個參數是n_estimators和max_features。
n_estimators:表示森林裡樹的個數。理論上是越大越好。但是伴隨著就是計算時間的增長。但是並不是取得越大就會越好,預測效果最好的將會出現在合理的樹個數。
max_features:隨機選擇特徵集合的子集合,並用來分割節點。子集合的個數越少,方差就會減少的越快,但同時偏差就會增加的越快。根據較好的實踐經驗。如果是回歸問題則:
max_features=n_features,如果是分類問題則max_features=sqrt(n_features)。
如果想獲取較好的結果,必須將max_depth=None,同時min_sample_split=1。
同時還要記得進行cross_validated(交叉驗證),除此之外記得在random forest中,bootstrap=True。但在extra-trees中,bootstrap=False。
這里也給出一篇老外寫的文章:調整你的隨機森林模型參數http://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/
這里我使用了scikit-learn自帶的iris數據來進行隨機森林的預測:
[python]view plain
fromsklearn.
fromsklearn.
importnumpyasnp
fromsklearn.datasetsimportload_iris
iris=load_iris()
#printiris#iris的4個屬性是:萼片寬度萼片長度花瓣寬度花瓣長度標簽是花的種類:setosaversicolourvirginica
printiris['target'].shape
rf=RandomForestRegressor()#這里使用了默認的參數設置
rf.fit(iris.data[:150],iris.target[:150])#進行模型的訓練
#
#隨機挑選兩個預測不相同的樣本
instance=iris.data[[100,109]]
printinstance
print'instance0prediction;',rf.predict(instance[0])
print'instance1prediction;',rf.predict(instance[1])
printiris.target[100],iris.target[109]
[python]view plain
fromsklearn.cross_validationimportcross_val_score,ShuffleSplit
X=iris["data"]
Y=iris["target"]
names=iris["feature_names"]
rf=RandomForestRegressor()
scores=[]
foriinrange(X.shape[1]):
score=cross_val_score(rf,X[:,i:i+1],Y,scoring="r2",
cv=ShuffleSplit(len(X),3,.3))
scores.append((round(np.mean(score),3),names[i]))
printsorted(scores,reverse=True)
④ 四種聚類方法之比較
四種聚類方法之比較
介紹了較為常見的k-means、層次聚類、SOM、FCM等四種聚類演算法,闡述了各自的原理和使用步驟,利用國際通用測試數據集IRIS對這些演算法進行了驗證和比較。結果顯示對該測試類型數據,FCM和k-means都具有較高的准確度,層次聚類准確度最差,而SOM則耗時最長。
關鍵詞:聚類演算法;k-means;層次聚類;SOM;FCM
聚類分析是一種重要的人類行為,早在孩提時代,一個人就通過不斷改進下意識中的聚類模式來學會如何區分貓狗、動物植物。目前在許多領域都得到了廣泛的研究和成功的應用,如用於模式識別、數據分析、圖像處理、市場研究、客戶分割、Web文檔分類等[1]。
聚類就是按照某個特定標准(如距離准則)把一個數據集分割成不同的類或簇,使得同一個簇內的數據對象的相似性盡可能大,同時不在同一個簇中的數據對象的差異性也盡可能地大。即聚類後同一類的數據盡可能聚集到一起,不同數據盡量分離。
聚類技術[2]正在蓬勃發展,對此有貢獻的研究領域包括數據挖掘、統計學、機器學習、空間資料庫技術、生物學以及市場營銷等。各種聚類方法也被不斷提出和改進,而不同的方法適合於不同類型的數據,因此對各種聚類方法、聚類效果的比較成為值得研究的課題。
1 聚類演算法的分類
目前,有大量的聚類演算法[3]。而對於具體應用,聚類演算法的選擇取決於數據的類型、聚類的目的。如果聚類分析被用作描述或探查的工具,可以對同樣的數據嘗試多種演算法,以發現數據可能揭示的結果。
主要的聚類演算法可以劃分為如下幾類:劃分方法、層次方法、基於密度的方法、基於網格的方法以及基於模型的方法[4-6]。
每一類中都存在著得到廣泛應用的演算法,例如:劃分方法中的k-means[7]聚類演算法、層次方法中的凝聚型層次聚類演算法[8]、基於模型方法中的神經網路[9]聚類演算法等。
目前,聚類問題的研究不僅僅局限於上述的硬聚類,即每一個數據只能被歸為一類,模糊聚類[10]也是聚類分析中研究較為廣泛的一個分支。模糊聚類通過隸屬函數來確定每個數據隸屬於各個簇的程度,而不是將一個數據對象硬性地歸類到某一簇中。目前已有很多關於模糊聚類的演算法被提出,如著名的FCM演算法等。
本文主要對k-means聚類演算法、凝聚型層次聚類演算法、神經網路聚類演算法之SOM,以及模糊聚類的FCM演算法通過通用測試數據集進行聚類效果的比較和分析。
2 四種常用聚類演算法研究
2.1 k-means聚類演算法
k-means是劃分方法中較經典的聚類演算法之一。由於該演算法的效率高,所以在對大規模數據進行聚類時被廣泛應用。目前,許多演算法均圍繞著該演算法進行擴展和改進。
k-means演算法以k為參數,把n個對象分成k個簇,使簇內具有較高的相似度,而簇間的相似度較低。k-means演算法的處理過程如下:首先,隨機地選擇k個對象,每個對象初始地代表了一個簇的平均值或中心;對剩餘的每個對象,根據其與各簇中心的距離,將它賦給最近的簇;然後重新計算每個簇的平均值。這個過程不斷重復,直到准則函數收斂。通常,採用平方誤差准則,其定義如下:
這里E是資料庫中所有對象的平方誤差的總和,p是空間中的點,mi是簇Ci的平均值[9]。該目標函數使生成的簇盡可能緊湊獨立,使用的距離度量是歐幾里得距離,當然也可以用其他距離度量。k-means聚類演算法的演算法流程如下:
輸入:包含n個對象的資料庫和簇的數目k;
輸出:k個簇,使平方誤差准則最小。
步驟:
(1) 任意選擇k個對象作為初始的簇中心;
(2) repeat;
(3) 根據簇中對象的平均值,將每個對象(重新)賦予最類似的簇;
(4) 更新簇的平均值,即計算每個簇中對象的平均值;
(5) until不再發生變化。
2.2 層次聚類演算法
根據層次分解的順序是自底向上的還是自上向下的,層次聚類演算法分為凝聚的層次聚類演算法和分裂的層次聚類演算法。
凝聚型層次聚類的策略是先將每個對象作為一個簇,然後合並這些原子簇為越來越大的簇,直到所有對象都在一個簇中,或者某個終結條件被滿足。絕大多數層次聚類屬於凝聚型層次聚類,它們只是在簇間相似度的定義上有所不同。四種廣泛採用的簇間距離度量方法如下:
這里給出採用最小距離的凝聚層次聚類演算法流程:
(1) 將每個對象看作一類,計算兩兩之間的最小距離;
(2) 將距離最小的兩個類合並成一個新類;
(3) 重新計算新類與所有類之間的距離;
(4) 重復(2)、(3),直到所有類最後合並成一類。
2.3 SOM聚類演算法
SOM神經網路[11]是由芬蘭神經網路專家Kohonen教授提出的,該演算法假設在輸入對象中存在一些拓撲結構或順序,可以實現從輸入空間(n維)到輸出平面(2維)的降維映射,其映射具有拓撲特徵保持性質,與實際的大腦處理有很強的理論聯系。
SOM網路包含輸入層和輸出層。輸入層對應一個高維的輸入向量,輸出層由一系列組織在2維網格上的有序節點構成,輸入節點與輸出節點通過權重向量連接。學習過程中,找到與之距離最短的輸出層單元,即獲勝單元,對其更新。同時,將鄰近區域的權值更新,使輸出節點保持輸入向量的拓撲特徵。
演算法流程:
(1) 網路初始化,對輸出層每個節點權重賦初值;
(2) 將輸入樣本中隨機選取輸入向量,找到與輸入向量距離最小的權重向量;
(3) 定義獲勝單元,在獲勝單元的鄰近區域調整權重使其向輸入向量靠攏;
(4) 提供新樣本、進行訓練;
(5) 收縮鄰域半徑、減小學習率、重復,直到小於允許值,輸出聚類結果。
2.4 FCM聚類演算法
1965年美國加州大學柏克萊分校的扎德教授第一次提出了『集合』的概念。經過十多年的發展,模糊集合理論漸漸被應用到各個實際應用方面。為克服非此即彼的分類缺點,出現了以模糊集合論為數學基礎的聚類分析。用模糊數學的方法進行聚類分析,就是模糊聚類分析[12]。
FCM演算法是一種以隸屬度來確定每個數據點屬於某個聚類程度的演算法。該聚類演算法是傳統硬聚類演算法的一種改進。
演算法流程:
(1) 標准化數據矩陣;
(2) 建立模糊相似矩陣,初始化隸屬矩陣;
(3) 演算法開始迭代,直到目標函數收斂到極小值;
(4) 根據迭代結果,由最後的隸屬矩陣確定數據所屬的類,顯示最後的聚類結果。
3 四種聚類演算法試驗
3.1 試驗數據
實驗中,選取專門用於測試分類、聚類演算法的國際通用的UCI資料庫中的IRIS[13]數據集,IRIS數據集包含150個樣本數據,分別取自三種不同的鶯尾屬植物setosa、versicolor和virginica的花朵樣本,每個數據含有4個屬性,即萼片長度、萼片寬度、花瓣長度,單位為cm。在數據集上執行不同的聚類演算法,可以得到不同精度的聚類結果。
3.2 試驗結果說明
文中基於前面所述各演算法原理及演算法流程,用matlab進行編程運算,得到表1所示聚類結果。
如表1所示,對於四種聚類演算法,按三方面進行比較:(1)聚錯樣本數:總的聚錯的樣本數,即各類中聚錯的樣本數的和;(2)運行時間:即聚類整個過程所耗費的時間,單位為s;(3)平均准確度:設原數據集有k個類,用ci表示第i類,ni為ci中樣本的個數,mi為聚類正確的個數,則mi/ni為第i類中的精度,則平均精度為:
3.3 試驗結果分析
四種聚類演算法中,在運行時間及准確度方面綜合考慮,k-means和FCM相對優於其他。但是,各個演算法還是存在固定缺點:k-means聚類演算法的初始點選擇不穩定,是隨機選取的,這就引起聚類結果的不穩定,本實驗中雖是經過多次實驗取的平均值,但是具體初始點的選擇方法還需進一步研究;層次聚類雖然不需要確定分類數,但是一旦一個分裂或者合並被執行,就不能修正,聚類質量受限制;FCM對初始聚類中心敏感,需要人為確定聚類數,容易陷入局部最優解;SOM與實際大腦處理有很強的理論聯系。但是處理時間較長,需要進一步研究使其適應大型資料庫。
聚類分析因其在許多領域的成功應用而展現出誘人的應用前景,除經典聚類演算法外,各種新的聚類方法正被不斷被提出。
⑤ 高斯混合模型(GMM)及EM演算法的初步理解
高斯混合模型(Gaussian Mixed Model)指的是多個高斯分布函數的線性組合,理論上GMM可以擬合出任意類型的分布,通常用於解決同一集合下的數據包含多個不同的分布的情況(或者是同一類分布但參數不一樣,或者是不同類型的分布,比如正態分布和伯努利分布)。
如圖1,圖中的點在我們看來明顯分成兩個聚類。這兩個聚類中的點分別通過兩個不同的正態分布隨機生成而來。但是如果沒有GMM,那麼只能用一個的二維高斯分布來描述圖1中的數據。圖1中的橢圓即為二倍標准差的正態分布橢圓。這顯然不太合理,畢竟肉眼一看就覺得應該把它們分成兩類。
這時候就可以使用GMM了!如圖2,數據在平面上的空間分布和圖1一樣,這時使用兩個二維高斯分布來描述圖2中的數據,分別記為N(μ1,Σ1)和N(μ2,Σ2) 。圖中的兩個橢圓分別是這兩個高斯分布的二倍標准差橢圓。可以看到使用兩個二維高斯分布來描述圖中的數據顯然更合理。實際上圖中的兩個聚類的中的點是通過兩個不同的正態分布隨機生成而來。如果將兩個二維高斯分布N(μ1,Σ1)和N(μ2,Σ2) 合成一個二維的分布,那麼就可以用合成後的分布來描述圖2中的所有點。最直觀的方法就是對這兩個二維高斯分布做線性組合,用線性組合後的分布來描述整個集合中的數據。這就是高斯混合模型(GMM)。
高斯混合模型(GMM)的數學表示:
期望極大(Expectation Maximization)演算法,也稱EM演算法,是一種迭代演算法,由Dempster et. al 在1977年提出,用於含有隱變數的概率參數模型的極大似然估計。
EM演算法作為一種數據添加演算法,在近幾十年得到迅速的發展,主要源於當前科學研究以及各方面實際應用中數據量越來越大的情況下,經常存在數據缺失或者不可用的的問題,這時候直接處理數據比較困難,而數據添加辦法有很多種,常用的有神經網路擬合、添補法、卡爾曼濾波法等,但是EM演算法之所以能迅速普及主要源於它演算法簡單,穩定上升的步驟能相對可靠地找到「最優的收斂值」。
(個人的理解就是用含有隱變數的含參表達式不斷擬合,最終能收斂並擬合出不含隱變數的含參表達式)
模型的EM訓練過程,直觀的來講是這樣:我們通過觀察采樣的概率值和模型概率值的接近程度,來判斷一個模型是否擬合良好。然後我們通過調整模型以讓新模型更適配采樣的概率值。反復迭代這個過程很多次,直到兩個概率值非常接近時,我們停止更新並完成模型訓練。現在我們要將這個過程用演算法來實現,所使用的方法是模型生成的數據來決定似然值,即通過模型來計算數據的期望值。通過更新參數μ和σ來讓期望值最大化。這個過程可以不斷迭代直到兩次迭代中生成的參數變化非常小為止。該過程和k-means的演算法訓練過程很相似(k-means不斷更新類中心來讓結果最大化),只不過在這里的高斯模型中,我們需要同時更新兩個參數:分布的均值和標准差.[3]
GMM常用於聚類。如果要從 GMM 的分布中隨機地取一個點的話,實際上可以分為兩步:首先隨機地在這 K 個 Component 之中選一個,每個 Component 被選中的概率實際上就是它的系數Πk ,選中 Component 之後,再單獨地考慮從這個 Component 的分布中選取一個點就可以了──這里已經回到了普通的 Gaussian 分布,轉化為已知的問題。
根據數據來推算概率密度通常被稱作 density estimation 。特別地,當我已知(或假定)概率密度函數的形式,而要估計其中的參數的過程被稱作『參數估計』。
(推導和迭代收斂過程這里省略,可參考資料1)
一個實際的例子:用GMM對iris數據集進行聚類,並通過make_ellipses表示出來
make_ellipses方法概念上很簡單,它將gmm對象(訓練模型)、坐標軸、以及x和y坐標索引作為參數,運行後基於指定的坐標軸繪制出相應的橢圓圖形。
在特定條件下,k-means和GMM方法可以互相用對方的思想來表達。在k-means中根據距離每個點最接近的類中心來標記該點的類別,這里存在的假設是每個類簇的尺度接近且特徵的分布不存在不均勻性。 這也解釋了為什麼在使用k-means前對數據進行歸一會有效果。高斯混合模型則不會受到這個約束 ,因為它對每個類簇分別考察特徵的協方差模型。
K-means演算法可以被視為高斯混合模型(GMM)的一種特殊形式。 整體上看,高斯混合模型能提供更強的描述能力,因為聚類時數據點的從屬關系不僅與近鄰相關,還會依賴於類簇的形狀。n維高斯分布的形狀由每個類簇的協方差來決定。在協方差矩陣上添加特定的約束條件後,可能會通過GMM和k-means得到相同的結果。
在k-means方法中使用EM來訓練高斯混合模型時對初始值的設置非常敏感。而對比k-means,GMM方法有更多的初始條件要設置。實踐中不僅初始類中心要指定,而且協方差矩陣和混合權重也要設置。可以運行k-means來生成類中心,並以此作為高斯混合模型的初始條件。由此可見並兩個演算法有相似的處理過程,主要區別在於模型的復雜度不同。
高斯混合模型的基本假設是 已知類別的比例 和 類別的個數 ,但是不知道每個樣例的具體標簽,據此用EM的模式為每個樣本進行最優的標注。也就是說它適合的是 無標簽學習的分類問題 ,並且需要已知基本假設。
整體來看,所有無監督機器學習演算法都遵循一條簡單的模式:給定一系列數據,訓練出一個能描述這些數據規律的模型(並期望潛在過程能生成數據)。 訓練過程通常要反復迭代,直到無法再優化參數獲得更貼合數據的模型為止。
【1】https://blog.csdn.net/jinping_shi/article/details/59613054 高斯混合模型(GMM)及其EM演算法的理解
【2】https://cloud.tencent.com/developer/news/231599 機器學習中的數學(4)-EM演算法與高斯混合模型(GMM)
【3】https://zhuanlan.hu.com/p/31103654 一文詳解高斯混合模型原理