Julia常用包简介
? ? ? ?第三方開發的Julia庫(包),是Julia生態中極為重要的一部分。Julia包雖然目前沒有Python那樣豐富,但卻極為快速地發展著。官方提供了包數量的統計趨勢,見下圖所示:
圖D-1 Julia包發展趨勢
由圖可見,Julia包的發展非常之快。相信在不久的將來,其豐富性及多樣性能夠覆蓋開發中的各種場景,并能夠快速滲透到科學計算等領域。讀者可在https://pkg.julialang.org/這個網站的近兩千個包中尋找適合自己的包。
下面我們將列舉一些常用包,關于它們的詳細使用方法,請參閱官方文檔。
Documenter.jl
這是一個由官方維護的包,專門用于將Julia代碼中的注釋系統(Docstrings)及其中的Markdown文件生成完整的說明文檔。
該包提供的文檔生成器,具備以下功能特點:
- 支持Markdown語法
- 開箱即用(Minimal Configuration)
- 支持Julia 0.6及0.7-dev版本(截止書稿時)
- 會對注釋中標注的代碼執行測試語句(Doctest)
- 支持文檔章節等方面的交叉引用
- 支持LaTeX語法
- 文檔字符系統缺失與交叉引用錯誤的檢查
- 自動生成目錄與文檔索引
- 使用Git自動構建與部署文檔,并能推送到GitHub的文檔庫中
包Documenter.jl是已經注冊的包,安裝很簡單,只需執行Pkg.add("Documenter")命令即可。該包會將代碼庫的Markdown文件及代碼中以docstrings方式注釋的文檔系統解析合并為單一的內聯(inter-linked)文檔。
DataFrames.jl
在科學計算中往往需要綜合多種庫的優勢,以構造強大的應用與分析系統,一個通用的數據結構便成為整合這些不同庫的紐帶,能夠為跨庫調用帶來極大的便利,更是為生態的快速發展奠基了基礎。
在Python語言中,有一個專門用于處理行列式或表格式(tabular)數據的結構,名為DataFrame,是科學計算庫Pandas的重要組成部分,已成為很多Python第三方包支持的基本數據操作框架。
類似地,Julia語言的DataFrames庫,正是意圖建立這樣一個基礎的數據結構。通過Pkg.add(“DataFrames”)命令便可安裝該包,此后使用using DataFrames即可將該包導入到開發者的名字空間中,使用DataFrames中的各種功能。
DataFrame類型能夠表達表格式數據,并支持數據中存在缺失值。其內部是列存儲的,每列是一個向量結構。在構建DataFrame對象時,可以同時列名,例如:
julia> using DataFrames
?
julia> df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])
4×2 DataFrames.DataFrame
│ Row │ A │ B │
├───┼──┼──┤
│ 1?? │ 1 │ M │
│ 2?? │ 2 │ F │
│ 3?? │ 3 │ F │
│ 4?? │ 4 │ M │
在構造方法中,參數名即是列名,而參數值即是對應列的取值。例中的DataFrame對象有兩列:第一列名為A,取1到4的整型;第二列名為B,值是字符串類型;而列Row是默認添加的行編號。
我們可以通過一些函數查看DataFrame對象的屬性:
julia> size(df)?? # 取得DataFrame對象的行與列數
(4, 2)
?
julia> size(df,1)? # 取得對象的行數
4
?
julia> size(df,2)? # 取得對象的列數
2
也可以通過describe()函數取得基本統計信息:
julia> describe(df)
A?????????????????????????????? # 列名
Summary Stats:
Mean:?????????? 2.500000???????? # 均值
Minimum:?????? 1.000000????????? # 最小值
1st Quartile:????? 1.750000???????? # 分位數
Median:????????? 2.500000??????? # 中值
3rd Quartile:????? 3.250000???????? # 分位數
Maximum:?????? 4.000000???????? # 最大值
Length:????????? 4?????????????? # 行數
Type:??????????? Int64?????????? # 數據類型
?
B
Summary Stats:
Length:???????? 4?????????????? # 行數
Type:?????????? String?????????? # 數據類型
Number Unique:? 2?????????????? # 唯一值(去重后)的數量
當然,我們可以通過列名,提取出某列的向量:
julia> df[:A]
4-element Array{Int64,1}:
?1
?2
?3
?4
?
julia> df[:B]
4-element Array{String,1}:
?"M"
?"F"
?"F"
?"M"
需要注意的是,代碼中使用列名時,需使用Symbol類型表達。
CSV.jl
簡單的數據交換與存儲,可采用CSV格式,這是一種常用的表格式數據,而包CSV.jl專為CSV文件的讀寫提供了支持。
通過Pkg.add("CSV")后,即可使用該包。該包非常簡單,基本上就兩個操作,read()和write()函數。我們下面僅以read()函數為例,介紹該包的使用。
函數read()會從指定的文件中加載csv格式的數據,并存儲到指定的數據結構中,默認的結構為DataFrame類型,其原型為:
CSV.read(fullpath::Union{AbstractString,IO}, sink::Type{T}=DataFrame, args...; kwargs...)
CSV.read(fullpath::Union{AbstractString,IO}, sink::Data.Sink; kwargs...)
其中fullpath指定csv文件的絕對路徑,或者是已經打開的某個IO對象。其中的Data.Sink是第三方包DataStreams.jl提供的類型,可參閱相關文檔,這里以DataFrame類型為例。
假設有一個csv文件,其內容如下表,各列以英文逗號分隔:
表D-1 CSV文件示例內容
| c1 | c2 | c3 |
| 1 | 7.2 | abc |
| 12 | 8.4 | def |
| 13 | 9.3 | ghi |
通過CSV包讀取,便可將該csv文件的內容加載到一個DataFrame對象中,即:
julia> using CSV
julia> data = CSV.read("d:/test.csv")
3×3 DataFrames.DataFrame
│ Row │ c1 │ c2? │ c3?? │
├───┼───┼──┼───┤
│ 1?? │ 11 │ 7.2 │? abc │
│ 2?? │ 12 │ 8.4 │? def │
│ 3?? │ 13 │ 9.3 │? ghi │
之后,便可基于DataFrames包的功能進行各種后續操作,例如describe()查看基本情況:
julia> describe(data)
c1
Summary Stats:
Mean:?????????? 12.000000
Minimum:??????? 11.000000
1st Quartile:?? 11.500000
Median:???????? 12.000000
3rd Quartile:?? 12.500000
Maximum:??????? 13.000000
Length:???????? 3
Type:?????????? Union{Int64, Missings.Missing}
Number Missing: 0
% Missing:????? 0.000000
?
c2
Summary Stats:
Mean:?????????? 8.300000
Minimum:??????? 7.200000
1st Quartile:?? 7.800000
Median:???????? 8.400000
3rd Quartile:?? 8.850000
Maximum:??????? 9.300000
Length:???????? 3
Type:?????????? Union{Float64, Missings.Missing}
Number Missing: 0
% Missing:????? 0.000000
?
c3
Summary Stats:
Length:???????? 3
Type:?????????? Union{Missings.Missing, String}
Number Unique:? 3???
Number Missing: 0
% Missing:????? 0.000000
從例中可見,CSV能夠自動識別出每列的數據類型.
假設上例中的數據有一個缺失值,并以N字符表示,如下表所示:
表D-2 有缺失值的CSV文件示例
| c1 | ?c2 | ?c3 |
| 11 | 7.2 | ?abc |
| 12 | N | ?def |
| 13 | 9.3 | ?ghi |
在讀取數據時,設置missingstring參數[[1]]為N,告知read()函數有缺失值:
julia> data = CSV.read("d:/test.csv"; missingstring="N")
3×3 DataFrames.DataFrame
│ Row │ c1 │ c2???? │ c3?? │
├───┼──┼────┼───┤
│ 1?? │ 11 │ 7.2???? │? abc │
│ 2?? │ 12 │ missing │? def │
│ 3?? │ 13 │ 9.3???? │? ghi │
可見,在獲得的DataFrame中,列c2中的缺失值得到了正確的識別。
另外,通過read()函數的鍵值參數還可以告知csv的其他各種格式情況,以便在加載數據時能夠成功處理。下面給出該函數的其他一些使用示例:
# 讀取以空白符為分隔符的文件 ?????????????????????????????????????????????????????????????????????????????????
CSV.read(file; delim=' ') ??????????????
?
# 自定義列名,適用于文件中沒有提供表頭的csv文件,但需要列名的數量與文件的列數一致
CSV.read(file; header=["col1", "col2", "col3"])
?
# 自定義每列的數據類型,但必須與實際的數據匹配
CSV.read(file; types=[Int, Int, Float64])
?
# 自定義讀取的文件行數,有助于提高解析速度,并可用于只讀取所需的有限頭部數據
CSV.read(file; rows=10000)
JSON.jl
在數據交換中,尤其是網絡數據中,Json格式的使用非常頻繁,Julia同樣提供了一個簡潔的庫,用于處理這類格式的數據。
假設有個名為s的字符串變量,存儲著Json數據,如下所示:
{
??? "a_number": 5.0,
??? "an_array": ["string", 9],
??? "inner": {
??????? "value": 3
??? }
}
在安裝JSON包后,可以嘗試將其解析到數據結構,語句非常簡單:
julia> s = "{\"a_number\" : 5.0, \"an_array\" : [\"string\", 9], \"inner\": {\"value\": 3}}";
?
julia> j = JSON.parse(s)
Dict{String,Any} with 3 entries:
? "an_array" => Any["string", 9]
? "a_number" => 5.0
? "inner"??? => Dict{String,Any}(Pair{String,Any}("value", 3))
函數parse()會將s的內容分析出來,放在一個嵌套的Dict對象中,并會自動進行數據類型識別,然后就可以通過關鍵字進行層層提取了。
julia> j["an_array"]
2-element Array{Any,1}:
? "string"
?9
?
julia> j["inner"]
Dict{String,Any} with 1 entry:
? "value" => 3
?
julia> j["inner"]["value"]
3
反之,也可以將對象結構轉換到Json字串,便于存儲或傳輸:
julia> JSON.json(j)
"{\"an_array\":[\"string\",9],\"a_number\":5.0,\"inner\":{\"value\":3}}"
Taro.jl
這是一個基于Apache Tika等庫開發的用于從Word、Excel或PDF文件中提取內容的強大的庫,其有以下幾個功能點:
- 能夠從Word、Excel、PDF文件中提取原始的文本數據
- 從Excel文件中將數據提取到DataFrame結構中
- 以Julia語言讀取Excel文件的API接口函數
- 將采用XSL-FO布局的文件轉換為PDF文件
Gadfly.jl
包Gadfly是Julia語言開發的繪圖與可視化庫,由Daniel C. Jones設計,現在由社區維護,其特點包括:
- 相當于SVG、PNG、Postscript與PDF的圖形渲染質量
- 直觀的、一致性的繪圖接口設計
- 可在IJulia中使用
- 能夠使用DataFrames.jl數據結構
- 支持大量的繪圖類型
Gadfly采用了一種被稱為“圖形語法(grammar of graphics)”的標準進行架構的設計,其在繪圖命令(plot specification)提交后,會遵循內部的流水線進行渲染,得到最終的結果。
渲染流水線(rendering pipeline)會將繪圖命令轉為一個整體性的圖形場景,包括坐標軸、顏色等導引元素(guides),及分層的點、線等圖形元素(geometry)。每一層會包括數據源、圖形元素(簡稱圖元)、數據與圖元的關聯映射、應用于層次數據統計等部分。所有的層共享如下元素:坐標系(如笛卡爾坐標系、極坐標系等)、坐標軸的縮放(如重對數、半對數等)、圖形場景統計及導引元素等。
一套完整的的繪制命令需要描述清楚這些共享的元素及各層的規格(specifications)。完整的渲染進程如圖所示:
圖D-2 Gadfly渲染流水線框架
ECharts.jl
ECharts是一款由百度前端技術部開發的,基于Javascript的數據可視化圖表庫,提供直觀,生動,可交互,可個性化定制的數據可視化圖表。提供大量常用的數據可視化圖表,底層基于ZRender(一個全新的輕量級canvas類庫),創建了坐標系,圖例,提示,工具箱等基礎組件,并在此上構建出折線圖(區域圖)、柱狀圖(條狀圖)、散點圖(氣泡圖)、餅圖(環形圖)、K線圖、地圖、力導向布局圖以及和弦圖,同時支持任意維度的堆積和多圖表混合展現。
圖D-3 Echarts框架圖[[2]]
包ECharts.jl基于Julia語言對JavaScript的ECharts 4進行了封裝,從而能在Julia中使用這個強大的圖表庫。在Pkg.add(“ECharts”)之后,即可通過using ECharts使用該包。
例如我們要繪制一個柱狀圖:
using ECharts
x = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
y = [11, 11, 15, 13, 12, 13, 10]
bm = bar(x, hcat(0.95 .* y, 1.25 .* y, y))
則會獲得下圖:
圖D-4 Echarts柱狀圖示例
也可以繪制金融當中常見的K線圖:
using ECharts
dt = ["2016/08/26", "2016/08/29", "2016/08/30", "2016/08/31", "2016/09/01", "2016/09/02",
"2016/09/06", "2016/09/07", "2016/09/08", "2016/09/09", "2016/09/12", "2016/09/13",
"2016/09/14", "2016/09/15", "2016/09/16", "2016/09/19", "2016/09/20", "2016/09/21",
"2016/09/22", "2016/09/23", "2016/09/26"]
?
close_ = [12.38, 12.47, 12.55, 12.60, 12.44, 12.50, 12.67, 12.70, 12.73,
12.38, 12.70, 12.38, 12.14, 12.11, 12.11, 12.11, 12.00, 12.09, 12.18,
12.17, 12.01]
?
open_ = [12.47, 12.38, 12.46, 12.48, 12.66, 12.53, 12.49, 12.62, 12.50,
12.61, 12.32, 12.53, 12.18, 12.14, 12.05, 12.12, 12.09, 12.08, 12.17,
12.12, 12.12]
?
high_ = [12.55, 12.50, 12.56, 12.61, 12.72, 12.57, 12.67, 12.75, 12.75,
12.6850, 12.77, 12.68, 12.31, 12.18, 12.13, 12.33, 12.19, 12.11, 12.29,
12.22, 12.12]
?
low_ = [12.34, 12.38, 12.43, 12.48, 12.35, 12.46, 12.43, 12.62, 12.50,
12.38, 12.28, 12.33,12.11, 12.06, 12.01, 12.0586, 11.96, 12.01, 12.16,
12.12, 12.00]
?
c = candlestick(dt, open_, close_, low_, high_)
執行獲得的圖標如下所示:
圖D-5 Echarts繪制K線圖示例
利用ECharts.jl包,可以繪制更多的圖表,讀者可以根據官方文檔獲得更多的幫助。
QML.jl
在圖像界面接口(Graphical User Interface,GUI)方面,QT是基于C++開發的跨平臺框架,支持包括Windows、Linux、Android、WP、IOS等多種系統平臺,是一個筆者非常欣賞的用C++語言開發的GUI套件,其簡潔明了的接口和框架,使用起來非常的方便,而且界面控制也非常的容易。借助QT官方提供的QT Creator工具,更能夠快速地設計出合用的交互界面。而且,QT不限于開發GUI,更適用于常見場景的應用開發,包括控制臺工具、服務器、網絡通訊等。該套件提供社區版,開發者只要遵循其協議,可免費使用。
在界面實現時,除了使用C++語言設計交互邏輯外,還可以使用一種類型JavaScript語言的名為QML的腳本語言進行界面設計,而在Julia中,包QML.jl即是通過CxxWrap.jl包提供了Qt5 QML的編程支持。
在采用Julia進行GUI編程時,還可以參看PySide.jl包、Qwt.jl包及Gtk.jl包。
JDBC.jl
數據庫的操作在Julia中也非常方便,其中的JDBC.jl包提供了數據庫訪問的支持。
該包基于JavaCall.jl包的功能,通過Java的接口訪問JDBC驅動。提供的API包括兩種核心組件,一種是訪問JDBC的直接接口,另一種是支持DataStreams.jl的Julia接口。
在使用該包前,需要安裝好對應的JDBC,并配置了正確的路徑,然后需先對JVM進行初始化,如下:
using JDBC
JDBC.usedriver("/home/me/derby/derby.jar") ??# 路徑指向驅動包
JDBC.init()????? # 或JavaCall.init()
需要注意的是,在使用該包后,需要顯式地進行資源釋放:
JDBC.destroy() ???# 或JavaCall.destroy()
另外,在https://github.com/JuliaDatabases中列出了更多關于數據庫操作的Julia包,例如SQLite.jl包、ODBC.jl包、PostgreSQL.jl包、MySQL.jl包等。
Distributions.jl
概率分布在科學計算中常常遇到,無論是樣本分析、概率表達等。包Distributions則在概率分布方面提供了很好的支持。其功能特點有:
- 矩(包括均值、方差、 偏度、峰度等)的計算,還有熵及其他屬性
- 概率密度函數及其對數表達
- 矩生成函數與特征函數
- 樣本采樣或總體采樣
- 最大相似度估計
該包同時還支持多元統計分布、混合模型、假設檢驗及分布擬合等計算。
Distances.jl
這又是一個強大的包,提供了各種相似性度量函數的支持。所謂相似性度量,是在模式識別與機器學習中必然會用到的基礎模塊之一,用于評估兩個特征向量的距離,即相似性程度。采用何種距離函數,不論是在聚類還是在分類中,都是需要認真考慮并慎重選擇的。
該包在相似度計算的實現中,是進行了優化的,相比于粗糙地使用迭代的方式實現距離評估,有著很大的性能優勢。有興趣的,可在官方包中找到對應的Benchmark對比數據。
下面我們列出其支持的所有距離函數,在開發中可自行選擇。關于這些距離函數的具體定義,也請讀者能夠自行找些資料,仔細研究下。
表D-3 Distances支持的距離算法
| 中文名 | 英文名 |
| 歐式距離 | Euclidean Distance |
| 平方歐式距離 | Squared Euclidean Distance |
| 街區距離 | Cityblock Distance |
| 杰卡德距離 | Jaccard Distance |
| Rogers-Tanimoto距離 | Rogers-Tanimoto Distance |
| 切比雪夫距離 | Chebyshev Distance |
| 閔可夫斯基距離 | Minkowski Distance |
| 海明距離 | Hamming Distance |
| 余弦相似度 | Cosine Distance |
| 相關系數 | Correlation distance |
| 卡方距離 | Chi-square distance |
| KL散度 | Kullback-Leibler divergence |
| 標準化KL散度 | Generalized Kullback-Leibler divergence |
| 瑞利散度 | Rényi divergence |
| JS散度 | Jensen-Shannon divergence |
| 馬氏距離 | Mahalanobis distance |
| 平方馬氏距離 | Squared Mahalanobis distance |
| 巴氏距離 | Bhattacharyya distance |
| 黑林格距離 | Hellinger distance |
| 半正矢距離 | Haversine distance |
| 平均絕對偏差 | Mean absolute deviation |
| 均方差 | Mean squared deviation |
| 均方根偏差 | Root mean squared deviation |
| 標準化的均方根偏差 | Normalized root mean squared deviation |
| 布雷柯蒂斯相異度 | Bray-Curtis dissimilarity |
另外,這些相似性度量,在包中的具體實現還會有很多的變體,有著更為豐富的選擇。筆者提醒,在使用這些距離函數時,最好能很清楚這些函數的定義方式,最為重要的一點是,這些距離函數的計算結果,是越大越表示相似,還是越小越表示相似。
TensorFlow.jl
該包是對Google開發的深度學習庫TensorFlow的封裝,只需執行
Pkg.add("TensorFlow")
即可安裝該包。若要在Linux上支持GPU加速,可設置環境變量TF_USE_GPU為1,然后重新編譯,即:
ENV["TF_USE_GPU"] = "1"
Pkg.build("TensorFlow")
該包現已支持的功能有:
- 所有基本的一元及二元數學函數或運算符;
- 最常用的神經網絡操作,包括卷積、GRU版的循環神經網絡及dropout等;
- 神經網絡訓練模塊,例如AdamOptimizer等;
- 基本的圖像加載及縮放操作;
- 控制邏輯操作;
- PyBoard圖可視化。
Mocha.jl
包Mocha是Julia語言實現的深度學習框架,類似于C++中的Caffe庫。Mocha高效地實現了常見的隨機梯度優化和通用層,通過無監督的自編碼器的學習方式,可用于訓練深度神經網絡(Deep Neural Networks,DNN)和卷積神經網絡(Convolutional Neural Networks,CNN)。Mocha的特點有:
- ?模塊化的架構。Mocha有著清晰的組織結構,而且各個組件間是低耦合的(isolated)。這些模塊包括網絡層、激勵函數、優化過程、正則化函數、初始化函數等。內置的組件已足夠用于典型的DNN或CNN應用,而開發者更可在其基礎上進行類型擴展。
- ?高層接口。借助Julia語言強大的表達能力及迅速發展的開源生態,在Mocha中使用DNN等功能會很容易、自然。可通過提供的圖像分類案例進行方便的學習。
- ?可移植及高性能。Mocha因為基于Julia語言,故可運行于任何支持Julia語言的平臺上,而且這種移植性對于開發者來說是透明的。基于Julia語言JIT編譯器與各種內置的性能函數,可以很方便、高效地進行算法的原型設計,并能夠直接獲得性能評估。而且,在C++編譯器可用時,原生擴展后端打開后能夠比純粹的Julia后臺快2到3倍。
Mocha提供的GPU后臺使用的是NVidia?的cuDNN庫,cuBLAS庫及定制的CUDA內核,提供了高性能的計算能力。采用GPU加速后,在現代GPU設備中,特別是在大型模型中,能夠獲得20到30倍的速度提升。
- ?兼容性。借助專用于科學數據存儲的HDF5格式,在Mocha用其存儲數據集及模型的快照,從而能夠很容易地與Matlab、Python(Numpy)及其他已存在的計算庫進行數據交換。Mocha同樣提供了從Caffe中導入訓練模型快照的工具,開發者可以充分利用不同庫的優勢。
- ?可靠性(Correctness)。Mocha中的每個組件都經過了充分的測試,其正確性與可靠性是保證的。
- ?開源開放。Mocha采用的MIT(Expat)許可證,其源代碼是開源的,開發者可以方便地進行學習,并可自行擴展。
若要安裝Mocha庫,只需在Julia的REPL中,運行命令:
Pkg.add("Mocha")
即可。
?
[[1]] 舊版CSV包中使用鍵值參數null指定缺失值的標識字符串,但新版中已棄用,被missingstring代替。
[[2]] 圖片來自https://www.oschina.net/p/echarts
總結
以上是生活随笔為你收集整理的Julia常用包简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python反反爬系列(一)----K近
- 下一篇: ogr2ogr转坐标