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

熱線電話:13121318867

登錄
首頁精彩閱讀機(jī)器學(xué)習(xí)-Cross Validation交叉驗(yàn)證Python實(shí)現(xiàn)
機(jī)器學(xué)習(xí)-Cross Validation交叉驗(yàn)證Python實(shí)現(xiàn)
2017-03-16
收藏

機(jī)器學(xué)習(xí)-Cross Validation交叉驗(yàn)證Python實(shí)現(xiàn)

1.原理
1.1 概念
交叉驗(yàn)證(cross-validation)主要用于模型訓(xùn)練或建模應(yīng)用中,如分類預(yù)測(cè)、pcr、pls回歸建模等。在給定的樣本空間中,拿出大部分樣本作為訓(xùn)練集來訓(xùn)練模型,剩余的小部分樣本使用剛建立的模型進(jìn)行預(yù)測(cè),并求這小部分樣本的預(yù)測(cè)誤差或者預(yù)測(cè)精度,同時(shí)記錄它們的加和平均值。這個(gè)過程迭代k次,即k折交叉。其中,把每個(gè)樣本的預(yù)測(cè)誤差平方加和,稱為press(predicted error sum of squares)。
1.2 目的
用交叉驗(yàn)證的目的是為了得到可靠穩(wěn)定的模型。在分類,建立pc 或pls模型時(shí),一個(gè)很重要的因素是取多少個(gè)主成分的問題。用cross validation校驗(yàn)每個(gè)主成分下的press值,選擇press值小的主成分?jǐn)?shù)。或press值不再變小時(shí)的主成分?jǐn)?shù)。
常用的精度測(cè)試方法主要是交叉驗(yàn)證,例如10折交叉驗(yàn)證(10-fold cross validation),將數(shù)據(jù)集分成十份,輪流將其中9份做訓(xùn)練1份做驗(yàn)證,10次的結(jié)果的均值作為對(duì)算法精度的估計(jì),一般還需要進(jìn)行多次10折交叉驗(yàn)證求均值,例如:10次10折交叉驗(yàn)證,以求更精確一點(diǎn)。
交叉驗(yàn)證有時(shí)也稱為交叉比對(duì),如:10折交叉比對(duì)
1.3 常見的交叉驗(yàn)證形式:
holdout 驗(yàn)證
方法: 將原始數(shù)據(jù)隨機(jī)分為兩組,一組做為訓(xùn)練集,一組做為驗(yàn)證集,利用訓(xùn)練集訓(xùn)練分類器,然后利用驗(yàn)證集驗(yàn)證模型,記錄最后的分類準(zhǔn)確率為此hold-outmethod下分類器的性能指標(biāo).。hold-outmethod相對(duì)于k-fold cross validation 又稱double cross-validation ,或相對(duì)k-cv稱 2-fold cross-validation(2-cv)
一般來說,holdout 驗(yàn)證并非一種交叉驗(yàn)證,因?yàn)閿?shù)據(jù)并沒有交叉使用。 隨機(jī)從最初的樣本中選出部分,形成交叉驗(yàn)證數(shù)據(jù),而剩余的就當(dāng)做訓(xùn)練數(shù)據(jù)。 一般來說,少于原本樣本三分之一的數(shù)據(jù)被選做驗(yàn)證數(shù)據(jù)。
優(yōu)點(diǎn): 好處的處理簡單,只需隨機(jī)把原始數(shù)據(jù)分為兩組即可
缺點(diǎn): 嚴(yán)格意義來說hold-out method并不能算是cv,因?yàn)檫@種方法沒有達(dá)到交叉的思想,由于是隨機(jī)的將原始數(shù)據(jù)分組,所以最后驗(yàn)證集分類準(zhǔn)確率的高低與原始數(shù)據(jù)的分組有很大的關(guān)系,所以這種方法得到的結(jié)果其實(shí)并不具有說服性.(主要原因是 訓(xùn)練集樣本數(shù)太少,通常不足以代表母體樣本的分布,導(dǎo)致 test 階段辨識(shí)率容易出現(xiàn)明顯落差。此外,2-cv 中一分為二的分子集方法的變異度大,往往無法達(dá)到「實(shí)驗(yàn)過程必須可以被復(fù)制」的要求。)
k-fold cross-validation
k折交叉驗(yàn)證,初始采樣分割成k個(gè)子樣本,一個(gè)單獨(dú)的子樣本被保留作為驗(yàn)證模型的數(shù)據(jù),其他k-1個(gè)樣本用來訓(xùn)練。交叉驗(yàn)證重復(fù)k次,每個(gè)子樣本驗(yàn)證一次,平均k次的結(jié)果或者使用其它結(jié)合方式,最終得到一個(gè)單一估測(cè)。這個(gè)方法的優(yōu)勢(shì)在于,同時(shí)重復(fù)運(yùn)用隨機(jī)產(chǎn)生的子樣本進(jìn)行訓(xùn)練和驗(yàn)證,每次的結(jié)果驗(yàn)證一次,10折交叉驗(yàn)證是最常用的。
優(yōu)點(diǎn): k-cv可以有效的避免過學(xué)習(xí)以及欠學(xué)習(xí)狀態(tài)的發(fā)生,最后得到的結(jié)果也比較具有說服性.
缺點(diǎn): k值選取上
留一驗(yàn)證
正如名稱所建議, 留一驗(yàn)證(loocv)意指只使用原本樣本中的一項(xiàng)來當(dāng)做驗(yàn)證資料, 而剩余的則留下來當(dāng)做訓(xùn)練資料。 這個(gè)步驟一直持續(xù)到每個(gè)樣本都被當(dāng)做一次驗(yàn)證資料。 事實(shí)上,這等同于 k-fold 交叉驗(yàn)證是一樣的,其中k為原本樣本個(gè)數(shù)。 在某些情況下是存在有效率的演算法,如使用kernel regression 和tikhonov regularization。
2.深入
使用交叉驗(yàn)證方法的目的主要有3個(gè):
(1)從有限的學(xué)習(xí)數(shù)據(jù)中獲取盡可能多的有效信息;
(2)交叉驗(yàn)證從多個(gè)方向開始學(xué)習(xí)樣本的,可以有效的避免陷入局部最小值;
(3)可以在一定程度上避免過擬合問題。
采用交叉驗(yàn)證方法時(shí)需要將學(xué)習(xí)數(shù)據(jù)樣本分為兩部分:訓(xùn)練數(shù)據(jù)樣本和驗(yàn)證數(shù)據(jù)樣本。并且為了得到更好的學(xué)習(xí)效果,無論訓(xùn)練樣本還是驗(yàn)證樣本都要盡可能參與學(xué)習(xí)。一般選取10重交叉驗(yàn)證即可達(dá)到好的學(xué)習(xí)效果。下面在上述原則基礎(chǔ)上設(shè)計(jì)算法,主要描述下算法步驟,如下所示。
algorithm
step1: 將學(xué)習(xí)樣本空間 c 分為大小相等的 k 份   
step2: for i = 1 to k :
取第i份作為測(cè)試集
for j = 1 to k:
if i != j:
將第j份加到訓(xùn)練集中,作為訓(xùn)練集的一部分
end if
end for
end for
step3: for i in (k-1訓(xùn)練集):
訓(xùn)練第i個(gè)訓(xùn)練集,得到一個(gè)分類模型
使用該模型在第n個(gè)數(shù)據(jù)集上測(cè)試,計(jì)算并保存模型評(píng)估指標(biāo)
end for
step4: 計(jì)算模型的平均性能
step5: 用這k個(gè)模型在最終驗(yàn)證集的分類準(zhǔn)確率平均值作為此k-cv下分類器的性能指標(biāo).
3.實(shí)現(xiàn)
3.1 scikit-learn交叉驗(yàn)證
在scikit-learn中有crossvalidation的實(shí)現(xiàn)代碼,地址: scikit-learn官網(wǎng)crossvalidation文檔
使用方法:
首先加載數(shù)據(jù)集
>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
通過上面代碼,數(shù)據(jù)集特征和類標(biāo)簽分別為iris.data, iris.target,接著進(jìn)行交叉驗(yàn)證
>>> x_train, x_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)
>>> x_train.shape, y_train.shape
((90, 4), (90,))
>>> x_test.shape, y_test.shape
((60, 4), (60,))
>>> clf = svm.svc(kernel='linear', c=1).fit(x_train, y_train)
>>> clf.score(x_test, y_test)                           
0.96...
上面的clf是分類器,可以自己替換,比如我可以使用randomforest

clf = randomforestclassifier(n_estimators=400)
一個(gè)比較有用的函數(shù)是train_test_split。功能是從樣本中隨機(jī)的按比例選取train data和test data。形式為
x_train, x_test, y_train, y_test = cross_validation.train_test_split(train_data,train_target, test_size=0.4, random_state=0)
test_size是樣本占比。如果是整數(shù)的話就是樣本的數(shù)量。random_state是隨機(jī)數(shù)的種子。
當(dāng)然,也可以換成別的,具體算法可以參考 scikit-learn官方文檔
3.2 抽樣與cv結(jié)合
由于我跑的實(shí)驗(yàn),數(shù)據(jù)是非均衡數(shù)據(jù),不能直接套用,所以這里自己寫了一個(gè)交叉驗(yàn)證的代碼,僅供參考,如有問題,歡迎交流。
首先有一個(gè)自適應(yīng)的數(shù)據(jù)加載函數(shù),主要用于加載本地文本數(shù)據(jù),同時(shí)文本每行數(shù)據(jù)以”\t”隔開,最后一列為類標(biāo)號(hào),數(shù)據(jù)樣例如下:
a1001 708 k -4 -3 6 2 -13 0 2 -4 -4 -10 -9 1
a1002 709 l -4 -4 -1 -2 -11 -1 0 -12 -7 -5 -1 -1
a1003 710 g 0 -6 -2 -6 -8 -4 -6 -6 -9 -4 0 -1
a1004 711 r 0 0 1 -3 -10 -1 -3 -4 -6 -9 -6 1
說明: 前面三個(gè)不是特征,所以在加載數(shù)據(jù)集的時(shí)候,特征部分起始位置修改了下,loaddataset函數(shù)如下:
def loaddataset(filename):
fr = open(filename)
datamat = []; labelmat = []
for eachline in fr:
linearr = []
curline = eachline.strip().split('\t') #remove '\n'
for i in range(3, len(curline)-1):
linearr.append(float(curline[i])) #get all feature from inpurfile
datamat.append(linearr)
labelmat.append(int(curline[-1])) #last one is class lable
fr.close()
return datamat,labelmat
返回的datamat為純特征矩陣,labelmat為類別標(biāo)號(hào)。
下面的splitdataset用來切分?jǐn)?shù)據(jù)集,如果是十折交叉,則split_size取10,filename為整個(gè)數(shù)據(jù)集文件,outdir則是切分的數(shù)據(jù)集的存放路徑。
def splitdataset(filename, split_size,outdir):
if not os.path.exists(outdir): #if not outdir,makrdir
os.makedirs(outdir)
fr = open(filename,'r')#open filename to read
num_line = 0
onefile = fr.readlines()
num_line = len(onefile)         
arr = np.arange(num_line) #get a seq and set len=numline
np.random.shuffle(arr) #generate a random seq from arr
list_all = arr.tolist()
each_size = (num_line+1) / split_size #size of each split sets
split_all = []; each_split = []
count_num = 0; count_split = 0  #count_num 統(tǒng)計(jì)每次遍歷的當(dāng)前個(gè)數(shù)
#count_split 統(tǒng)計(jì)切分次數(shù)
for i in range(len(list_all)): #遍歷整個(gè)數(shù)字序列
each_split.append(onefile[int(list_all[i])].strip())
count_num += 1
if count_num == each_size:
count_split += 1
array_ = np.array(each_split)
np.savetxt(outdir + "/split_" + str(count_split) + '.txt',\
array_,fmt="%s", delimiter='\t')  #輸出每一份數(shù)據(jù)
split_all.append(each_split) #將每一份數(shù)據(jù)加入到一個(gè)list中
each_split = []
count_num = 0
return split_all
undersample(datafile)方法為抽樣函數(shù),強(qiáng)正負(fù)樣本比例固定為1:1,返回的是一個(gè)正負(fù)樣本比例均等的數(shù)據(jù)集合。
def undersample(datafile): #只針對(duì)一個(gè)數(shù)據(jù)集的下采樣
datamat,labelmat = loaddataset(datafile) #加載數(shù)據(jù)
pos_num = 0; pos_indexs = []; neg_indexs = []   
for i in range(len(labelmat)):#統(tǒng)計(jì)正負(fù)樣本的下標(biāo)     
if labelmat[i] == 1:
pos_num +=1
pos_indexs.append(i)
continue
neg_indexs.append(i)
np.random.shuffle(neg_indexs)
neg_indexs = neg_indexs[0:pos_num]
fr = open(datafile, 'r')
onefile = fr.readlines()
outfile = []
for i in range(pos_num):
pos_line = onefile[pos_indexs[i]]     
outfile.append(pos_line)
neg_line= onefile[neg_indexs[i]]       
outfile.append(neg_line)
return outfile #輸出單個(gè)數(shù)據(jù)集采樣結(jié)果
下面的generatedataset(datadir,outdir)方法是從切分的數(shù)據(jù)集中留出一份作為測(cè)試集(無需抽樣),對(duì)其余的進(jìn)行抽樣然后合并為一個(gè)作為訓(xùn)練集,代碼如下:
def generatedataset(datadir,outdir): #從切分的數(shù)據(jù)集中,對(duì)其中九份抽樣匯成一個(gè),\
#剩余一個(gè)做為測(cè)試集,將最后的結(jié)果按照訓(xùn)練集和測(cè)試集輸出到outdir中
if not os.path.exists(outdir): #if not outdir,makrdir
os.makedirs(outdir)
listfile = os.listdir(datadir)
train_all = []; test_all = [];cross_now = 0
for eachfile1 in listfile:
train_sets = []; test_sets = [];
cross_now += 1 #記錄當(dāng)前的交叉次數(shù)
for eachfile2 in listfile:
if eachfile2 != eachfile1:#對(duì)其余九份欠抽樣構(gòu)成訓(xùn)練集
one_sample = undersample(datadir + '/' + eachfile2)
for i in range(len(one_sample)):
train_sets.append(one_sample[i])
#將訓(xùn)練集和測(cè)試集文件單獨(dú)保存起來
with open(outdir +"/test_"+str(cross_now)+".datasets",'w') as fw_test:
with open(datadir + '/' + eachfile1, 'r') as fr_testsets:
for each_testline in fr_testsets:                 
test_sets.append(each_testline)
for oneline_test in test_sets:
fw_test.write(oneline_test) #輸出測(cè)試集
test_all.append(test_sets)#保存訓(xùn)練集
with open(outdir+"/train_"+str(cross_now)+".datasets",'w') as fw_train:
for oneline_train in train_sets:   
oneline_train = oneline_train
fw_train.write(oneline_train)#輸出訓(xùn)練集
train_all.append(train_sets)#保存訓(xùn)練集
return train_all,test_all
因?yàn)樾枰u(píng)估交叉驗(yàn)證,所以我寫了一個(gè)performance方法根據(jù)真實(shí)類標(biāo)簽紙和預(yù)測(cè)值來計(jì)算sn和sp,當(dāng)然如果需要其他的評(píng)估標(biāo)準(zhǔn),繼續(xù)添加即可。
def performance(labelarr, predictarr):#類標(biāo)簽為int類型
#labelarr[i] is actual value,predictarr[i] is predict value
tp = 0.; tn = 0.; fp = 0.; fn = 0.   
for i in range(len(labelarr)):
if labelarr[i] == 1 and predictarr[i] == 1:
tp += 1.
if labelarr[i] == 1 and predictarr[i] == -1:
fn += 1.
if labelarr[i] == -1 and predictarr[i] == 1:
fp += 1.
if labelarr[i] == -1 and predictarr[i] == -1:
tn += 1.
sn = tp/(tp + fn) #sensitivity = tp/p  and p = tp + fn
sp = tn/(fp + tn) #specificity = tn/n  and n = tn + fp
#mcc = (tp*tn-fp*fn)/math.sqrt((tp+fp)*(tp+fn)*(tn+fp)*(tn+fn))
return sn,sp
classifier(clf,train_x, train_y, test_x, test_y)方法是交叉驗(yàn)證中每次用的分類器訓(xùn)練過程以及測(cè)試過程,里面使用的分類器是scikit-learn自帶的。該方法會(huì)將一些訓(xùn)練結(jié)果寫入到文件中并保存到本地,同時(shí)在最后會(huì)返回acc,sp,sn。
def classifier(clf,train_x, train_y, test_x, test_y):#x:訓(xùn)練特征,y:訓(xùn)練標(biāo)號(hào)
# train with randomforest
print " training begin..."
clf = clf.fit(train_x,train_y)
print " training end."
#==========================================================================
# test randomforestclassifier with testsets
print " test begin."
predict_ = clf.predict(test_x) #return type is float64
proba = clf.predict_proba(test_x) #return type is float64
score_ = clf.score(test_x,test_y)
print " test end."
#==========================================================================
# modeal evaluation
acc = accuracy_score(test_y, predict_)
sn,sp = performance(test_y, predict_)
mcc = matthews_corrcoef(test_y, predict_)
#auc = roc_auc_score(test_labelmat, proba)
#==========================================================================
#save output
eval_output = []
eval_output.append(acc);eval_output.append(sn)  #eval_output.append(auc)
eval_output.append(sp);eval_output.append(mcc)
eval_output.append(score_)
eval_output = np.array(eval_output,dtype=float)
np.savetxt("proba.data",proba,fmt="%f",delimiter="\t")
np.savetxt("test_y.data",test_y,fmt="%f",delimiter="\t")
np.savetxt("predict.data",predict_,fmt="%f",delimiter="\t")
np.savetxt("eval_output.data",eval_output,fmt="%f",delimiter="\t")
print "wrote results to output.data...eof..."
return acc,sn,sp
下面的mean_fun用于求列表list中數(shù)值的平均值,主要是求acc_mean,sp_mean,sn_mean,用來評(píng)估模型好壞。
def mean_fun(onelist):
count = 0
for i in onelist:
count += i
return float(count/len(onelist))
交叉驗(yàn)證代碼
def crossvalidation(clf, clfname, curdir,train_all, test_all):
os.chdir(curdir)
#構(gòu)造出純數(shù)據(jù)型樣本集
cur_path = curdir
accs = [];sns = []; sps =[]
for i in range(len(train_all)):
os.chdir(cur_path)
train_data = train_all[i];train_x = [];train_y = []
test_data = test_all[i];test_x = [];test_y = []
for eachline_train in train_data:
one_train = eachline_train.split('\t')
one_train_format = []
for index in range(3,len(one_train)-1):
one_train_format.append(float(one_train[index]))
train_x.append(one_train_format)
train_y.append(int(one_train[-1].strip()))
for eachline_test in test_data:
one_test = eachline_test.split('\t')
one_test_format = []
for index in range(3,len(one_test)-1):
one_test_format.append(float(one_test[index]))
test_x.append(one_test_format)
test_y.append(int(one_test[-1].strip()))
#======================================================================
#classifier start here
if not os.path.exists(clfname):#使用的分類器
os.mkdir(clfname)
out_path = clfname + "/" + clfname + "_00" + str(i)#計(jì)算結(jié)果文件夾
if not os.path.exists(out_path):
os.mkdir(out_path)
os.chdir(out_path)
acc, sn, sp = classifier(clf, train_x, train_y, test_x, test_y)
accs.append(acc);sns.append(sn);sps.append(sp)
#======================================================================
acc_mean = mean_fun(accs)
sn_mean = mean_fun(sns)
sp_mean = mean_fun(sps)
#==========================================================================
#output experiment result
os.chdir("../")
os.system("echo `date` '" + str(clf) + "' >> log.out")
os.system("echo acc_mean=" + str(acc_mean) + " >> log.out")
os.system("echo sn_mean=" + str(sn_mean) + " >> log.out")
os.system("echo sp_mean=" + str(sp_mean) + " >> log.out")
return acc_mean, sn_mean, sp_mean
測(cè)試:
if __name__ == '__main__':
os.chdir("your workhome") #你的數(shù)據(jù)存放目錄
datadir = "split10_1" #切分后的文件輸出目錄
splitdataset('datasets',10,datadir)#將數(shù)據(jù)集datasets切為十個(gè)保存到datadir目錄中
#==========================================================================
outdir = "sample_data1" #抽樣的數(shù)據(jù)集存放目錄
train_all,test_all = generatedataset(datadir,outdir) #抽樣后返回訓(xùn)練集和測(cè)試集
print "generatedataset end and cross validation start"
#==========================================================================
#分類器部分
from sklearn.ensemble import randomforestclassifier
clf = randomforestclassifier(n_estimators=500) #使用隨機(jī)森林分類器來訓(xùn)練
clfname = "rf_1"
#==========================================================================
curdir = "experimentdir" #工作目錄
#clf:分類器,clfname:分類器名稱,curdir:當(dāng)前路徑,train_all:訓(xùn)練集,test_all:測(cè)試集
acc_mean, sn_mean, sp_mean = crossvalidation(clf, clfname, curdir, train_all,test_all)
print acc_mean,sn_mean,sp_mean #將acc均值,sp均值,sn均值都輸出到控制臺(tái)
上面的代碼主要用于抽樣后的十倍交叉驗(yàn)證,該怎么設(shè)置參數(shù),還得具體分析。
總之,交叉驗(yàn)證在一定程度上能夠避免陷入局部最小值。一般實(shí)際操作中使用的是十折交叉驗(yàn)證,單具體情況還得具體分析,并沒有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)固定十倍交叉的參數(shù)或者是算法的選擇以及算法參數(shù)的選擇。不同的數(shù)據(jù)使用不同的算法往往會(huì)的得到不同的最優(yōu)分類器。

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

若不方便掃碼,搜微信號(hào):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)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(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ù)說明請(qǐng)參見: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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }