-
模型
|
模型特點
|
位于
|
SVM |
強大的模型,可以用來回歸,預測,分類等,而根據(jù)選取不同的和函數(shù),模型可以是線性的/非線性的 |
sklearn.svm |
決策樹 |
基于"分類討論,逐步細化"思想的分類模型,模型直觀,易解釋 |
sklearn.tree |
樸素貝葉斯 |
基于概率思想的簡單有效的分類模型,能夠給出容易理解的概率解釋 |
sklearn.naive_bayes |
神經網絡 |
具有強大的擬合能力,可疑用于擬合,分類等,它有多個增強版本,如遞神經網絡,卷積神經網絡,自編嗎器等,這些是深度學習的模型基礎 |
Keras |
邏輯回歸 |
比較基礎的線性分類模型,很多時候是簡單有效的選擇 |
sklearn.linear_model |
隨機森林 |
思想跟決策樹類似,精度通常比決策樹要高,缺點是由于隨機性, 喪失了決策樹的可解釋性 |
sklearn.ensemble |
- python建模的步驟:
- 建立一個對象(這個對象是空白的,需要進一步訓練)
- 然后,我們要設置模型的參數(shù)
- 接著就是通過fit()方法對模型進行訓練
- 最后通過predict()方法預測結果
- 對模型的評估score()方法等
- 聚類分析
- 常用聚類分析算法
- 與分類不同,聚類分析是在沒有給定劃分類別的情況下,根據(jù)數(shù)據(jù)相似度進行樣本分組的一種方法.與分類模型需要使用有類標記樣本構成的訓練數(shù)據(jù)不同,聚類模型可疑建立在吳磊標記的數(shù)據(jù)上,是一種非監(jiān)督的學習算法.聚類的輸入是一組為被標記的樣本,聚類根據(jù)數(shù)據(jù)自身距離或相似度將其劃分為若干組,劃分的原則是組內距離最小化而組件距離最大化.
-
類別
|
包括主要算法
|
劃分(分裂)方法 |
K-Means算法(K-均值),K-MEDOIDS算法(K-中心點),CLARANS算法(基于選擇的算法) |
層次分析方法 |
BIRCH算法(平衡迭代規(guī)約和聚類),CURE算法(代表點聚類),CHAMLEON算法 |
基于密度的方法 |
DBSCAN算法(基于密度連接區(qū)域).DENCLUE算法(密度分布函數(shù)),OPTICS算法(對象識別排序) |
基于網絡的方法 |
STING(統(tǒng)計信息網絡),CLIOUE算法(聚類高維空間),WAVE-CLUSTER算法(小波變換) |
基于模型的方法 |
統(tǒng)計學方法,神經網絡方法
|
- 聚類分析的算法
-
算法名稱
|
算法描述
|
K-Means |
K-均值聚類也稱為快速聚類法,在最小化誤差函數(shù)的基礎上家境數(shù)據(jù)劃分為預訂的類數(shù)K,該算法原理簡單并便于處理處理數(shù)據(jù) |
K-中心點 |
K-均值算法對孤立點的敏感性, K-中心點算法不采用簇中對象的平均值作為簇中心,而選用簇中離平均值最近的對象作為簇中心 |
系統(tǒng)聚類 |
系統(tǒng)聚類也稱為多層次聚類,分類的單位由高到低呈樹形結構,且所處的為孩子越低,其包含的對象就越少,但這些對象間的共同特征越多,該聚類的方法只適合小數(shù)據(jù)量的時候使用,數(shù)據(jù)量大的時候速度會非常快 |
- K-Means聚類算法
- K-Means算法十典型的基于距離的非層次聚類算法,在最小化誤差函數(shù)的基礎上將數(shù)據(jù)劃分為預定的類數(shù)K,采用距離作為相似性的評價指標,即認為兩個對象的距離越近,其相似度就越大.
- 算法過程
- 從N個樣本書中隨機選取K個對象作為初始的聚類中心
- 分別計算每個樣本到各個聚類中心的距離,將對象分配到聚類中
- 所有對象分配完成后,重新計算K個聚類中心.
- 與前一次計算得到的K個聚類中心比較,如果聚類中心發(fā)生變化轉第2步, 否則轉第5步
- 當質心不發(fā)生變化時停止輸出聚類結果
- 聚類的結果可能依賴初始聚類中心的隨機選擇,可能使得結果嚴重偏離全局最優(yōu)分類,實踐中,為了得到較好的效果,通常選擇不同的初始聚類中心,多次運行K-Means算法,在所有對象分配完成后,重新計算K個聚類中心時,對于連續(xù)數(shù)據(jù),聚類中心取簇的均值,但是當樣本的某些屬性是分類變量時,均值可能無定義,可疑使用K-眾數(shù)方法
- 數(shù)據(jù)類型與相似性的度量
- 連續(xù)屬性
- 對于連續(xù)屬性,要先對個屬性值進行零 - 均值規(guī)范, 再進行距離的計算.在K-Means聚類算法中,一般需要度量樣本之間的距離,樣本與簇之間的距離以及簇與簇之間的距離
- 度量樣本之間的相似性最常用的是歐幾里得距離,曼哈頓距離和閔可夫斯基距離;樣本與簇之間的距離可以用樣本到簇中心的距離d(ei,x);簇與簇之間的距離剋用簇中心的距離d(ei,ej)
- 歐幾里得距離:
- d(i,j) = ((xi1 - xj1)2 + (xi2 - xj2)2 + ... + (xip - xjp)2)1/2
- 曼哈頓距離:
- d(i,j) = |xi1 - xj1| + |xi1 - xj1| + ... + |xip - xjp|
- 閔可夫斯基距離:
- d(i,j) = ((|xi1 - xj1|)q + (|xi2 - xj2|)q + ... + (|xip - xjp|)q)1/2
- q為正整數(shù), q=1時,即為曼哈頓距離,;q=2時即為歐幾里得距離
- 目標函數(shù)
- 使用誤差平方和SSE作為度量聚類質量的目標函數(shù),對于兩種不同的聚類結果,訓著誤差平方和較小的分類結果.
- 連續(xù)屬性的SSE計算公式為:
- SSE = ∑Ki=1∑x€Eidist(ei, x)2
- 文檔數(shù)據(jù)的SSE計算公式為:
- SE = ∑Ki=1∑x€Eicos(ei, x)2
- 簇Ei的聚類中心ei計算公式為
-
符號
|
含義
|
符號
|
含義
|
k |
聚類簇的個數(shù) |
ei |
簇Ei的聚類中心 |
Ei |
第i個簇 |
ni |
第i個簇中樣本的個數(shù) |
x |
對象(樣本) |
-
-
-
-
ID
|
R(最近一次消費時間間隔)
|
F(消費頻率)
|
M(消費總金額)
|
1 |
37 |
4 |
579 |
2 |
35 |
3 |
616 |
3 |
25 |
10 |
394 |
4 |
52 |
2 |
111 |
5 |
36 |
7 |
521 |
6 |
41 |
5 |
225 |
7 |
56 |
3 |
118 |
8 |
37 |
5 |
793 |
9 |
54 |
2 |
111 |
10 |
5 |
18 |
1086 |
- 采用K-Means聚類算法,設定聚類個數(shù)K為3,最大迭代次數(shù)為500次,距離函數(shù)取歐式距離
-
import pandas as pd
k = 3 # 聚類的類別
iteration = 500 # 聚類最大循環(huán)次數(shù)
data = pd.read_csv("sales_bak.csv",sep=",",header=None,
names=["ID", "R", "F", "M"])
data_zs = 1.0*(data - data.mean()) / data.std() # 數(shù)據(jù)標準化
from sklearn.cluster import KMeans
model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration) # 分為k類并發(fā)數(shù)4
model.fit(data_zs) # 開始聚類
# 打印結果
r1 = pd.Series(model.labels_).value # 統(tǒng)計各個類別的數(shù)目
r2 = pd.DataFrame(model.cluster_centers_) # 找到聚類中心
r = pd.concat([r2,r1], axis=1) # 橫向連接(0時縱向),得到聚類中心對應的類別下的數(shù)目
r.columns = list(data.column) + [u'類別數(shù)目'] # 重命名表頭
print r
# 詳細輸出原始數(shù)據(jù)機器類別
r = pd.concat([data, pd.Series(model.labels_, index=data.index)], axis=1) # 詳細輸出每個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] # 重命名表頭
r.to_excel("sales.xlxs")
- 事實上,Scikit-Learn中的K-Means算法僅僅支持歐式距離,原因在于采用其他的距離并不一定能夠保證算法的收斂性
- 然后用pandas和Matplotlib繪制的不同客戶分群的概率密度函數(shù)圖,通過這些圖能直觀的比較不同客戶群的價值
- 聚類分析算法評價
- 聚類分析僅根據(jù)樣本數(shù)據(jù)本身將樣本分組,其目標時實現(xiàn)組內的對象相互之間時相似的(相關的),而不同組中的對象時不同的(不相關),組內的相似性越大,組間差別越大,聚類效果就越好
- purity評價法
- purity方法時極為簡單的一種聚類評價方法,只需計算正確聚類占總數(shù)的比例
- purity(x,y) = 1/n∑kmax| xkΩ yi |
- 其中,x = (x1, x2, ... xk)時聚類的集合.xk表示第k個聚類的集合.y=(y1,y2,...yk)表示需要被聚類的集合,yi表示第i個聚類對象.n表示被聚類集合對象的總數(shù)
- RI評價法
- 實際上,這是一種用排列組合原理來對聚類進行評價的手段,RI評價公式如下.
- RI = R + W / R + M + D + W
- 其中,R是指被聚在一類兩個對象被正確分類了,w是指不應該被聚在一類的兩個對象被正確分開.M是指不應該放在一起的對象被錯誤的放在一類,D是指不應該分開的對象被錯誤的分開了.
- F指評價法
- 這是基于上述RI方法衍生出的一個方法,F評價公式如下:
- Fa = (I + α2)pr / α2? + r
- 其中, p = R / R + M, r = R / (R + D)
- 實際上RI方法就是吧準確率P和召回率r看的同等重要,事實上,有時候我們可能需要某一特性更多一點,這時候就適合使用F值方法.
- python主要聚類分析算法:
- python的聚類相關的算法主要在Scikit-Learn中, python里面實現(xiàn)的聚類主要包括K-Means聚類,層次聚類, FCM以及神經網絡聚類,
-
對象名
|
函數(shù)功能
|
所屬工具箱
|
KMeans |
K均值聚類 |
sklearn.cluster |
AffinityPropahation |
吸引力傳播聚類,2007年提出,幾乎優(yōu)于所有的其他方法,不需要指定聚類數(shù),單運行效率較低 |
sklearn.cluster |
MeanShift |
均值漂移聚類 |
sklearn.cluster |
SpectralClustring |
譜聚類,具有效果比k均值好,速度比K均值快等特點 |
sklearn.cluster |
AgglomerativeClustering |
層次聚類,給出一棵聚類層次樹 |
sklearn.cluster |
DBSCAN |
具有噪聲的基于密度的聚類方法 |
sklearn.cluster |
BIRCH |
綜合的層次聚類算法,可以處理大規(guī)模數(shù)據(jù)的聚類 |
sklearn.cluster |
-
-
- 這些不同模型的使用方法是大同小異的,都是基本先使用對應的函數(shù)建立模型,然后用.fit()方法來訓練模型,訓練好之后,就可以用.label_方法給出樣本數(shù)據(jù)的標簽,或者用.predict()方法預測新的輸入標簽.
- 此外,Scipy庫也提供了一個聚類子庫scipy.cluster,里邊提供了一些聚類算法,如層次聚類等,但沒有Scikit-Learn那么完善和豐富.scipy.cluster的好處黑絲它的函數(shù)名和功能基本根python時一一對應的,如層次聚類的linkage,dendrogram等,因此已經熟悉python的朋友,可疑嘗試使用Scipy提供的聚類庫.
-
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
"""
使用神經網絡算法預測銷量高低
"""
from sklearn.manifold import TSNE
import pandas as pd
k = 3 # 聚類的類別
iteration = 500 # 聚類最大循環(huán)次數(shù)
data = pd.read_csv("sales_bak.csv", sep="\t",header=None,
names=["a", "b", "c"]) # 讀取csv中的數(shù)據(jù)
data_zs = 1.0 * (data - data.mean()) / data.std() # 數(shù)據(jù)標準化
tsne = TSNE() # 實例化一個TENS空白的對象
tsne.fit_transform(data_zs) # 進行數(shù)據(jù)降維
tsne = pd.DataFrame(tsne.embedding_,index = data_zs.index) # 轉換數(shù)據(jù)格式
import matplotlib.pyplot as plt
plt.rcParams['font,sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
plt.rcParams['zxes.unicode_minus'] = False # 用來正常顯示負號
d = tsne[r[u'聚類類別'] == 0 ]
plt.plot(d[0], d[1], 'r.')
d = tsne[r[u'聚類類別'] == 1 ]
plt.plot(d[0], d[1], 'go')
d = tsne[r[u'聚類類別'] == 2]
plt.plot(d[0], d[1], 'b*')
plt.show()
|