https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
經(jīng)常用到sklearn中的SVC函數(shù)抡蛙,這里把文檔中的參數(shù)翻譯了一些卿拴,以備不時之需蹈矮。
本身這個函數(shù)也是基于libsvm實現(xiàn)的揪漩,所以在參數(shù)設(shè)置上有很多相似的地方。(PS: libsvm中的二次規(guī)劃問題的解決算法是SMO)乘陪。
sklearn.svm.SVC(C=1.0,?kernel='rbf',?degree=3,?gamma='auto',?coef0=0.0,?shrinking=True,?probability=False,
tol=0.001,?cache_size=200,?class_weight=None,?verbose=False,?max_iter=-1,?decision_function_shape=None,random_state=None)
參數(shù):
l? C:C-SVC的懲罰參數(shù)C?默認(rèn)值是1.0
C越大统台,相當(dāng)于懲罰松弛變量,希望松弛變量接近0啡邑,即對誤分類的懲罰增大饺谬,趨向于對訓(xùn)練集全分對的情況,這樣對訓(xùn)練集測試時準(zhǔn)確率很高谣拣,但泛化能力弱募寨。C值小,對誤分類的懲罰減小森缠,允許容錯拔鹰,將他們當(dāng)成噪聲點,泛化能力較強(qiáng)贵涵。
l??kernel?:核函數(shù)列肢,默認(rèn)是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’?
? 0 – 線性:u'v
? 1 – 多項式:(gamma*u'*v + coef0)^degree
? 2 – RBF函數(shù):exp(-gamma|u-v|^2)
? 3 –sigmoid:tanh(gamma*u'*v + coef0)
l??degree?:多項式poly函數(shù)的維度宾茂,默認(rèn)是3瓷马,選擇其他核函數(shù)時會被忽略。
l??gamma?:?‘rbf’,‘poly’ 和‘sigmoid’的核函數(shù)參數(shù)跨晴。默認(rèn)是’auto’欧聘,則會選擇1/n_features
l??coef0?:核函數(shù)的常數(shù)項。對于‘poly’和 ‘sigmoid’有用端盆。
l??probability?:是否采用概率估計怀骤?.默認(rèn)為False
l??shrinking?:是否采用shrinking heuristic方法,默認(rèn)為true
l??tol?:停止訓(xùn)練的誤差值大小焕妙,默認(rèn)為1e-3
l??cache_size?:核函數(shù)cache緩存大小蒋伦,默認(rèn)為200
l??class_weight?:類別的權(quán)重,字典形式傳遞焚鹊。設(shè)置第幾類的參數(shù)C為weight*C(C-SVC中的C)
l??verbose?:允許冗余輸出痕届?
l??max_iter?:最大迭代次數(shù)。-1為無限制。
l??decision_function_shape?:‘ovo’, ‘ovr’ or None, default=None3
l??random_state?:數(shù)據(jù)洗牌時的種子值研叫,int值
主要調(diào)節(jié)的參數(shù)有:C势决、kernel、degree蓝撇、gamma、coef0陈莽。
numpy.random.rand()
numpy.random.rand(d0,d1,…,dn)
rand函數(shù)根據(jù)給定維度生成[0,1)之間的數(shù)據(jù)渤昌,包含0,不包含1
dn表格每個維度
返回值為指定維度的array
eg:
np.random.randn(2,4)
>>>array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345],
? ? ? ? ? [-1.16724625, -0.22408299,? 0.63006614, -0.41714538]])
In your?clf,
coef_?are the weights assigned to the features; (Note it only works for linear SVM)
support_vectors_?and?support_?are the support vectors and the corresponding index;
dual_coef_?is the coefficients of the support vector in the decision function; and
intercept_?is the bias in decision function.
coef_?:?array, shape = [n_class * (n_class-1) / 2, n_features]
Weights assigned to the features (coefficients in the primal problem). This is only available in the case of a linear kernel.
coef_?is a readonly property derived from?dual_coef_?and?support_vectors_.
intercept_?:?array, shape = [n_class * (n_class-1) / 2]
Constants in decision function.
support_?:?array-like, shape = [n_SV]
Indices of support vectors.
support_vectors_?:?array-like, shape = [n_SV, n_features]
Support vectors.
n_support_?:?array-like, dtype=int32, shape = [n_class]
Number of support vectors for each class.
我的無法畫圖独柑,加上
%matplotlib inline
就可以了
好了,別人的代碼已經(jīng)運(yùn)行好了私植,現(xiàn)在來讀代碼:
(1)數(shù)據(jù)集:
1)數(shù)據(jù)集介紹:
? ? ? LFW數(shù)據(jù)集主要測試人臉識別的準(zhǔn)確率忌栅,該數(shù)據(jù)庫從中隨機(jī)選擇了6000對人臉組成了人臉辨識圖片對,其中3000對屬于同一個人2張人臉照片曲稼,3000對屬于不同的人每人1張人臉照片索绪。測試過程LFW給出一對照片,詢問測試中的系統(tǒng)兩張照片是不是同一個人贫悄,系統(tǒng)給出“是”或“否”的答案瑞驱。通過6000對人臉測試結(jié)果的系統(tǒng)答案與真實答案的比值可以得到人臉識別準(zhǔn)確率。這個集合被廣泛應(yīng)用于評價 face verification算法的性能窄坦。
2)數(shù)據(jù)集獲取方法:
#原始圖像為250 x 250像素唤反,但默認(rèn)切片并調(diào)整大小參數(shù)將它們減少到62 x 74。
def fetch_lfw_people(data_home=None, funneled=True, resize=0.5,
? ? ? ? ? ? ? ? ? ? min_faces_per_person=0, color=False,
? ? ? ? ? ? ? ? ? ? slice_=(slice(70, 195), slice(78, 172)),
? ? ? ? ? ? ? ? ? ? download_if_missing=True)
各參數(shù)意義:
data_home:可選鸭津,默認(rèn)值:無
? ? ? ? ? ? ? ? ? ? ? 為數(shù)據(jù)集指定另一個下載和緩存文件夾彤侍。默認(rèn)情況下
? ? ? ? ? ? ? ? ? ? ? 所有scikit學(xué)習(xí)數(shù)據(jù)都存儲在'?/ scikit_learn_data'子文件夾中
funneled:? ??boolean,optional逆趋,默認(rèn)值:True
? ? ? ? ? ? ? ? ? ? ? 下載并使用數(shù)據(jù)集的漏斗變體盏阶。
resize:? ? ? ? ?float,optional闻书,默認(rèn)值0.5
? ? ? ? ? ? ? ? ? ? ? ?比率用于調(diào)整每張臉部圖片的大小般哼。
min_faces_per_person:int,optional惠窄,默認(rèn)無
? ? ? ? ? ? ? ? ? ? ? 提取的數(shù)據(jù)集將僅保留具有at的人的圖片
? ? ? ? ? ? ? ? ? ? ? 至少`min_faces_per_person`不同的圖片蒸眠。
color:? ? ? ? ??布爾值,可選杆融,默認(rèn)為False
? ? ? ? ? ? ? ? ? ? ? ?保留3個RGB通道楞卡,而不是將它們平均為一個灰度通道。如果顏色為True,則數(shù)據(jù)的形狀? ? ? ? ? ? ? ? ? ? ? ? ?具有比顏色= False的形狀多一個維度蒋腮。
slice_:? ? ? ? ?可選
? ? ? ? ? ? ? ? ? ? ? ?提供自定義2D切片(高度淘捡,寬度)以提取 '有趣'的jpeg文件部分,避免使用統(tǒng)計來自背景? ? ? ? ? ? ? ? ? ? ? ? ?的相關(guān)性
download_if_missing:可選池摧,默認(rèn)為True
? ? ? ? ? ? ? ? ? ? ? 如果為False焦除,則在數(shù)據(jù)不在本地可用時引發(fā)IOError 而不是嘗試從源站點下載數(shù)據(jù)。
返回值的意義:
dataset:具有以下屬性的類似dict的對象:
? ? ? ? ? ? ? ? dataset.data:numpy數(shù)組形狀(13233,2914)
? ? ? ? ? ? ? 每行對應(yīng)于原始尺寸62 x 47的拉面圖像像素作彤。更改``slice_``或調(diào)整大小參數(shù)將改變輸出形狀 dataset.images:numpy數(shù)組形狀(13233,62,47)
? ? ? ? ? ? ? ? ?每行是一個面部圖像膘魄,對應(yīng)于5749人中的一個數(shù)據(jù)集。更改``slice_``或調(diào)整大小參數(shù)將會改? ? ? ? ? ? ? ? ? ? ?變輸出的形狀竭讳。
dataset.target:numpy數(shù)組形狀(13233创葡,)
? ? ? ? ? ? ? ? ? 與每個面部圖像相關(guān)聯(lián)的標(biāo)簽。這些標(biāo)簽的范圍為0-5748并對應(yīng)于人員ID绢慢。
dataset.DESCR:string
? ? ? ? ? ? ? ? ? ? 野外Labeled Faces(LFW)數(shù)據(jù)集的描述灿渴。
3)fetch_lfw_people主要的實現(xiàn)思路
1、獲取人臉數(shù)據(jù)集的文件路徑胰舆,其中check_fetch_lfw函數(shù)完成此功能骚露。check_fetch_lfw函數(shù)會根據(jù)給定的路徑判斷路徑下是否有人臉數(shù)據(jù)集,若有缚窿,返回數(shù)據(jù)集路徑荸百,若沒有,那么他會從網(wǎng)上下載滨攻,然后自動解壓够话,將解壓后的路徑返回,并且將壓縮包刪除光绕。
知識點:os.join女嘲,合并路徑?
用Logger輸出日志?
用raise 輸出異常?
用tarfile解壓文件
2、 獲取人名信息target_names诞帐,人名對應(yīng)的人臉信息faces,target欣尼,首先看一下人臉數(shù)據(jù)集的結(jié)構(gòu)
由上圖可以看出lfw_funneled文件夾下包含以人名來命名的文件夾,每個人名的文件夾下都是他的人臉信息停蕉。這樣的結(jié)構(gòu)化的信息是非常友好的愕鼓。在這兒_fetch_lfw_people函數(shù)負(fù)責(zé)加載人臉數(shù)據(jù)集合人臉對應(yīng)的人名信息。
# searchsorted是尋求插入位置的函數(shù)慧起,在這兒巧妙的將person_names數(shù)字化菇晃,target代表person_names中每各名字在target_names的位置
3.加載圖片_load_imgs
_load_imgs要說的不多,主要是作者在考慮到py兼容問題時候考慮的很細(xì)致
接下來就是根據(jù)slice數(shù)據(jù)對圖片切片蚓挤,然后在resize特征臉可視化
挑選了前11個主要特征臉磺送,可視化效果圖如下:
---------------------
作者:Shane Zhao
來源:CSDN
原文:https://blog.csdn.net/silence2015/article/details/71598631
版權(quán)聲明:本文為博主原創(chuàng)文章驻子,轉(zhuǎn)載請附上博文鏈接!
(2)方法:PCA+SVM實現(xiàn)人臉識別
? ? ? PCA主要是通過奇異值分解將數(shù)據(jù)映射到低緯度的空間(正交去相關(guān))估灿。PCA在數(shù)據(jù)降維崇呵,數(shù)據(jù)壓縮,特征提取有很大貢獻(xiàn)馅袁。在此域慷,我們利用PCA提取150個主要特征,并將人臉數(shù)據(jù)全部映射到150維度汗销,通過這150維人臉特征作為訓(xùn)練數(shù)據(jù)訓(xùn)練基于rbf kernel的SVM犹褒,模型差不多有0.85的準(zhǔn)確率。
1)sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False):
參數(shù)意義:
n_components:??
意義:PCA算法中所要保留的主成分個數(shù)n大溜,也即保留下來的特征個數(shù)n
類型:int 或者 string,缺省時默認(rèn)為None估脆,所有成分被保留钦奋。
? ? ? ? ? 賦值為int,比如n_components=1疙赠,將把原始數(shù)據(jù)降到一個維度付材。
? ? ? ? ? 賦值為string,比如n_components='mle'圃阳,將自動選取特征個數(shù)n厌衔,使得滿足所要求的方差百分比。
copy:
類型:bool捍岳,True或者False富寿,缺省時默認(rèn)為True。
意義:表示是否在運(yùn)行算法時锣夹,將原始訓(xùn)練數(shù)據(jù)復(fù)制一份页徐。若為True,則運(yùn)行PCA算法后银萍,原始訓(xùn)練數(shù)據(jù)的值不會有任何改變变勇,因為是在原始數(shù)據(jù)的副本上進(jìn)行運(yùn)算;若為False贴唇,則運(yùn)行PCA算法后搀绣,原始訓(xùn)練數(shù)據(jù)的值會改,因為是在原始數(shù)據(jù)上進(jìn)行降維計算戳气。
whiten:
類型:bool链患,缺省時默認(rèn)為False
意義:白化,使得每個特征具有相同的方差瓶您。
關(guān)于“白化”:
我們已經(jīng)了解了如何使用PCA降低數(shù)據(jù)維度锣险。在一些算法中還需要一個與之相關(guān)的預(yù)處理步驟蹄皱,這個預(yù)處理過程稱為白化(一些文獻(xiàn)中也叫sphering)。舉例來說芯肤,假設(shè)訓(xùn)練數(shù)據(jù)是圖像巷折,由于圖像中相鄰像素之間具有很強(qiáng)的相關(guān)性,所以用于訓(xùn)練時輸入是冗余的崖咨。白化的目的就是降低輸入的冗余性锻拘;更正式的說,我們希望通過白化過程使得學(xué)習(xí)算法的輸入具有如下性質(zhì):(i)特征之間相關(guān)性較低击蹲;(ii)所有特征具有相同的方差署拟。
2、PCA對象的屬性
components_ :返回具有最大方差的成分歌豺。
explained_variance_ratio_:返回 所保留的n個成分各自的方差百分比推穷。
n_components_:返回所保留的成分個數(shù)n。
mean_:
noise_variance_:
3类咧、PCA對象的方法
fit(X,y=None)
fit()可以說是scikit-learn中通用的方法馒铃,每個需要訓(xùn)練的算法都會有fit()方法,它其實就是算法中的“訓(xùn)練”這一步驟痕惋。因為PCA是無監(jiān)督學(xué)習(xí)算法区宇,此處y自然等于None。
fit(X)值戳,表示用數(shù)據(jù)X來訓(xùn)練PCA模型议谷。
函數(shù)返回值:調(diào)用fit方法的對象本身。比如pca.fit(X)堕虹,表示用X對pca這個對象進(jìn)行訓(xùn)練卧晓。
fit_transform(X)
用X來訓(xùn)練PCA模型,同時返回降維后的數(shù)據(jù)赴捞。
newX=pca.fit_transform(X)禀崖,newX就是降維后的數(shù)據(jù)。
inverse_transform()
將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù)螟炫,X=pca.inverse_transform(newX)
transform(X)
將數(shù)據(jù)X轉(zhuǎn)換成降維后的數(shù)據(jù)波附。當(dāng)模型訓(xùn)練好后,對于新輸入的數(shù)據(jù)昼钻,都可以用transform方法來降維掸屡。
此外,還有get_covariance()然评、get_precision()仅财、get_params(deep=True)、score(X, y=None)等方法碗淌,以后用到再補(bǔ)充吧盏求。
4.GridSearchCV方法自動選擇超參數(shù)
在機(jī)器學(xué)習(xí)模型中抖锥,需要人工選擇的參數(shù)稱為超參數(shù)。比如隨機(jī)森林中決策樹的個數(shù)碎罚,人工神經(jīng)網(wǎng)絡(luò)模型中的隱藏層層數(shù)和每層的節(jié)點個數(shù)磅废,正則項中常數(shù)大小等等,它們都需要事先指定荆烈。超參數(shù)選擇不恰當(dāng)拯勉,就會出現(xiàn)欠擬合或者過擬合的問題。
我們在選擇超參數(shù)有兩個途徑:
1.憑經(jīng)驗
2.選擇不同大小的參數(shù)憔购,帶入到模型中宫峦,挑選表現(xiàn)最好的參數(shù)。
通過途徑2選擇超參數(shù)時玫鸟,可以使用Python中的GridSearchCV方法导绷,自動對輸入的參數(shù)進(jìn)行排列組合,并一一測試屎飘,從中選出最優(yōu)的一組參數(shù)妥曲。
class?sklearn.model_selection.GridSearchCV(estimator,?param_grid,?scoring=None,?fit_params=None,?n_jobs=None,?iid=’warn’,?refit=True,?cv=’warn’,?verbose=0,?pre_dispatch=‘2*n_jobs’,?error_score=’raise-deprecating’,?return_train_score=’warn’)
例如:
clf=GridSearchCV(模型,param_grid,cv=5)
clf.fit(X_train,y_train)
5.classification_report:
sklearn中的classification_report函數(shù)用于顯示主要分類指標(biāo)的文本報告.在報告中顯示每個類的精確度,召回率枚碗,F(xiàn)1值等信息逾一。
主要參數(shù):
y_true:1維數(shù)組铸本,或標(biāo)簽指示器數(shù)組/稀疏矩陣肮雨,目標(biāo)值。
y_pred:1維數(shù)組箱玷,或標(biāo)簽指示器數(shù)組/稀疏矩陣怨规,分類器返回的估計值。
labels:array锡足,shape = [n_labels]波丰,報表中包含的標(biāo)簽索引的可選列表。
target_names:字符串列表舶得,與標(biāo)簽匹配的可選顯示名稱(相同順序)掰烟。
sample_weight:類似于shape = [n_samples]的數(shù)組,可選項沐批,樣本權(quán)重纫骑。
digits:int,輸出浮點值的位數(shù).
(3)測試結(jié)果進(jìn)行顯示:
1.figure語法及操作
(1)figure語法說明
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:圖像編號或名稱九孩,數(shù)字為編號 先馆,字符串為名稱
figsize:指定figure的寬和高,單位為英寸躺彬;
dpi參數(shù)指定繪圖對象的分辨率煤墙,即每英寸多少個像素梅惯,缺省值為80
facecolor:背景顏色
edgecolor:邊框顏色
frameon:是否顯示邊框
2.subplot(nrows,ncols,index,**kwargs)
subplot(pos,**kwargs)
subplot(ax)
一個3位整數(shù)或三個獨(dú)立的整數(shù),用于描述子圖的位置仿野。如果三個整數(shù)按順序為nrows铣减,ncols和index,則子圖將采用nrows行和ncols列的網(wǎng)格上的索引位置设预。 index從左上角的1??開始向右增加徙歼。
pos是一個三位整數(shù),其中第一個數(shù)字是行數(shù)魄梯,第二個是列數(shù),第三個是子圖的索引宾符。即fig.add_subplot(235)與fig.add_subplot(2,3,5)相同呐赡。請注意退客,所有整數(shù)必須小于10才能使此表單生效。
3.rsplit
str.?rsplit([sep[, maxsplit]])
返回字符串中單詞的列表链嘀,由分隔符字符串(從右側(cè)開始)分隔萌狂。
sep
可選的。將字符串分成分組的字符;默認(rèn)是空格怀泊。
maxsplit
可選的茫藏。要做的分裂數(shù)量;默認(rèn)值為-1,它會拆分所有項目霹琼。