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

熱線電話:13121318867

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

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

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

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

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

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

PCA 的計算過程

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

其中行代表樣例,列代表特征,這里有10個樣例,每個樣例有2個特征,我們假設這兩個特征是具有較強的相關性,需要我們對其進行降維的。

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

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

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

第一步的算法步驟如下:


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

這里的特征值只有兩個,我們選擇最大的那個,為: 1.28402771 ,其對應的特征向量為:

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

第五步: 將樣本點投影到選取的特征向量上

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

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

得到的結果是:

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

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

PCA 的理論基礎

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

  1. 最大方差理論

  2. 最小錯誤理論

  3. 坐標軸相關度理論

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

最大方差理論

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

PCA 處理圖解如下:

降維轉換后:

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

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

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

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

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

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



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

Python實現(xiàn)

1.代碼實現(xiàn)

偽代碼如下(摘自機器學習實戰(zhàn)):


2.代碼下載

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

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

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

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

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

Matlab 實現(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ù)轉換到新空間end

調用方式


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ù)分析師考試動態(tài)
數(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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 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){ //倒計時完成 $(".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); }