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

熱線電話:13121318867

登錄
首頁精彩閱讀從最大似然到EM算法淺解
從最大似然到EM算法淺解
2016-05-05
收藏

從最大似然到EM算法淺解

機器學(xué)習十大算法之一:EM算法。能評得上十大之一,讓人聽起來覺得挺NB的。什么是NB啊,我們一般說某個人很NB,是因為他能解決一些別人解決不了的問題。神為什么是神,因為神能做很多人做不了的事。那么EM算法能解決什么問題呢?或者說EM算法是因為什么而來到這個世界上,還吸引了那么多世人的目光。

我希望自己能通俗地把它理解或者說明白,但是,EM這個問題感覺真的不太好用通俗的語言去說明白,因為它很簡單,又很復(fù)雜。簡單在于它的思想,簡單在于其僅包含了兩個步驟就能完成強大的功能,復(fù)雜在于它的數(shù)學(xué)推理涉及到比較繁雜的概率公式等。如果只講簡單的,就丟失了EM算法的精髓,如果只講數(shù)學(xué)推理,又過于枯燥和生澀,但另一方面,想把兩者結(jié)合起來也不是件容易的事。所以,我也沒法期待我能把它講得怎樣。希望各位不吝指導(dǎo)。


一、最大似然

扯了太多,得入正題了。假設(shè)我們遇到的是下面這樣的問題:

假設(shè)我們需要調(diào)查我們學(xué)校的男生和女生的身高分布。你怎么做???你說那么多人不可能一個一個去問吧,肯定是抽樣了。假設(shè)你在校園里隨便地活捉了100個男生和100個女生。他們共200個人(也就是200個身高的樣本數(shù)據(jù),為了方便表示,下面,我說“人”的意思就是對應(yīng)的身高)都在教室里面了。那下一步怎么辦?。磕汩_始喊:“男的左邊,女的右邊,其他的站中間!”。然后你就先統(tǒng)計抽樣得到的100個男生的身高。假設(shè)他們的身高是服從高斯分布的。但是這個分布的均值u和方差?2我們不知道,這兩個參數(shù)就是我們要估計的。記作θ=[u, ?]T。

用數(shù)學(xué)的語言來說就是:在學(xué)校那么多男生(身高)中,我們獨立地按照概率密度p(x|θ)抽取100了個(身高),組成樣本集X,我們想通過樣本集X來估計出未知參數(shù)θ。這里概率密度p(x|θ)我們知道了是高斯分布N(u,?)的形式,其中的未知參數(shù)是θ=[u, ?]T。抽到的樣本集是X={x1,x2,…,xN},其中xi表示抽到的第i個人的身高,這里N就是100,表示抽到的樣本個數(shù)。

由于每個樣本都是獨立地從p(x|θ)中抽取的,換句話說這100個男生中的任何一個,都是我隨便捉的,從我的角度來看這些男生之間是沒有關(guān)系的。那么,我從學(xué)校那么多男生中為什么就恰好抽到了這100個人呢?抽到這100個人的概率是多少呢?因為這些男生(的身高)是服從同一個高斯分布p(x|θ)的。那么我抽到男生A(的身高)的概率是p(xA|θ),抽到男生B的概率是p(xB|θ),那因為他們是獨立的,所以很明顯,我同時抽到男生A和男生B的概率是p(xA|θ)* p(xB|θ),同理,我同時抽到這100個男生的概率就是他們各自概率的乘積了。用數(shù)學(xué)家的口吻說就是從分布是p(x|θ)的總體樣本中抽取到這100個樣本的概率,也就是樣本集X中各個樣本的聯(lián)合概率,用下式表示:

1359003923_8916

這個概率反映了,在概率密度函數(shù)的參數(shù)是θ時,得到X這組樣本的概率。因為這里X是已知的,也就是說我抽取到的這100個人的身高可以測出來,也就是已知的了。而θ是未知了,則上面這個公式只有θ是未知數(shù),所以它是θ的函數(shù)。這個函數(shù)放映的是在不同的參數(shù)θ取值下,取得當前這個樣本集的可能性,因此稱為參數(shù)θ相對于樣本集X的似然函數(shù)(likehood function)。記為L(θ)。

