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

熱線電話:13121318867

登錄
首頁精彩閱讀數(shù)據(jù)挖掘 SPSS Modeler 腳本功能的應(yīng)用場(chǎng)景和編寫技巧
數(shù)據(jù)挖掘 SPSS Modeler 腳本功能的應(yīng)用場(chǎng)景和編寫技巧
2016-08-22
收藏

數(shù)據(jù)挖掘 SPSS Modeler 腳本功能的應(yīng)用場(chǎng)景和編寫技巧

數(shù)據(jù)挖掘軟件 IBM SPSS Modeler 以用戶界面友好、可視化功能強(qiáng)大著稱。關(guān)于其腳本功能,參考資料很少。作者認(rèn)為,腳本功能實(shí)際上旨在實(shí)現(xiàn)數(shù)據(jù)處理和分析建模過程的自動(dòng)化。在需要?jiǎng)討B(tài)改變數(shù)據(jù)處理過程、數(shù)據(jù)流自動(dòng)執(zhí)行和自動(dòng)執(zhí)行批量任務(wù)等應(yīng)用場(chǎng)景下,必須補(bǔ)充編寫一些腳本才能完成某些特定功能。所以,腳本功能是用戶界面的必要補(bǔ)充,而不僅僅是用戶界面鼠標(biāo)操作功能的代碼化。

SPSS Modeler 自帶的腳本編寫用戶指南沒有按照腳本功能的常用應(yīng)用場(chǎng)景組織內(nèi)容,這給腳本編寫人員參考查閱造成一定的不便。同時(shí),缺少完整的實(shí)用的例子,給出的例子多數(shù)是模擬用戶界面上的常用操作。而實(shí)際情況是編寫腳本通常是為了補(bǔ)充用戶界面上很少使用或者不能實(shí)現(xiàn)的功能。作者就經(jīng)常為找不到可以參考的例子而苦惱。

本文首先介紹用戶界面上無法或者不便實(shí)現(xiàn)而必須編寫腳本的常見的五種應(yīng)用場(chǎng)景。每種場(chǎng)景下均給出完整的應(yīng)用實(shí)例,重點(diǎn)介紹腳本編寫的方法和技巧。在第二節(jié),基于作者經(jīng)驗(yàn),總結(jié)了編寫腳本的常用技巧。本文所附的實(shí)例均來自實(shí)際項(xiàng)目,且在 SPSS Modeler 15.0 環(huán)境下測(cè)試通過。

腳本功能的應(yīng)用場(chǎng)景

什么情況下需要腳本功能?根據(jù)作者的經(jīng)驗(yàn),遇到下列情況應(yīng)考慮使用腳本功能:需要重復(fù)執(zhí)行某些數(shù)據(jù)處理;需要?jiǎng)討B(tài)改變數(shù)據(jù)處理的過程;數(shù)據(jù)流最終需要部署到第三方環(huán)境;數(shù)據(jù)流需要自動(dòng)執(zhí)行 ( 而不是鼠標(biāo)操作執(zhí)行 );需要批量修改已有的數(shù)據(jù)流或者自動(dòng)執(zhí)行批量任務(wù)。

重復(fù)執(zhí)行的數(shù)據(jù)處理

我們知道,Modeler 數(shù)據(jù)流默認(rèn)都是順序執(zhí)行的,多個(gè)節(jié)點(diǎn)的依次連接而成的數(shù)據(jù)流提前指定了數(shù)據(jù)處理的順序。然而,實(shí)際建模中經(jīng)常會(huì)遇到部分?jǐn)?shù)據(jù)流需要重復(fù)多次執(zhí)行,且可能帶參數(shù),這時(shí)手工執(zhí)行就很不方便。同時(shí),可能需要根據(jù)某個(gè)變量的取值重復(fù)執(zhí)行一段數(shù)據(jù)流 ( 實(shí)現(xiàn)動(dòng)態(tài)循環(huán) ),這種情況下就必須借助腳本來實(shí)現(xiàn)。

圖 1 所示的數(shù)據(jù)流來自是一個(gè)預(yù)測(cè)產(chǎn)品銷售的時(shí)間序列模型。需要分別預(yù)測(cè)每個(gè)銷售分支機(jī)構(gòu) (IMT) 在未來一個(gè)季度的銷售總額。當(dāng)銷售機(jī)構(gòu)較多 (=21) 且動(dòng)態(tài)變化時(shí),需要根據(jù) Table 節(jié)點(diǎn) IMT_List 的輸出結(jié)果,循環(huán)多次逐行取出 IMT 的取值,然后根據(jù)此值設(shè)置 Select1 和 IMT 節(jié)點(diǎn),從而實(shí)現(xiàn)動(dòng)態(tài)的重復(fù)執(zhí)行的數(shù)據(jù)處理。這里的主要技巧是從 Table 節(jié)點(diǎn)循環(huán)取數(shù)。

圖 1. 從 Table 節(jié)點(diǎn)循環(huán)取數(shù)

從 Table 節(jié)點(diǎn)循環(huán)取數(shù)

點(diǎn)擊查看大圖

圖 1 中方框內(nèi)的三個(gè)節(jié)點(diǎn)是腳本涉及的主要部分,對(duì)應(yīng)的腳本內(nèi)容如下:

清單 1 腳本內(nèi)容 - 從 Table 節(jié)點(diǎn)循環(huán)取數(shù)

清單 1. 腳本內(nèi)容 - 從 Table 節(jié)點(diǎn)循環(huán)取數(shù)

腳本編寫的要點(diǎn):執(zhí)行 Table 節(jié)點(diǎn)讀取所有的循環(huán)變量取值。利用 Result 對(duì)象的 output 屬性和 Value 命令逐個(gè)讀取循環(huán)變量的取值。使用 set 命令為多個(gè)節(jié)點(diǎn)動(dòng)態(tài)賦值。

動(dòng)態(tài)改變的數(shù)據(jù)處理過程

SPSS Modeler 數(shù)據(jù)流默認(rèn)都是順序執(zhí)行的,多個(gè)節(jié)點(diǎn)的依次連接而成的數(shù)據(jù)流預(yù)先指定了數(shù)據(jù)處理過程。如果需要改變順序執(zhí)行為根據(jù)條件執(zhí)行不同的流分支,則需要使用腳本 if...then...else... 命令。

下面的實(shí)例來自一個(gè)銷售績效評(píng)估項(xiàng)目,需要根據(jù)用戶命令行參數(shù)的設(shè)置自動(dòng)選擇執(zhí)行不同的數(shù)據(jù)流分支。具體來說,根據(jù)命令行參數(shù),自動(dòng)選擇是否重新訓(xùn)練模型和根據(jù)不同季度選擇不同的數(shù)據(jù)調(diào)整方法。

圖 2. 根據(jù)命令行參數(shù)選擇是否訓(xùn)練模型和季度調(diào)整方法


這個(gè)數(shù)據(jù)流在用戶界面上調(diào)試時(shí),不需要腳本,但是當(dāng)部署完成集成到生產(chǎn)環(huán)境下自動(dòng)執(zhí)行時(shí),就必須編寫一些腳本以實(shí)現(xiàn)根據(jù)命令行參數(shù)動(dòng)態(tài)選擇不同的數(shù)據(jù)處理過程。本例的腳本如下:

清單 2. 帶命令行參數(shù)的腳本

帶命令行參數(shù)的腳本

腳本編寫的要點(diǎn):使用 if...then...else... 命令,結(jié)合 CLEM 表達(dá)式和腳本參數(shù),實(shí)現(xiàn)根據(jù)命令行參數(shù)動(dòng)態(tài)選擇不同的數(shù)據(jù)處理過程。

部署到第三方環(huán)境的數(shù)據(jù)流

構(gòu)建好的數(shù)據(jù)流可能需要部署到第三方環(huán)境下使用。此時(shí),數(shù)據(jù)流的執(zhí)行往往不同于 SPSS Modeler 環(huán)境,有些情況下必須編寫一點(diǎn)腳本,以實(shí)現(xiàn)預(yù)設(shè)的功能。

最簡單的部署數(shù)據(jù)流的方法是使用 SPSS Modeler 批處理方式 (Batch Mode) 在第三方環(huán)境通過執(zhí)行批命令來執(zhí)行數(shù)據(jù)流。另外一種常用的部署方法是使用 Solution Publisher 在第三方環(huán)境執(zhí)行數(shù)據(jù)流。下面就這兩種部署方法分別給出一個(gè)應(yīng)用實(shí)例。圖 3 是一個(gè)資產(chǎn)效能優(yōu)化項(xiàng)目中展示變壓器報(bào)警分布情況的數(shù)據(jù)流。

圖 3. 部署到第三方環(huán)境的數(shù)據(jù)流 (Batch Mode)

部署到第三方環(huán)境的數(shù)據(jù)流 (Batch Mode)

清單 3. 批處理方式部署

批處理方式部署

在用戶界面上操作時(shí)不需要右邊圖示的腳本,但如果需要把這個(gè)流文件部署到第三方環(huán)境執(zhí)行時(shí),就必須增加這些腳本,且必須設(shè)置為與數(shù)據(jù)流同步執(zhí)行 ( 選擇 Run this script)。否則會(huì)提示輸入數(shù)據(jù)庫源節(jié)點(diǎn)的 Password 且不會(huì)自動(dòng)執(zhí)行三個(gè)圖形輸出節(jié)點(diǎn)。對(duì)應(yīng)的執(zhí)行這個(gè)數(shù)據(jù)流的批命令文件的內(nèi)容如下:

批處理命令

...\clemb.exe -hostname IP -port 28052 -username UN -password PW -stream "...\Alarm Distribution Pattern Transformer.str" -execute -server -appendlog

下面的例子是一個(gè)資產(chǎn)效能優(yōu)化項(xiàng)目中預(yù)測(cè)鐵路設(shè)備故障的數(shù)據(jù)流。

圖 4. 部署到第三方環(huán)境的數(shù)據(jù)流 (Solution Publisher)
清單 4. Solution Publisher 部署

Solution Publisher 部署

這些腳本在部署環(huán)境下執(zhí)行必須編寫,否則提問密碼,而且不能更新模型和輸出預(yù)測(cè)結(jié)果。所以,用戶界面下正常執(zhí)行的數(shù)據(jù)流,在完成部署并自動(dòng)執(zhí)行的情況下,有些功能必須借助腳本來實(shí)現(xiàn)。特別需要注意的是:如果沒有 insert model 這行腳本,模型就不能正常更新。沒有腳本 execute 'Alarm Rail',預(yù)測(cè)結(jié)果就不能輸出到指定的數(shù)據(jù)庫表。對(duì)應(yīng)的調(diào)用 Solution Publisher 執(zhí)行這個(gè)數(shù)據(jù)流的批命令文件的內(nèi)容如下:

批處理命令

"...\modelerrun.exe" -p "...\Alarm_Prediction_Rail.par" "...\Alarm_Prediction_Rail.pim"

自動(dòng)執(zhí)行的數(shù)據(jù)流

構(gòu)建好的數(shù)據(jù)流可能需要部署到正式的生產(chǎn)環(huán)境,這時(shí)通常需要定期地自動(dòng)執(zhí)行這些數(shù)據(jù)流。直接復(fù)制用戶界面調(diào)試好的數(shù)據(jù)流 ( 手工執(zhí)行 ),當(dāng)在生產(chǎn)環(huán)境自動(dòng)執(zhí)行時(shí),有些功能就可能不能實(shí)現(xiàn)。

自動(dòng)執(zhí)行數(shù)據(jù)流有三種模式:Batch 模式、Client 模式和 Solution Publisher 模式。對(duì)應(yīng)的可執(zhí)行文件分別為:clemb.exe、modelerclient.exe 和 modelerrun.exe。前兩種模式的典型命令行命令如下:

命令

clemb/modelerclient -server -hostname myserver -port 80 -username dminer -password 1234 -stream mystream.str -execute

對(duì)于 Solution Publisher 模式,在 Command Line 窗口下的執(zhí)行命令如下:

命令

modelerrun – p *.par *.pim

當(dāng)需要自動(dòng)執(zhí)行數(shù)據(jù)流時(shí),原先在用戶界面上調(diào)試好的,即手工執(zhí)行的數(shù)據(jù)流可能需要補(bǔ)充一些腳本以實(shí)現(xiàn)指定的功能。例如,建模節(jié)點(diǎn)的自動(dòng)執(zhí)行、模型節(jié)點(diǎn)的自動(dòng)更新、導(dǎo)出類節(jié)點(diǎn) (Export) 的結(jié)果導(dǎo)出等都需要編寫腳本。

