分类与聚类
一:分類
1:定義
分類其實是從特定的數(shù)據(jù)中挖掘模式,做出判斷的過程。
分類是在一群已經(jīng)知道類別標(biāo)號的樣本中,訓(xùn)練一種分類器,讓其能夠?qū)δ撤N未知的樣本進(jìn)行分類。分類算法屬于一種有監(jiān)督的學(xué)習(xí)。分類算法的分類過程就是建立一種分類模型來描述預(yù)定的數(shù)據(jù)集或概念集,通過分析由屬性描述的數(shù)據(jù)庫元組來構(gòu)造模型。分類的目的就是使用分類對新的數(shù)據(jù)集進(jìn)行劃分,其主要涉及分類規(guī)則的準(zhǔn)確性、過擬合、矛盾劃分的取舍等。
2:分類學(xué)習(xí)主要過程:
(1):訓(xùn)練數(shù)據(jù)及存在一個類標(biāo)記號,判斷他是正向數(shù)據(jù)集(起積極作用,不垃圾郵件),還是負(fù)向數(shù)據(jù)集(其抑制作用,垃圾郵件)
(2):然后需要對數(shù)據(jù)集進(jìn)行學(xué)習(xí)訓(xùn)練,并構(gòu)建一個訓(xùn)練的模型
(3):通過該模型對預(yù)測數(shù)據(jù)集進(jìn)行預(yù)測,并計算其結(jié)果的性能
3:常用的分類算法包括:
NBC(Naive Bayesian Classifier,樸素貝葉斯分類)算法、LR(Logistic Regress,邏輯回歸)算法、ID3(Iterative Dichotomiser 3 迭代二叉樹3 代)決策樹算法、C4.5 決策樹算法、C5.0 決策樹算法、SVM(Support Vector Machine,支持向量機(jī))算法、KNN(K-Nearest Neighbor,K 最近鄰近)算法、ANN(Artificial Neural Network,人工神經(jīng)網(wǎng)絡(luò))算法等。
(1)NBC算法
NBC 模型發(fā)源于古典數(shù)學(xué)理論,有著堅實的數(shù)學(xué)基礎(chǔ)。該算法是基于條件獨立性假設(shè)的一種算法,當(dāng)條件獨立性假設(shè)成立時,利用貝葉斯公式計算出其后驗概率,即該對象屬于某一類的概率,選擇具有最大后驗概率的類作為該對象所屬的類。
NBC算法的優(yōu)點:
NBC算法邏輯簡單,易于實現(xiàn);
NBC算法所需估計的參數(shù)很少;
NBC 算法對缺失數(shù)據(jù)不太敏感;
NBC 算法具有較小的誤差分類率;
NBC 算法性能穩(wěn)定,健壯性比較好;
NBC算法的缺點:
1.在屬性個數(shù)比較多或者屬性之間相關(guān)性較大時,NBC 模型的分類效果相對較差;
2.算法是基于條件獨立性假設(shè)的,在實際應(yīng)用中很難成立,故會影響分類效果
(2)LR算法
LR 回歸是當(dāng)前業(yè)界比較常用的機(jī)器學(xué)習(xí)方法,用于估計某種事物的可能性。它與多元線性回歸同屬一個家族,即廣義線性模型。簡單來說多元線性回歸是直接將特征值和其對應(yīng)的概率進(jìn)行相乘得到一個結(jié)果,邏輯回歸則是在這樣的結(jié)果上加上一個邏輯函數(shù)。在此選擇LR 作為回歸分析模型的代表進(jìn)行介紹。
LR算法的優(yōu)點
1.對數(shù)據(jù)中小噪聲的魯棒性好;
2.LR 算法已被廣泛應(yīng)用于工業(yè)問題中;
3.多重共線性并不是問題,它可結(jié)合正則化來解決。
LR算法的缺點
1.對于非線性特征,需要轉(zhuǎn)換
2.當(dāng)特征空間很大時,LR的性能并不是太好
(3)SVM算法(比較常用的)
SVM 算法是建立在統(tǒng)計學(xué)習(xí)理論基礎(chǔ)上的機(jī)器學(xué)習(xí)方法,為十大數(shù)據(jù)挖掘算法之一。通過學(xué)習(xí)算法,SVM 可以自動尋找出對分類有較好區(qū)分能力的支持向量,由此構(gòu)造出的分類器可以最大化類與類的間隔,因而有較好的適應(yīng)能力和較高的分準(zhǔn)率。SVM 算法的目的在于尋找一個超平面H,該超平面可以將訓(xùn)練集中的數(shù)據(jù)分開,且與類域邊界的沿垂直于該超平面方向的距離最大,故SVM 法亦被稱為最大邊緣算法。
SVM算法的優(yōu)點
1.SVM 模型有很高的分準(zhǔn)率;
2. SVM 模型有很高的泛化性能;
3. SVM 模型能很好地解決高維問題;
4. SVM 模型對小樣本情況下的機(jī)器學(xué)習(xí)問題效果好。
SVM算法的缺點
1.SVM 模型對缺失數(shù)據(jù)敏感;
2.對非線性問題沒有通用解決方案,得謹(jǐn)慎選擇核函數(shù)來處理。
(4)ID3算法
ID3 算法是一種基于決策樹的分類算法,該算法是以信息論為基礎(chǔ),以信息熵和信息增益為衡量標(biāo)準(zhǔn),從而實現(xiàn)對數(shù)據(jù)的歸納分類。信息增益用于度量某個屬性對樣本集合分類的好壞程度。ID3 算法的時間復(fù)雜度為O(n*|D|*log|D|)。
ID3算法的優(yōu)點
ID3 算法建立的決策樹規(guī)模比較小;
查詢速度快。
ID3算法的缺點
1.不適合處理連續(xù)數(shù)據(jù);
2.難以處理海量數(shù)據(jù)集;
3.建樹時偏選屬性值較大的進(jìn)行分離,而有時屬性值較大的不一定能反應(yīng)更多的數(shù)據(jù)信息。
(5)C4.5 算法
C4.5 算法是ID3 算法的修訂版,采用信息增益率來加以改進(jìn),選取有最大增益率的分割變量作為準(zhǔn)則,避免ID3 算法過度的適配問題。
C4.5算法優(yōu)點
1.C4.5 繼承了ID3 優(yōu)點;
2.在樹構(gòu)造過程中進(jìn)行剪枝;
3.能對不完整數(shù)據(jù)進(jìn)行處理;
4.能夠完成對連續(xù)屬性的離散化處理;
5.產(chǎn)生的分類規(guī)則易于理解,準(zhǔn)確率較高;
6.用增益率來選擇屬性,克服了用增益選擇屬性時偏向選擇取值多的屬性。
C4.5 算法缺點
1.構(gòu)造樹時,需要對數(shù)據(jù)集進(jìn)行多次的順序掃描和排序,因而導(dǎo)致算法的低效;
2.只適合于能駐留于內(nèi)存的數(shù)據(jù)集,當(dāng)訓(xùn)練集達(dá)到內(nèi)存無法容納時程序無法運行。
C4.5 用于遙感分類過程中,首先依據(jù)通常的方式建立第一個模型。隨后建立的第二個模型聚焦于被第一個模型錯誤分類的記錄。以此類推,最后應(yīng)用整個模型集對樣本進(jìn)行分類,使用加權(quán)投票過程把分散的預(yù)測合并成綜合預(yù)測。Boosting 技術(shù)對于噪聲不大的數(shù)據(jù),通常通過建立的多模型來減少錯誤分類的影響,提高分類精度。
(5)C5.0算法
C5.0 算法是 Quinlan 在C4.5 算法的基礎(chǔ)上改進(jìn)而來的產(chǎn)生決策樹的一種更新的算法,它除了包括C4.5 的全部功能外,還引入許多新的技術(shù),其中最重要的技術(shù)是提升(Boosting)技術(shù),目的是為了進(jìn)一步提高決策樹對樣本的識別率。同時C5.0 的算法復(fù)雜度要更低,使用更簡單,適應(yīng)性更強(qiáng),因此具有更高的使用價值。
C5.0算法的優(yōu)點
1.C5.0 模型能同時處理連續(xù)和離散的數(shù)據(jù)
2.C5.0 模型估計
模型通常不需要很長的訓(xùn)練時間;
3.C5.0 引入Boosting 技術(shù)以提高分類的效率和精度;
4.C5.0 模型易于理解,模型推出的規(guī)則有非常直觀的解釋;
5.C5.0 模型在面對數(shù)據(jù)遺漏和特征很多的問題時非常穩(wěn)健。
C5.0算法的缺點
目標(biāo)字段必須為分類字段。
美國地質(zhì)調(diào)查局(USGS)在進(jìn)行土地覆蓋分類項目過程中研發(fā)了支持決策樹分類的軟件。軟件分類模塊主要是針對龐大數(shù)據(jù)量的數(shù)據(jù)集進(jìn)行數(shù)據(jù)挖掘,找出特征,然后建立規(guī)則集進(jìn)行決策分類。在分類模塊中采用C5.0 模型來完成決策樹分類、形成分類文件,實現(xiàn)遙感影像的分類。
(6)KNN 算法
KNN 算法是Cover 和Hart 于1968 年提出的理論上比較成熟的方法,為十大挖掘算法之一。該算法的思路非常簡單直觀:如果一個樣本在特征空間中的k 個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。該方法在定類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN算法的優(yōu)點
1.KNN 算法簡單、有效;
2.KNN 算法適用于樣本容量比較大的類域的自動分類;
3.由于KNN 方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,KNN 方法較其他方法更為適合。
KNN算法的缺點
1.KNN 算法計算量較大;
2.KNN 算法需要事先確定K 值;
3.KNN 算法輸出的可解釋不強(qiáng);
4. KNN 算法對樣本容量較小的類域很容易產(chǎn)生誤分。
(7)ANN 算法
人工神經(jīng)網(wǎng)絡(luò)(ANN)算法就是一組連續(xù)的輸入/輸出單元,其中每個連接都與一個權(quán)相關(guān)。在學(xué)習(xí)階段,通過調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán),使得能夠預(yù)測樣本的正確類標(biāo)號來學(xué)習(xí)。
ANN算法的優(yōu)點
1.能處理數(shù)值型及分類型的屬性;
2.分類的準(zhǔn)確度高,分布并行處理能力強(qiáng);
3.對包含大量噪聲數(shù)據(jù)的數(shù)據(jù)集有較強(qiáng)的魯棒性和容錯能力。
ANN算法的缺點
1.不能觀察之間的學(xué)習(xí)過程;
2.學(xué)習(xí)時間過長,甚至可能達(dá)不到學(xué)習(xí)的目的;
3.對于非數(shù)值型數(shù)據(jù)需要做大量數(shù)據(jù)預(yù)處理工作;
4.輸出結(jié)果難以解釋,會影響到結(jié)果的可信度和可接受程度;
5.神經(jīng)網(wǎng)絡(luò)需要大量的參數(shù),如網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、權(quán)值和閾值的初始值。
小結(jié):
參考:參考1
二:聚類
1:定義
從廣義上說,聚類就是將數(shù)據(jù)集中在某些方面相似的數(shù)據(jù)成員放在一起。
一個聚類就是一些數(shù)據(jù)實例的集合,其中處于相同聚類中的數(shù)據(jù)元素彼此相似,但是處于不同居類中的元素彼此不同。
由于在聚類中那些數(shù)據(jù)類別的分類或分組信息是沒有的,即這些數(shù)據(jù)是沒有標(biāo)簽的,所以聚類通常被稱為無監(jiān)督學(xué)習(xí)。
聚類分析是根據(jù)在數(shù)據(jù)中發(fā)現(xiàn)的描述對象及其關(guān)系的信息,將數(shù)據(jù)對象分組。目的是,組內(nèi)的對象相互之間是相似的(相關(guān)的),而不同組中的對象是不同的(不相關(guān)的)。組內(nèi)相似性越大,組間差距越大,說明聚類效果越好。
也就是說, 聚類的目標(biāo)是得到較高的簇內(nèi)相似度和較低的簇間相似度,使得簇間的距離盡可能大,簇內(nèi)樣本與簇中心的距離盡可能小
聚類之后的數(shù)據(jù),只能顯示出這一類之間的數(shù)據(jù)有相似性,并不能說明其他問題
參考鏈接:這篇文章講解聚類很全
?
2:K-means聚類
k均值聚類是最常用的聚類算法,最初起源于信號處理,其目標(biāo)是將數(shù)據(jù)點劃分為K個類簇,找到每個簇的中心并使其亮度最小化。
該算法的最大優(yōu)點是簡單、便于理解,運行速度較快,缺點是只能應(yīng)用于連續(xù)性數(shù)據(jù),并且要在聚類前指定聚類的類簇數(shù)。
K均值算法是一種原型聚類算法。
?
步驟:
①六個隨機(jī)樣本點
②
③
④
⑤
⑥
在圖像處理中,通過k均值聚類算法可以實現(xiàn)圖像分割、圖像聚類、圖像識別等操作
我們通過k均值可以將這些像素點聚類成K個簇,然后使用每個簇內(nèi)的質(zhì)心點來替換簇內(nèi)所有的像素點,這樣就能實現(xiàn)在不改變分辨率的情況下量化壓縮圖像顏色,實現(xiàn)圖像顏色層級分割。
3:K-means聚類與圖像處理
優(yōu)點:
①解決聚類問題的一種經(jīng)典算法,簡單快速
②對處理大數(shù)據(jù)集,該算法保持可伸縮性和高效率
③當(dāng)結(jié)果簇是密集的,他的效果較好
缺點:
①在簇的平均值可被定義的情況下才能使用,可能不適用于某些應(yīng)用
②必須實現(xiàn)給出k(要生成的簇的數(shù)目),而且對處置敏感,對于不同的初始值,可能會導(dǎo)致不同的結(jié)果
③不適合于發(fā)現(xiàn)非凸形狀的簇或者大小差別很大的簇
④對噪聲和孤立點數(shù)據(jù)敏感
三:代碼
1:灰度圖
# coding: utf-8''' 在OpenCV中,Kmeans()函數(shù)原型如下所示: retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])data表示聚類數(shù)據(jù),最好是np.flloat32類型的N維點集K表示聚類類簇數(shù)bestLabels表示輸出的整數(shù)數(shù)組,用于存儲每個樣本的聚類標(biāo)簽索引criteria表示算法終止條件,即最大迭代次數(shù)或所需精度。在某些迭代中,一旦每個簇中心的移動小于criteria.epsilon,算法就會停止attempts表示重復(fù)試驗kmeans算法的次數(shù),算法返回產(chǎn)生最佳緊湊性的標(biāo)簽flags表示初始中心的選擇,兩種方法是cv2.KMEANS_PP_CENTERS ;和cv2.KMEANS_RANDOM_CENTERScenters表示集群中心的輸出矩陣,每個集群中心為一行數(shù)據(jù) '''import cv2 import numpy as np import matplotlib.pyplot as plt#讀取原始圖像灰度顏色 img = cv2.imread('lenna.png', 0) print (img.shape)#獲取圖像高度、寬度 rows, cols = img.shape[:]#圖像二維像素轉(zhuǎn)換為一維 data = img.reshape((rows * cols, 1)) data = np.float32(data)#定義中心 (type,max_iter,epsilon) criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#設(shè)置標(biāo)簽 flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚類 聚集成4類 compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)#生成最終圖像 dst = labels.reshape((img.shape[0], img.shape[1]))#用來正常顯示中文標(biāo)簽 plt.rcParams['font.sans-serif']=['SimHei']#顯示圖像 titles = [u'原始圖像', u'聚類圖像'] images = [img, dst] for i in range(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()2:數(shù)據(jù)
# coding=utf-8 from sklearn.cluster import KMeans""" 第一部分:數(shù)據(jù)集 X表示二維矩陣數(shù)據(jù),籃球運動員比賽數(shù)據(jù) 總共20行,每行兩列數(shù)據(jù) 第一列表示球員每分鐘助攻數(shù):assists_per_minute 第二列表示球員每分鐘得分?jǐn)?shù):points_per_minute """ X = [[0.0888, 0.5885],[0.1399, 0.8291],[0.0747, 0.4974],[0.0983, 0.5772],[0.1276, 0.5703],[0.1671, 0.5835],[0.1306, 0.5276],[0.1061, 0.5523],[0.2446, 0.4007],[0.1670, 0.4770],[0.2485, 0.4313],[0.1227, 0.4909],[0.1240, 0.5668],[0.1461, 0.5113],[0.2315, 0.3788],[0.0494, 0.5590],[0.1107, 0.4799],[0.1121, 0.5735],[0.1007, 0.6318],[0.2567, 0.4326],[0.1956, 0.4280] ]#輸出數(shù)據(jù)集 print (X)""" 第二部分:KMeans聚類 clf = KMeans(n_clusters=3) 表示類簇數(shù)為3,聚成3類數(shù)據(jù),clf即賦值為KMeans y_pred = clf.fit_predict(X) 載入數(shù)據(jù)集X,并且將聚類的結(jié)果賦值給y_pred """clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X)#輸出完整Kmeans函數(shù),包括很多省略參數(shù) print(clf) #輸出聚類預(yù)測結(jié)果 print("y_pred = ",y_pred)""" 第三部分:可視化繪圖 """import numpy as np import matplotlib.pyplot as plt#獲取數(shù)據(jù)集的第一列和第二列數(shù)據(jù) 使用for循環(huán)獲取 n[0]表示X第一列 x = [n[0] for n in X] print (x) y = [n[1] for n in X] print (y)''' 繪制散點圖 參數(shù):x橫軸; y縱軸; c=y_pred聚類預(yù)測結(jié)果; marker類型:o表示圓點,*表示星型,x表示點; ''' plt.scatter(x, y, c=y_pred, marker='x')#繪制標(biāo)題 plt.title("Kmeans-Basketball Data")#繪制x軸和y軸坐標(biāo) plt.xlabel("assists_per_minute") plt.ylabel("points_per_minute")#設(shè)置右上角圖例 plt.legend(["A","B","C"])#顯示圖形 plt.show()3:RGB 圖像
# coding: utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt#讀取原始圖像 img = cv2.imread('lenna.png') print (img.shape)#圖像二維像素轉(zhuǎn)換為一維 data = img.reshape((-1,3)) data = np.float32(data)#定義中心 (type,max_iter,epsilon) criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#設(shè)置標(biāo)簽 flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚類 聚集成2類 compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)#K-Means聚類 聚集成4類 compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)#K-Means聚類 聚集成8類 compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)#K-Means聚類 聚集成16類 compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)#K-Means聚類 聚集成64類 compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)#圖像轉(zhuǎn)換回uint8二維類型 centers2 = np.uint8(centers2) res = centers2[labels2.flatten()] dst2 = res.reshape((img.shape))centers4 = np.uint8(centers4) res = centers4[labels4.flatten()] dst4 = res.reshape((img.shape))centers8 = np.uint8(centers8) res = centers8[labels8.flatten()] dst8 = res.reshape((img.shape))centers16 = np.uint8(centers16) res = centers16[labels16.flatten()] dst16 = res.reshape((img.shape))centers64 = np.uint8(centers64) res = centers64[labels64.flatten()] dst64 = res.reshape((img.shape))#圖像轉(zhuǎn)換為RGB顯示 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB) dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB) dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB) dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB) dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)#用來正常顯示中文標(biāo)簽 plt.rcParams['font.sans-serif']=['SimHei']#顯示圖像 titles = [u'原始圖像', u'聚類圖像 K=2', u'聚類圖像 K=4',u'聚類圖像 K=8', u'聚類圖像 K=16', u'聚類圖像 K=64'] images = [img, dst2, dst4, dst8, dst16, dst64] for i in range(6): plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()純屬筆記用,若有侵權(quán)請聯(lián)系我刪除
小白學(xué)習(xí)中,感謝各位大佬的博客幫助。
總結(jié)
- 上一篇: C#写的WebServices可运行于树
- 下一篇: 在线python视频教程_【好程序员】2