這里出現(xiàn)了一個概念,似然函數(shù)。還記得我們的目標嗎?我們需要在已經(jīng)抽到這一組樣本X的條件下,估計參數(shù)θ的值。怎么估計呢?似然函數(shù)有啥用呢?那咱們先來了解下似然的概念。

直接舉個例子:

某位同學(xué)與一位獵人一起外出打獵,一只野兔從前方竄過。只聽一聲槍響,野兔應(yīng)聲到下,如果要你推測,這一發(fā)命中的子彈是誰打的?你就會想,只發(fā)一槍便打中,由于獵人命中的概率一般大于這位同學(xué)命中的概率,看來這一槍是獵人射中的。

這個例子所作的推斷就體現(xiàn)了極大似然法的基本思想。

再例如:下課了,一群男女同學(xué)分別去廁所了。然后,你閑著無聊,想知道課間是男生上廁所的人多還是女生上廁所的人比較多,然后你就跑去蹲在男廁和女廁的門口。蹲了五分鐘,突然一個美女走出來,你狂喜,跑過來告訴我,課間女生上廁所的人比較多,你要不相信你可以進去數(shù)數(shù)。呵呵,我才沒那么蠢跑進去數(shù)呢,到時還不得上頭條。我問你是怎么知道的。你說:“5分鐘了,出來的是女生,女生啊,那么女生出來的概率肯定是最大的了,或者說比男生要大,那么女廁所的人肯定比男廁所的人多”??吹搅藳],你已經(jīng)運用最大似然估計了。你通過觀察到女生先出來,那么什么情況下,女生會先出來呢?肯定是女生出來的概率最大的時候了,那什么時候女生出來的概率最大啊,那肯定是女廁所比男廁所多人的時候了,這個就是你估計到的參數(shù)了。

從上面這兩個例子,你得到了什么結(jié)論?

回到男生身高那個例子。在學(xué)校那么男生中,我一抽就抽到這100個男生(表示身高),而不是其他人,那是不是表示在整個學(xué)校中,這100個人(的身高)出現(xiàn)的概率最大啊。那么這個概率怎么表示?哦,就是上面那個似然函數(shù)L(θ)。所以,我們就只需要找到一個參數(shù)θ,其對應(yīng)的似然函數(shù)L(θ)最大,也就是說抽到這100個男生(的身高)概率最大。這個叫做θ的最大似然估計量,記為:

1359003973_1560

有時,可以看到L(θ)是連乘的,所以為了便于分析,還可以定義對數(shù)似然函數(shù),將其變成連加的:

1359003994_1029

好了,現(xiàn)在我們知道了,要求θ,只需要使θ的似然函數(shù)L(θ)極大化,然后極大值對應(yīng)的θ就是我們的估計。這里就回到了求最值的問題了。怎么求一個函數(shù)的最值?當然是求導(dǎo),然后讓導(dǎo)數(shù)為0,那么解這個方程得到的θ就是了(當然,前提是函數(shù)L(θ)連續(xù)可微)。那如果θ是包含多個參數(shù)的向量那怎么處理啊?當然是求L(θ)對所有參數(shù)的偏導(dǎo)數(shù),也就是梯度了,那么n個未知的參數(shù),就有n個方程,方程組的解就是似然函數(shù)的極值點了,當然就得到這n個參數(shù)了。

最大似然估計你可以把它看作是一個反推。多數(shù)情況下我們是根據(jù)已知條件來推算結(jié)果,而最大似然估計是已經(jīng)知道了結(jié)果,然后尋求使該結(jié)果出現(xiàn)的可能性最大的條件,以此作為估計值。比如,如果其他條件一定的話,抽煙者發(fā)生肺癌的危險時不抽煙者的5倍,那么如果現(xiàn)在我已經(jīng)知道有個人是肺癌,我想問你這個人抽煙還是不抽煙。你怎么判斷?你可能對這個人一無所知,你所知道的只有一件事,那就是抽煙更容易發(fā)生肺癌,那么你會猜測這個人不抽煙嗎?我相信你更有可能會說,這個人抽煙。為什么?這就是“最大可能”,我只能說他“最有可能”是抽煙的,“他是抽煙的”這一估計值才是“最有可能”得到“肺癌”這樣的結(jié)果。這就是最大似然估計。

好了,極大似然估計就講到這,總結(jié)一下:

極大似然估計,只是一種概率論在統(tǒng)計學(xué)的應(yīng)用,它是參數(shù)估計的方法之一。說的是已知某個隨機樣本滿足某種概率分布,但是其中具體的參數(shù)不清楚,參數(shù)估計就是通過若干次試驗,觀察其結(jié)果,利用結(jié)果推出參數(shù)的大概值。最大似然估計是建立在這樣的思想上:已知某個參數(shù)能使這個樣本出現(xiàn)的概率最大,我們當然不會再去選擇其他小概率的樣本,所以干脆就把這個參數(shù)作為估計的真實值。

求最大似然函數(shù)估計值的一般步驟:

(1)寫出似然函數(shù);

(2)對似然函數(shù)取對數(shù),并整理;

(3)求導(dǎo)數(shù),令導(dǎo)數(shù)為0,得到似然方程;

(4)解似然方程,得到的參數(shù)即為所求;


二、EM算法

好了,重新回到上面那個身高分布估計的問題?,F(xiàn)在,通過抽取得到的那100個男生的身高和已知的其身高服從高斯分布,我們通過最大化其似然函數(shù),就可以得到了對應(yīng)高斯分布的參數(shù)θ=[u, ?]T了。那么,對于我們學(xué)校的女生的身高分布也可以用同樣的方法得到了。

再回到例子本身,如果沒有“男的左邊,女的右邊,其他的站中間!”這個步驟,或者說我抽到這200個人中,某些男生和某些女生一見鐘情,已經(jīng)好上了,糾纏起來了。咱們也不想那么殘忍,硬把他們拉扯開。那現(xiàn)在這200個人已經(jīng)混到一起了,這時候,你從這200個人(的身高)里面隨便給我指一個人(的身高),我都無法確定這個人(的身高)是男生(的身高)還是女生(的身高)。也就是說你不知道抽取的那200個人里面的每一個人到底是從男生的那個身高分布里面抽取的,還是女生的那個身高分布抽取的。用數(shù)學(xué)的語言就是,抽取得到的每個樣本都不知道是從哪個分布抽取的。

這個時候,對于每一個樣本或者你抽取到的人,就有兩個東西需要猜測或者估計的了,一是這個人是男的還是女的?二是男生和女生對應(yīng)的身高的高斯分布的參數(shù)是多少?

只有當我們知道了哪些人屬于同一個高斯分布的時候,我們才能夠?qū)@個分布的參數(shù)作出靠譜的預(yù)測,例如剛開始的最大似然所說的,但現(xiàn)在兩種高斯分布的人混在一塊了,我們又不知道哪些人屬于第一個高斯分布,哪些屬于第二個,所以就沒法估計這兩個分布的參數(shù)。反過來,只有當我們對這兩個分布的參數(shù)作出了準確的估計的時候,才能知道到底哪些人屬于第一個分布,那些人屬于第二個分布。

這就成了一個先有雞還是先有蛋的問題了。雞說,沒有我,誰把你生出來的啊。蛋不服,說,沒有我,你從哪蹦出來啊。(呵呵,這是一個哲學(xué)問題。當然了,后來科學(xué)家說先有蛋,因為雞蛋是鳥蛋進化的)。為了解決這個你依賴我,我依賴你的循環(huán)依賴問題,總得有一方要先打破僵局,說,不管了,我先隨便整一個值出來,看你怎么變,然后我再根據(jù)你的變化調(diào)整我的變化,然后如此迭代著不斷互相推導(dǎo),最終就會收斂到一個解。這就是EM算法的基本思想了。

不知道大家能否理解其中的思想,我再來啰嗦一下。其實這個思想無處在不啊。

例如,小時候,老媽給一大袋糖果給你,叫你和你姐姐等分,然后你懶得去點糖果的個數(shù),所以你也就不知道每個人到底該分多少個。咱們一般怎么做呢?先把一袋糖果目測的分為兩袋,然后把兩袋糖果拿在左右手,看哪個重,如果右手重,那很明顯右手這代糖果多了,然后你再在右手這袋糖果中抓一把放到左手這袋,然后再感受下哪個重,然后再從重的那袋抓一小把放進輕的那一袋,繼續(xù)下去,直到你感覺兩袋糖果差不多相等了為止。呵呵,然后為了體現(xiàn)公平,你還讓你姐姐先選了。

EM算法就是這樣,假設(shè)我們想估計知道A和B兩個參數(shù),在開始狀態(tài)下二者都是未知的,但如果知道了A的信息就可以得到B的信息,反過來知道了B也就得到了A??梢钥紤]首先賦予A某種初值,以此得到B的估計值,然后從B的當前值出發(fā),重新估計A的取值,這個過程一直持續(xù)到收斂為止。

EM的意思是“Expectation Maximization”,在我們上面這個問題里面,我們是先隨便猜一下男生(身高)的正態(tài)分布的參數(shù):如均值和方差是多少。例如男生的均值是1米7,方差是0.1米(當然了,剛開始肯定沒那么準),然后計算出每個人更可能屬于第一個還是第二個正態(tài)分布中的(例如,這個人的身高是1米8,那很明顯,他最大可能屬于男生的那個分布),這個是屬于Expectation一步。有了每個人的歸屬,或者說我們已經(jīng)大概地按上面的方法將這200個人分為男生和女生兩部分,我們就可以根據(jù)之前說的最大似然那樣,通過這些被大概分為男生的n個人來重新估計第一個分布的參數(shù),女生的那個分布同樣方法重新估計。這個是Maximization。然后,當我們更新了這兩個分布的時候,每一個屬于這兩個分布的概率又變了,那么我們就再需要調(diào)整E步……如此往復(fù),直到參數(shù)基本不再發(fā)生變化為止。

這里把每個人(樣本)的完整描述看做是三元組yi={xi,zi1,zi2},其中,xi是第i個樣本的觀測值,也就是對應(yīng)的這個人的身高,是可以觀測到的值。zi1和zi2表示男生和女生這兩個高斯分布中哪個被用來產(chǎn)生值xi,就是說這兩個值標記這個人到底是男生還是女生(的身高分布產(chǎn)生的)。這兩個值我們是不知道的,是隱含變量。確切的說,zij在xi由第j個高斯分布產(chǎn)生時值為1,否則為0。例如一個樣本的觀測值為1.8,然后他來自男生的那個高斯分布,那么我們可以將這個樣本表示為{1.8, 1, 0}。如果zi1和zi2的值已知,也就是說每個人我已經(jīng)標記為男生或者女生了,那么我們就可以利用上面說的最大似然算法來估計他們各自高斯分布的參數(shù)。但是它們未知,因此我們只能用EM算法。

咱們現(xiàn)在不是因為那個惡心的隱含變量(抽取得到的每個樣本都不知道是從哪個分布抽取的)使得本來簡單的可以求解的問題變復(fù)雜了,求解不了嗎。那怎么辦呢?人類解決問題的思路都是想能否把復(fù)雜的問題簡單化。好,那么現(xiàn)在把這個復(fù)雜的問題逆回來,我假設(shè)已經(jīng)知道這個隱含變量了,哎,那么求解那個分布的參數(shù)是不是很容易了,直接按上面說的最大似然估計就好了。那你就問我了,這個隱含變量是未知的,你怎么就來一個假設(shè)說已知呢?你這種假設(shè)是沒有根據(jù)的。呵呵,我知道,所以我們可以先給這個給分布弄一個初始值,然后求這個隱含變量的期望,當成是這個隱含變量的已知值,那么現(xiàn)在就可以用最大似然求解那個分布的參數(shù)了吧,那假設(shè)這個參數(shù)比之前的那個隨機的參數(shù)要好,它更能表達真實的分布,那么我們再通過這個參數(shù)確定的分布去求這個隱含變量的期望,然后再最大化,得到另一個更優(yōu)的參數(shù),……迭代,就能得到一個皆大歡喜的結(jié)果了。