圖 5 所示是一個(gè)資產(chǎn)效能優(yōu)化項(xiàng)目中挖掘變壓器失效與 DCS 監(jiān)控?cái)?shù)據(jù)異常的關(guān)聯(lián)規(guī)則的數(shù)據(jù)流。這個(gè)數(shù)據(jù)流需要使用 Solution Publisher 部署到第三方環(huán)境自動(dòng)執(zhí)行,同時(shí)需要輸出關(guān)聯(lián)規(guī)則到數(shù)據(jù)庫。由于 Solution Publisher 只支持二維數(shù)據(jù)的輸出而不能輸出關(guān)聯(lián)規(guī)則模型本身,所以難點(diǎn)在于如何自動(dòng)更新模型并輸出關(guān)聯(lián)規(guī)則模型本身的結(jié)果到 Oracle 數(shù)據(jù)庫表,這就需要編寫腳本。這個(gè)實(shí)例的特點(diǎn)是同時(shí)實(shí)現(xiàn)了建模節(jié)點(diǎn)的自動(dòng)執(zhí)行、模型節(jié)點(diǎn)的自動(dòng)更新和導(dǎo)出節(jié)點(diǎn)的結(jié)果保存。

圖 5. 關(guān)聯(lián)規(guī)則的自動(dòng)輸出

<a href='/map/guanlianguize/' style='color:#000;font-size:inherit;'>關(guān)聯(lián)規(guī)則</a>的自動(dòng)輸出

點(diǎn)擊查看大圖

清單 5. 關(guān)聯(lián)規(guī)則自動(dòng)輸出的腳本

<a href='/map/guanlianguize/' style='color:#000;font-size:inherit;'>關(guān)聯(lián)規(guī)則</a>自動(dòng)輸出的腳本

腳本編寫的要點(diǎn):使用 set 命令提前設(shè)置數(shù)據(jù)庫密碼。使用 export model 命令輸出關(guān)聯(lián)規(guī)則模型為純文本文件。使用 Export 節(jié)點(diǎn)把純文本格式的關(guān)聯(lián)規(guī)則輸出到數(shù)據(jù)庫。

自動(dòng)執(zhí)行的批量任務(wù)

實(shí)際應(yīng)用中可能會(huì)遇到需要批量修改已有的數(shù)據(jù)流,以提高模型構(gòu)建效率或者適用不同的客戶項(xiàng)目。例如,可能需要把所有字段名修改為大寫字母。手工修改對(duì)于節(jié)點(diǎn)或字段較多時(shí)就不方便。

下面的例子來自一個(gè)資產(chǎn)效能優(yōu)化項(xiàng)目。以前調(diào)試好的數(shù)據(jù)流,原先數(shù)據(jù)導(dǎo)出到 Excel 表,現(xiàn)在客戶環(huán)境發(fā)生變化需要導(dǎo)出到 Oracle 數(shù)據(jù)庫。由于 Oracle 數(shù)據(jù)庫的庫表名稱和字段名稱必須用大寫字母且不能有空格,所以需要批量替換所有的 Filter 節(jié)點(diǎn)的小寫字母和中間空格。手工修改對(duì)于 Filter 節(jié)點(diǎn)較多或字段較多時(shí)不方便,可以使用腳本自動(dòng)修改。下面一段腳本,可以實(shí)現(xiàn)類似于圖 6 所示的 Filter 節(jié)點(diǎn) (Filter_Out) 的所有 Filter 節(jié)點(diǎn)的字段名稱的大寫轉(zhuǎn)換和空格到下劃線的轉(zhuǎn)換。

圖 6. 字段名稱大寫和空格的自動(dòng)轉(zhuǎn)換

<a href='/map/ziduan/' style='color:#000;font-size:inherit;'>字段</a>名稱大寫和空格的自動(dòng)轉(zhuǎn)換

清單 6. 批量任務(wù)的腳本

批量任務(wù)的腳本

腳本編寫的要點(diǎn):搜索當(dāng)前數(shù)據(jù)流中包含的所有 Filter 節(jié)點(diǎn),然后逐個(gè)節(jié)點(diǎn)對(duì)新的字段名稱逐個(gè)進(jìn)行大寫轉(zhuǎn)換,并把中間空格替換為下劃線。使用了 set 命令、循環(huán)語句和條件語句。

腳本編寫的常用技巧

腳本運(yùn)行不同于鼠標(biāo)操作的情況

SPSS Modeler 腳本功能是輔助的,鼠標(biāo)操作是其基本的使用方式。所以,有些看似功能類似的腳本在實(shí)際運(yùn)行時(shí)的效果不同于鼠標(biāo)操作。常見情況可分為三種:

? 腳本中使用的節(jié)點(diǎn)需要重新命名。不同于鼠標(biāo)操作模式,在運(yùn)行腳本時(shí)不能出現(xiàn)重名的節(jié)點(diǎn),否則報(bào)錯(cuò)。

