99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀數(shù)據(jù)挖掘?qū)崙?zhàn):PCA算法
數(shù)據(jù)挖掘?qū)崙?zhàn):PCA算法
2016-11-23
收藏

數(shù)據(jù)挖掘實(shí)戰(zhàn):PCA算法

為什么要進(jìn)行數(shù)據(jù)降維?因?yàn)閷?shí)際情況中我們的訓(xùn)練數(shù)據(jù)會存在特征過多或者是特征累贅的問題,比如:

一個(gè)關(guān)于汽車的樣本數(shù)據(jù),一個(gè)特征是”km/h的最大速度特征“,另一個(gè)是”英里每小時(shí)“的最大速度特征,很顯然這兩個(gè)特征具有很強(qiáng)的相關(guān)性

拿到一個(gè)樣本,特征非常多,樣本缺很少,這樣的數(shù)據(jù)用回歸去你和將非常困難,很容易導(dǎo)致過度擬合

PCA算法就是用來解決這種問題的,其核心思想就是將 n 維特征映射到 k 維上(k < n),這="" k="" 維是全新的正交特征。我們將這="" k="" 維成為主元,是重新構(gòu)造出來的="" k="" 維特征,而不是簡單地從="" n="" 維特征中取出其余="" n-k="">

PCA 的計(jì)算過程

假設(shè)我們得到 2 維數(shù)據(jù)如下:

其中行代表樣例,列代表特征,這里有10個(gè)樣例,每個(gè)樣例有2個(gè)特征,我們假設(shè)這兩個(gè)特征是具有較強(qiáng)的相關(guān)性,需要我們對其進(jìn)行降維的。

第一步:分別求 x 和 y 的平均值,然后對所有的樣例都減去對應(yīng)的均值

這里求得 x 的均值為 1.81 , y 的均值為 1.91,減去均值后得到數(shù)據(jù)如下:

注意,此時(shí)我們一般應(yīng)該在對特征進(jìn)行方差歸一化,目的是讓每個(gè)特征的權(quán)重都一樣,但是由于我們的數(shù)據(jù)的值都比較接近,所以歸一化這步可以忽略不做

第一步的算法步驟如下:


第四步:將特征值從大到小進(jìn)行排序,選擇其中最大的 k 個(gè),然后將其對應(yīng)的 k 個(gè)特征向量分別作為列向量組成特征矩陣

這里的特征值只有兩個(gè),我們選擇最大的那個(gè),為: 1.28402771 ,其對應(yīng)的特征向量為:

注意:matlab 的 eig 函數(shù)求解協(xié)方差矩陣的時(shí)候,返回的特征值是一個(gè)特征值分布在對角線的對角矩陣,第 i 個(gè)特征值對應(yīng)于第 i 列的特征向量

第五步: 將樣本點(diǎn)投影到選取的特征向量上

假設(shè)樣本列數(shù)為 m ,特征數(shù)為 n ,減去均值后的樣本矩陣為 DataAdjust(m*n),協(xié)方差矩陣為 n*n ,選取 k 個(gè)特征向量組成后的矩陣為 EigenVectors(n*k),則投影后的數(shù)據(jù) FinalData 為:

FinalData (m*k) = DataAdjust(m*n) X EigenVectors(n*k)

得到的結(jié)果是:

這樣,我們就將 n 維特征降成了 k 維,這 k 維就是原始特征在 k 維上的投影。

整個(gè)PCA的過程貌似很簡單,就是求協(xié)方差的特征值和特征向量,然后做數(shù)據(jù)轉(zhuǎn)換。但為什么協(xié)方差的特征向量就是最理想的 k 維向量?這個(gè)問題由PCA的理論基礎(chǔ)來解釋。

PCA 的理論基礎(chǔ)

關(guān)于為什么協(xié)方差的特征向量就是 k 維理想特征,有3個(gè)理論,分別是:

  1. 最大方差理論

  2. 最小錯(cuò)誤理論

  3. 坐標(biāo)軸相關(guān)度理論