這時候你就不服了,說你老迭代迭代的,你咋知道新的參數(shù)的估計就比原來的好???為什么這種方法行得通呢?有沒有失效的時候呢?什么時候失效呢?用到這個方法需要注意什么問題呢?呵呵,一下子拋出那么多問題,搞得我適應(yīng)不過來了,不過這證明了你有很好的搞研究的潛質(zhì)啊。呵呵,其實這些問題就是數(shù)學(xué)家需要解決的問題。在數(shù)學(xué)上是可以穩(wěn)當?shù)淖C明的或者得出結(jié)論的。那咱們用數(shù)學(xué)來把上面的問題重新描述下。(在這里可以知道,不管多么復(fù)雜或者簡單的物理世界的思想,都需要通過數(shù)學(xué)工具進行建模抽象才得以使用并發(fā)揮其強大的作用,而且,這里面蘊含的數(shù)學(xué)往往能帶給你更多想象不到的東西,這就是數(shù)學(xué)的精妙所在?。?/span>


三、EM算法推導(dǎo)

假設(shè)我們有一個樣本集{x(1),…,x(m)},包含m個獨立的樣本。但每個樣本i對應(yīng)的類別z(i)是未知的(相當于聚類),也即隱含變量。故我們需要估計概率模型p(x,z)的參數(shù)θ,但是由于里面包含隱含變量z,所以很難用最大似然求解,但如果z知道了,那我們就很容易求解了。

對于參數(shù)估計,我們本質(zhì)上還是想獲得一個使似然函數(shù)最大化的那個參數(shù)θ,現(xiàn)在與最大似然不同的只是似然函數(shù)式中多了一個未知的變量z,見下式(1)。也就是說我們的目標是找到適合的θ和z讓L(θ)最大。那我們也許會想,你就是多了一個未知的變量而已啊,我也可以分別對未知的θ和z分別求偏導(dǎo),再令其等于0,求解出來不也一樣嗎?

1359004165_6698

本質(zhì)上我們是需要最大化(1)式(對(1)式,我們回憶下聯(lián)合概率密度下某個變量的邊緣概率密度函數(shù)的求解,注意這里z也是隨機變量。對每一個樣本i的所有可能類別z求等式右邊的聯(lián)合概率密度函數(shù)和,也就得到等式左邊為隨機變量x的邊緣概率密度),也就是似然函數(shù),但是可以看到里面有“和的對數(shù)”,求導(dǎo)后形式會非常復(fù)雜(自己可以想象下log(f1(x)+ f2(x)+ f3(x)+…)復(fù)合函數(shù)的求導(dǎo)),所以很難求解得到未知參數(shù)z和θ。那OK,我們可否對(1)式做一些改變呢?我們看(2)式,(2)式只是分子分母同乘以一個相等的函數(shù),還是有“和的對數(shù)”啊,還是求解不了,那為什么要這么做呢?咱們先不管,看(3)式,發(fā)現(xiàn)(3)式變成了“對數(shù)的和”,那這樣求導(dǎo)就容易了。我們注意點,還發(fā)現(xiàn)等號變成了不等號,為什么能這么變呢?這就是Jensen不等式的大顯神威的地方。

Jensen不等式:

設(shè)f是定義域為實數(shù)的函數(shù),如果對于所有的實數(shù)x。如果對于所有的實數(shù)x,f(x)的二次導(dǎo)數(shù)大于等于0,那么f是凸函數(shù)。當x是向量時,如果其hessian矩陣H是半正定的,那么f是凸函數(shù)。如果只大于0,不等于0,那么稱f是嚴格凸函數(shù)。

Jensen不等式表述如下:

如果f是凸函數(shù),X是隨機變量,那么:E[f(X)]>=f(E[X])

特別地,如果f是嚴格凸函數(shù),當且僅當X是常量時,上式取等號。

如果用圖表示會很清晰:

1359004230_7889

圖中,實線f是凸函數(shù),X是隨機變量,有0.5的概率是a,有0.5的概率是b。(就像擲硬幣一樣)。X的期望值就是a和b的中值了,圖中可以看到E[f(X)]>=f(E[X])成立。

當f是(嚴格)凹函數(shù)當且僅當-f是(嚴格)凸函數(shù)。

Jensen不等式應(yīng)用于凹函數(shù)時,不等號方向反向。


回到公式(2),因為f(x)=log x為凹函數(shù)(其二次導(dǎo)數(shù)為-1/x2<0)。

(2)式中1359004420_6093的期望,(考慮到E(X)=∑x*p(x),f(X)是X的函數(shù),則E(f(X))=∑f(x)*p(x)),又1359004435_1667,所以就可以得到公式(3)的不等式了(若不明白,請拿起筆,呵呵):

1359004457_8988

OK,到這里,現(xiàn)在式(3)就容易地求導(dǎo)了,但是式(2)和式(3)是不等號啊,式(2)的最大值不是式(3)的最大值啊,而我們想得到式(2)的最大值,那怎么辦呢?

現(xiàn)在我們就需要一點想象力了,上面的式(2)和式(3)不等式可以寫成:似然函數(shù)L(θ)>=J(z,Q),那么我們可以通過不斷的最大化這個下界J,來使得L(θ)不斷提高,最終達到它的最大值。

1359004484_7944

見上圖,我們固定θ,調(diào)整Q(z)使下界J(z,Q)上升至與L(θ)在此點θ處相等(綠色曲線到藍色曲線),然后固定Q(z),調(diào)整θ使下界J(z,Q)達到最大值(θt到θt+1),然后再固定θ,調(diào)整Q(z)……直到收斂到似然函數(shù)L(θ)的最大值處的θ*。這里有兩個問題:什么時候下界J(z,Q)與L(θ)在此點θ處相等?為什么一定會收斂?

首先第一個問題,在Jensen不等式中說到,當自變量X是常數(shù)的時候,等式成立。而在這里,即:

1359004517_4140

再推導(dǎo)下,由于1359004538_8410(因為Q是隨機變量z(i)的概率密度函數(shù)),則可以得到:分子的和等于c(分子分母都對所有z(i)求和:多個等式分子分母相加不變,這個認為每個樣例的兩個概率比值都是c),則:

1359004651_3922

至此,我們推出了在固定參數(shù)θ后,使下界拉升的Q(z)的計算公式就是后驗概率,解決了Q(z)如何選擇的問題。這一步就是E步,建立L(θ)的下界。接下來的M步,就是在給定Q(z)后,調(diào)整θ,去極大化L(θ)的下界J(在固定Q(z)后,下界還可以調(diào)整的更大)。那么一般的EM算法的步驟如下:

EM算法(Expectation-maximization):

期望最大算法是一種從不完全數(shù)據(jù)或有數(shù)據(jù)丟失的數(shù)據(jù)集(存在隱含變量)中求解概率模型參數(shù)的最大似然估計方法。

EM的算法流程:

初始化分布參數(shù)θ;

重復(fù)以下步驟直到收斂:

E步驟:根據(jù)參數(shù)初始值或上一次迭代的模型參數(shù)來計算出隱性變量的后驗概率,其實就是隱性變量的期望。作為隱藏變量的現(xiàn)估計值:

1359004674_9261

M步驟:將似然函數(shù)最大化以獲得新的參數(shù)值:

1359004692_8552

這個不斷的迭代,就可以得到使似然函數(shù)L(θ)最大化的參數(shù)θ了。那就得回答剛才的第二個問題了,它會收斂嗎?

感性的說,因為下界不斷提高,所以極大似然估計單調(diào)增加,那么最終我們會到達最大似然估計的最大值。理性分析的話,就會得到下面的東西:

1359004726_5955

四、EM算法另一種理解

坐標上升法(Coordinate ascent):

1359004760_8452

圖中的直線式迭代優(yōu)化的路徑,可以看到每一步都會向最優(yōu)值前進一步,而且前進路線是平行于坐標軸的,因為每一步只優(yōu)化一個變量。

這猶如在x-y坐標系中找一個曲線的極值,然而曲線函數(shù)不能直接求導(dǎo),因此什么梯度下降方法就不適用了。但固定一個變量后,另外一個可以通過求導(dǎo)得到,因此可以使用坐標上升法,一次固定一個變量,對另外的求極值,最后逐步逼近極值。對應(yīng)到EM上,E步:固定θ,優(yōu)化Q;M步:固定Q,優(yōu)化θ;交替將極值推向最大。


五、EM的應(yīng)用

EM算法有很多的應(yīng)用,最廣泛的就是GMM混合高斯模型、聚類、HMM等等。具體可以參考JerryLead的cnblog中的Machine Learning專欄:

(EM算法)The EM Algorithm

混合高斯模型(Mixtures of Gaussians)和EM算法

K-means聚類算法


沒有雞和蛋的先后之爭,因為他們都知道“沒有你就沒有我”。從此他們一起過上了幸福美好的生活。


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