libsvm中tools 中提供了乙個一條龍式的程式 easy.py
出於興趣對原碼做了一些學習
if len(sys.argv) <= 1:
print('usage: training_file [testing_file]'.format(sys.argv[0]))
raise systemexit
(1)sys.argv: 實現從程式外部向程式傳遞引數,實質是個list
sys.argv[0] --> py程式本身
(2)raise systemexit --> 退出程式
也可以用下面的格式
raise systemexit('......')
(3) .format 用於字串的格式化。
即代表著sys.argv[0]會出現在的位置上。這裡理應就是easy.py
除了通過位置,還可以通過關鍵字或者字典進行對映。此外,.format還可以實現左右對齊,精度進製控制等
這種對映方式相對之前類c的%f方式有何優勢?
大概是這樣:
print(',,,'.format('wyz','21')
對映看起來要靈活得多
小結:這一段是對引數個數的檢查,如果引數個數只有乙個,即只有 python easy.py ,就提示正確用法,並退出
is_win32 = (sys.platform == 'win32')
if not is_win32:
svmscale_exe = "../svm-scale"
svmtrain_exe = "../svm-train"
svmpredict_exe = "../svm-predict"
grid_py = "./grid.py"
gnuplot_exe = "/usr/bin/gnuplot"
else:
# example for windows
svmscale_exe = r"..\windows\svm-scale.exe"
svmtrain_exe = r"..\windows\svm-train.exe"
svmpredict_exe = r"..\windows\svm-predict.exe"
gnuplot_exe = r"c:\tmp\gnuplot\binary\pgnuplot.exe"
grid_py = r".\grid.py"
(1) sys.platform 返回作業系統名稱,windows平台返回值是'win32'
(2) ./表示同級檔案, ../表示上級檔案,這裡定義了幾個執行檔案的路徑
assert os.path.exists(svmscale_exe),"svm-scale executable not found"
assert os.path.exists(svmtrain_exe),"svm-train executable not found"
assert os.path.exists(svmpredict_exe),"svm-predict executable not found"
assert os.path.exists(gnuplot_exe),"gnuplot executable not found"
assert os.path.exists(grid_py),"grid.py not found"
train_pathname = sys.argv[1]
assert os.path.exists(train_pathname),"training file not found"
file_name = os.path.split(train_pathname)[1]
scaled_file = file_name + ".scale"
model_file = file_name + ".model"
range_file = file_name + ".range"
(1) os.path.exists()函式用來檢驗給出的路徑是否真地存在
(2) assert 斷言函式 用法
assert expression [, arguments]
如果expression 為假,就會輸出後面這一句
(3) sys.argv[1] --> 等待training 的data集
if len(sys.argv) > 2:
test_pathname = sys.argv[2]
file_name = os.path.split(test_pathname)[1]
assert os.path.exists(test_pathname),"testing file not found"
scaled_test_file = file_name + ".scale"
predict_test_file = file_name + ".predict"
這一段檢查引數是否包含測試檔名
cmd = ' -s "" "" > ""'.format(svmscale_exe, range_file, train_pathname, scaled_file)
print('scaling training data...')
popen(cmd, shell = true, stdout = pipe).communicate()
cmd = ' -svmtrain "" -gnuplot "" ""'.format(grid_py, svmtrain_exe, gnuplot_exe, scaled_file)
print('cross validation...')
f = popen(cmd, shell = true, stdout = pipe).stdout
這一段是最為難懂的
(1)cmd定義了乙個字串 svmscale_exe -s "range_file" "train_pathname" > "scaled_file"
(2)popen 是subprocess模組中定義的乙個類
實際建立了乙個子程序。其中shell=true, 而 args 是字串,它將作為命令列字串通過shell 執行。
popen的communicate方法使父程序與子程序能夠交流,二元組 (stdoutdata, stderrdata) 分別表示從標準出和標準錯誤中讀出的資料。
而設定stdout = pipe ,則使得父程序可以接受子程序返回的資料。communicate會阻塞父程序直至子程序結束。
詳細參見baby_ape的部落格 非常詳細易懂
小結而言,這段**首先建立子程序scale訓練集;然後建立子程序利用grid.py和gnuplot來尋找最好的svm引數
line = ''
while true:
last_line = line
line = f.readline()
if not line: break
c,g,rate = map(float,last_line.split())
看起來f是grid.py 輸出的檔案。 c,g 是svm的引數,rate則是結果
(1)readline() 方法用於從檔案讀取整行,包括 "\n" 字元 用法:fileobject.readline();
(2)if not line:break 讀到空行就退出
(3).split 分隔符預設為所有的空字元,包括空格、換行(\n)、製表符(\t)等。 用法: str.split(str="", num=string.count(str))
num為分割次數
(4)map函式,將分割出的內容都變為float,然後賦給c,g,rate。處在float位置的通常是某個函式
print('best c=, g= cv rate='.format(c,g,rate))
cmd = ' -c -g "" ""'.format(svmtrain_exe,c,g,scaled_file,model_file)
print('training...')
popen(cmd, shell = true, stdout = pipe).communicate()
print('output model: '.format(model_file))
利用最好的引數對訓練集再次進行訓練
if len(sys.argv) > 2:
cmd = ' -r "" "" > ""'.format(svmscale_exe, range_file, test_pathname, scaled_test_file)
print('scaling testing data...')
popen(cmd, shell = true, stdout = pipe).communicate()
cmd = ' "" "" ""'.format(svmpredict_exe, scaled_test_file, model_file, predict_test_file)
print('testing...')
popen(cmd, shell = true).communicate()
print('output prediction: '.format(predict_test_file))
如果有測試集,利用最優引數對測試集進行**
總結: easy.py (1)引數,檔案路徑等進行檢查
(2)建立子程序scale資料,利用grid.py找到最優引數
(3)利用最優引數跑訓練集和測試集,並輸出結果
MATLAB 機器學習 安裝LIBSVM
本文僅僅介紹window下安裝步驟。3 新增路徑 主頁 設定路徑 新增資料夾及其子資料夾 解壓的資料夾裡的乙個資料夾windows即e program files libsvm 3.21 windows 儲存後關閉即可。tip 其實網上,大多數部落格都有介紹需要,mex進行c語言編譯,在我的安裝過程...
機器學習 之 libsvm 引數說明
因為要用svm做regression,所以看了一些關於libsvm,總結以備用 libsvm在訓練model的時候,有如下引數要設定,當然有預設的引數,但是在具體應用方面效果會大大折扣。options 可用的選項即表示的涵義如下 s svm型別 svm設定型別 預設0 0 c svc 1 v svc...
Libsvm使用總結
libsvm使用心得 分類,回歸 libsvm是實現svm的便捷開源工具,應用廣泛 除此之外還有lightsvm,沒用過 由國立台灣大學chih chung chang和 chih jen lin編寫,可以實現基於svm的分類和回歸。由於個人對svm的理論只是 略懂 下面只介紹libsvm在win3...