? 建模節(jié)點(diǎn)的腳本執(zhí)行不會(huì)自動(dòng)更新模型節(jié)點(diǎn) (Nugget)。例如,圖 5 所示腳本的命令 execute 'Apriori1'僅執(zhí)行建模節(jié)點(diǎn)'Apriori1'并把建好的模型節(jié)點(diǎn)放到管理器,而不自動(dòng)更新工作區(qū)的模型節(jié)點(diǎn),需要編寫腳本把模型節(jié)點(diǎn)插入 ( 使用命令 insert model)。

? 使用腳本執(zhí)行數(shù)據(jù)流時(shí),末端的圖形或數(shù)據(jù)的輸出節(jié)點(diǎn)不會(huì)自動(dòng)執(zhí)行。例如,本文“1.3 部署到第三方環(huán)境的數(shù)據(jù)流”一節(jié)圖 3 所示的例子,在用戶界面上,點(diǎn)擊按鈕“運(yùn)行當(dāng)前流”(Run the current stream),所有末端的輸出節(jié)點(diǎn)自動(dòng)執(zhí)行,但當(dāng)部署到第三方環(huán)境執(zhí)行這個(gè)數(shù)據(jù)流時(shí),就需要在這個(gè)數(shù)據(jù)流上附加腳本才能完成輸出。

腳本編寫的常用技巧

屏蔽文件覆蓋的提問:腳本自動(dòng)執(zhí)行時(shí)不希望中間跳出窗口提問是否覆蓋文件。這個(gè)功能沒有對(duì)應(yīng)的腳本命令,只能使用菜單改變?cè)摂?shù)據(jù)流的用戶選項(xiàng) (Tools...Options...User Options),不選 Warn when a node overwrites a file。

調(diào)試方法:沒有提供調(diào)試功能,只能點(diǎn)擊按鈕 Run selected lines only,選擇部分腳本運(yùn)行。

自動(dòng)刷新數(shù)據(jù)源節(jié)點(diǎn):當(dāng)原始數(shù)據(jù)改變時(shí),需要刷新對(duì)應(yīng)的數(shù)據(jù)源節(jié)點(diǎn)。使用命令 set ^stream.refresh_source_nodes = True 實(shí)現(xiàn)所有數(shù)據(jù)源節(jié)點(diǎn)的自動(dòng)刷新。

屏蔽數(shù)據(jù)源密碼提問:對(duì)應(yīng)通過 ODBC 連接的數(shù)據(jù)庫數(shù)據(jù)源,數(shù)據(jù)流自動(dòng)執(zhí)行時(shí)會(huì)提問密碼。屏蔽這種提問的命令:set 'Database1':databasenode.password = "mypassword"

模型節(jié)點(diǎn)的自動(dòng)更新:不同于鼠標(biāo)操作,腳本執(zhí)行建模節(jié)點(diǎn)不會(huì)自動(dòng)更新對(duì)應(yīng)的模型節(jié)點(diǎn)。需要使用 insert model 命令更新模型。如果需要同時(shí)更新多個(gè)模型節(jié)點(diǎn),還需使用 duplicate 命令。例如,下列腳本根據(jù)建模節(jié)點(diǎn) AutoNumeric 的執(zhí)行結(jié)果,自動(dòng)更新 Actual2 和 Actual3 兩個(gè)模型節(jié)點(diǎn):

execute 'AutoNumeric'

insert model Actual2 connected between 'Type2':typenode and 'AFFV_AR_Q1':derivenode

duplicate Actual2 as Actual3 connected between 'Type3':typenode and 'Filter3':filternode

清除已有的模型節(jié)點(diǎn):常用命令有三種,注意它們的區(qū)別。

delete Actual2 ( 命令 delete NODE) 從工作區(qū)上刪除模型節(jié)點(diǎn);

clear generated palette 清除管理器上的所有模型節(jié)點(diǎn);

delete model Actual2 清除管理器上而不是刪除工作區(qū)的模型節(jié)點(diǎn)。

高級(jí)腳本功能需要使用對(duì)象 (Object):常用的對(duì)象有四種:Output; Node; Model; Result。每類對(duì)象都有一些專用的命令用于定義和檢索這些對(duì)象,例如 get output; execute 'Node1'; export model; value 'Result1' at Row1 Column1。詳細(xì)命令參見用戶指南第四章內(nèi)容 (Scripting Commands)。例如,根據(jù) Table 節(jié)點(diǎn)的輸出讀取循環(huán)變量,就可使用 Result 對(duì)象的 value 命令。

數(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); }