這里簡單描述下最大方差理論:

最大方差理論

信號處理中認(rèn)為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。因此我們認(rèn)為,最好的 k 為特征既是將 n 維樣本點(diǎn)轉(zhuǎn)換為 k 維后,每一維上的樣本方差都很大

PCA 處理圖解如下:

降維轉(zhuǎn)換后:

上圖中的直線就是我們選取的特征向量,上面實(shí)例中PCA的過程就是將空間的2維的點(diǎn)投影到直線上。

那么問題來了,兩幅圖都是PCA的結(jié)果,哪一幅圖比較好呢?

根據(jù)最大方差理論,答案是左邊的圖,其實(shí)也就是樣本投影后間隔較大,容易區(qū)分。

其實(shí)從另一個(gè)角度看,左邊的圖每個(gè)點(diǎn)直線上的距離絕對值之和比右邊的每個(gè)點(diǎn)到直線距離絕對值之和小,是不是有點(diǎn)曲線回歸的感覺?其實(shí)從這個(gè)角度看,這就是最小誤差理論:選擇投影后誤差最小的直線。

再回到上面的左圖,也就是我們要求的最佳的 u ,前面說了,最佳的 u 也就是最佳的曲線,它能夠使投影后的樣本方差最大或者是誤差最小。

另外,由于我們前面PCA算法第一步的時(shí)候已經(jīng)執(zhí)行對樣本數(shù)據(jù)的每一維求均值,并讓每個(gè)數(shù)據(jù)減去均值的預(yù)處理了,所以每個(gè)特征現(xiàn)在的均值都為0,投影到特征向量上后,均值也為0.因此方差為:



最佳投影直線就是特征值 λ 最大是對應(yīng)的特征向量,其次是 λ 第二大對應(yīng)的特征向量(求解的到的特征向量都是正交的)。其中 λ 就是我們的方差,也對應(yīng)了我們前面的最大方差理論,也就是找到能夠使投影后方差最大的直線。

Python實(shí)現(xiàn)

1.代碼實(shí)現(xiàn)

偽代碼如下(摘自機(jī)器學(xué)習(xí)實(shí)戰(zhàn)):


2.代碼下載

下載地址: https://github.com/jimenbian/PCA

loadDataSet函數(shù)是導(dǎo)入數(shù)據(jù)集。

PCA輸入?yún)?shù):參數(shù)一是輸入的數(shù)據(jù)集,參數(shù)二是提取的維度。比如參數(shù)二設(shè)為1,那么就是返回了降到一維的矩陣。

PCA返回參數(shù):參數(shù)一指的是返回的低維矩陣,對應(yīng)于輸入?yún)?shù)二。參數(shù)二對應(yīng)的是移動坐標(biāo)軸后的矩陣。

上一張圖,綠色為原始數(shù)據(jù),紅色是提取的2維特征。

Matlab 實(shí)現(xiàn)


function [lowData,reconMat] = PCA(data,K)[row , col] = size(data);meanValue = mean(data);%varData = var(data,1,1);normData = data - repmat(meanValue,[row,1]);covMat = cov(normData(:,1),normData(:,2));%求取協(xié)方差矩陣[eigVect,eigVal] = eig(covMat);%求取特征值和特征向量[sortMat, sortIX] = sort(eigVal,'descend');[B,IX] = sort(sortMat(1,:),'descend');len = min(K,length(IX));eigVect(:,IX(1:1:len));lowData = normData * eigVect(:,IX(1:1:len));reconMat = (lowData * eigVect(:,IX(1:1:len))') + repmat(meanValue,[row,1]); % 將降維后的數(shù)據(jù)轉(zhuǎn)換到新空間end

調(diào)用方式


function testPCA%%clcclearclose all%%filename = 'testSet.txt';K = 1;data = load(filename);[lowData,reconMat] = PCA(data,K);figurescatter(data(:,1),data(:,2),5,'r')hold onscatter(reconMat(:,1),reconMat(:,2),5)hold offend

效果圖


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }