在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【Rust AI】01. 使用Jupyter學習Rust

jf_wN0SrCdH ? 來源:Rust語言中文社區 ? 2024-01-14 11:16 ? 次閱讀

簡介

大家(好的,其實是大多數人)都說 Rust 很難,但我不這么認為。雖然 Rust 可能比 Python 稍微難一些,但我們可以像學習 Python 一樣學習 Rust - 通過使用 Jupyter。

在本文中,我將向你展示如何以交互模式編寫 Rust 代碼,特別是在數據科學場景中。

安裝

首先,你需要安裝 Python 開發的交互式筆記本 Jupyter。你可以通過以下方式安裝(我假設你之前已經安裝了 Python):

pipinstalljupyterlab

請記得檢查安裝是否成功,請運行以下命令:

jupyterlab

你將會看到一個 Web 用戶界面,請立即關閉它。之后,我們需要安裝 Evcxr Jupyter Kernel,它是 Jupyter 的 Rust 內核擴展。你可以通過以下方式安裝(我假設你之前已經在計算機上安裝了 Rust):

cargoinstall--lockedevcxr_jupyter
evcxr_jupyter--install

之后,再次啟動 Jupyter UI,你將看到類似于以下內容:

9f5313f8-b21d-11ee-8b88-92fbcf53809c.png

恭喜,我們在啟動器面板上看到了 Rust 的標志。

只需單擊 Notebook 部分下的 Rust 方塊,我們就可以得到:

9f6f6d78-b21d-11ee-8b88-92fbcf53809c.png

一切準備就緒,我們開始吧!

基本操作

為了練習本教程,我建議你具備 Rust 語言的基本背景。讓我們從測試基本變量綁定開始,

9f7d4c18-b21d-11ee-8b88-92fbcf53809c.png

輸出:

9f8b8a30-b21d-11ee-8b88-92fbcf53809c.png

輸出會在 Rust 代碼下一行打印,是的,是交互式的。

讓我們繼續。

9f9214e0-b21d-11ee-8b88-92fbcf53809c.png

看起來一切都很順利。我們現在可以繼續進行更復雜的任務。

我們將利用三個數據科學工具:polars、ndarray 和 plotters,學習如何使用 Rust 進行數據分析。

使用Polars分析數據集

在本教程中,我將選擇泰坦尼克號數據集作為示例,以說明 Rust 的便利性。

根據 Bing 的說法:“泰坦尼克號數據集是用于數據科學和機器學習的流行數據集。它包含有關泰坦尼克號上的乘客的信息,包括年齡、性別、等級、票價以及他們是否在災難中幸存。這個數據集經常用于預測建模練習,例如根據乘客的特征預測乘客是否能夠幸存。這是一個適合數據分析和機器學習初學者的經典數據集,廣泛用于 Kaggle 競賽。”

我們可以從這里(https://huggingface.co/datasets/phihung/titanic下載泰坦尼克號數據集,并將其移動到 dataset/ 子目錄中。

添加依賴:

:depndarray={version="0.15.6"}
:deppolars={version="0.35.4",features=["describe","lazy","ndarray"]}
:depplotters={version="0.3.5",default_features=false,features=["evcxr","all_series","all_elements"]}

顯示依賴:

:show_deps

輸出:

ndarray={version="0.15.6"}
plotters={version="0.3.5",default_features=false,features=["evcxr","all_series","all_elements"]}
polars={version="0.35.4",features=["describe","lazy","ndarray"]}

將數據集讀入 polars 內存:

usepolars::*;
usepolars::DataFrame;
usestd::Path;

fnread_data_frame_from_csv(
csv_file_path:&Path,
)->DataFrame{
CsvReader::from_path(csv_file_path)
.expect("Cannotopenfile.")
.has_header(true)
.finish()
.unwrap()
}

lettitanic_file_path:&Path=Path::new("dataset/titanic.csv");
lettitanic_df:DataFrame=read_data_frame_from_csv(titanic_file_path);

查看數據的形狀:

titanic_df.shape()

輸出:

(891,12)

DataFrame 是 polars 中的基本結構,與 Python Pandas 中的 DataFrame 相同,你可以將其視為具有每列命名標題的二維數據表格。

以下是查看數據集基本統計信息的代碼示例:

titanic_df.describe(None)

輸出:9fa2fc60-b21d-11ee-8b88-92fbcf53809c.png

我們可以看到這個數據集中有一些空單元格。

以下是查看數據集前 5 行的代碼示例:

titanic_df.head(Some(5))

輸出:

9fbad7fe-b21d-11ee-8b88-92fbcf53809c.png

如果你想查看數據集中的列名,請使用 .schema() 方法。以下是代碼示例:

titanic_df.schema()

輸出:

Schema:
name:PassengerId,datatype:Int64
name:Survived,datatype:Int64
name:Pclass,datatype:Int64
name:Name,datatype:String
name:Sex,datatype:String
name:Age,datatype:Float64
name:SibSp,datatype:Int64
name:Parch,datatype:Int64
name:Ticket,datatype:String
name:Fare,datatype:Float64
name:Cabin,datatype:String
name:Embarked,datatype:String

使用以下代碼來查看泰坦尼克號數據集中幸存者:

titanic_df["Survived"].value_counts(true,true)

輸出:

Ok(shape:(2,2)
┌──────────┬───────┐
│Survived┆count│
│---┆---│
│i64┆u32│
╞══════════╪═══════╡
│0┆549│
│1┆342│
└──────────┴───────┘)

查看泰坦尼克號數據集中的性別分布:

titanic_df["Sex"].value_counts(true,true)

輸出:

Ok(shape:(2,2)
┌────────┬────────┐
│Sex┆counts│
│---┆---│
│str┆u32│
╞════════╪════════╡
│male┆577│
│female┆314│
└────────┴────────┘)

你可以在 titanic_df DataFrame 上繼續進行更復雜的 EDA(探索性數據分析)。

使用Plotters對數據可視化

接下來,我們可以使用 plotters crate 來可視化我們的輸出數據。以下是導入 plotters crate 的符號:

useplotters::*;

畫一個柱狀圖:

evcxr_figure((640,480),|root|{
letdrawing_area=root;
drawing_area.fill(&WHITE).unwrap();

letmutchart_context=ChartBuilder::on(&drawing_area)
.caption("TitanicDataset",("Arial",30).into_font())
.x_label_area_size(40)
.y_label_area_size(40)
.build_cartesian_2d((0..1).into_segmented(),0..800)?;

chart_context.configure_mesh()
.x_desc("Survived?")
.y_desc("Number").draw()?;

letdata_s:DataFrame=titanic_df["Survived"].value_counts(true,true).unwrap().select(vec!["counts"]).unwrap();
letmutdata_source=data_s.to_ndarray::(IndexOrder::Fortran).unwrap().into_raw_vec().into_iter();

chart_context.draw_series((0..).zip(data_source).map(|(x,y)|{
letx0=SegmentValue::Exact(x);
letx1=SegmentValue::Exact(x+1);
letmutbar=Rectangle::new([(x0,0),(x1,y)],BLUE.filled());
bar.set_margin(0,0,30,30);
bar
}))
.unwrap();

Ok(())
}).style("width:60%")

顯示:9fcb5fb6-b21d-11ee-8b88-92fbcf53809c.png

這段代碼看起來有些冗長和繁瑣,以后最好在 plotters 中封裝一個簡單的 API 。現在的核心問題是 1. 配置項過多,2. 類型轉換復雜。

Plotters 支持各種圖形、繪圖和圖表,你可以將 plotters 視為 Rust 生態系統中 Python matplotlib 的對應物,但它要趕上 matplotlib 的易用性,還有不小的差距。

有關 plotters 的更多信息,請訪問:https://docs.rs/plotters/latest/plotters/

9fe059f2-b21d-11ee-8b88-92fbcf53809c.png

接下來,我們將介紹矩陣操作庫 ndarray。

使用Ndarray操作矩陣

DataFrame 有一個方法可以將自身轉換為 Ndarray 的多維矩陣。例如:

leta=UInt32Chunked::new("a",&[1,2,3]).into_series();
letb=Float64Chunked::new("b",&[10.,8.,6.]).into_series();

letdf=DataFrame::new(vec![a,b]).unwrap();
letndarray=df.to_ndarray::(IndexOrder::Fortran).unwrap();
println!("{:?}",ndarray);

將輸出:

[[1.0,10.0],
[2.0,8.0],
[3.0,6.0]],shape=[3,2],strides=[1,3],layout=Ff(0xa),constndim=2

我們可以使用 ndarray crate 來進行復雜的矩陣操作。

導入 ndarray crate 的符號:

usendarray::*;

創建一個 2x3 矩陣:

array![[1.,2.,3.],[4.,5.,6.]]

輸出:

[[1.0,2.0,3.0],
[4.0,5.0,6.0]],shape=[2,3],strides=[3,1],layout=Cc(0x5),constndim=2

創建一個范圍:

Array::range(0.,10.,0.5)

輸出:

[0.0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5],shape=[20],strides=[1],layout=CFcf(0xf),constndim=1

創建一個具有指定相等間隔的范圍:

Array::linspace(0.,10.,18)

輸出:

[0.0,0.5882352941176471,1.1764705882352942,1.7647058823529411,2.3529411764705883,2.9411764705882355,3.5294117647058822,4.11764705882353,4.705882352941177,5.294117647058823,5.882352941176471,6.470588235294118,7.0588235294117645,7.647058823529412,8.23529411764706,8.823529411764707,9.411764705882353,10.0],shape=[18],strides=[1],layout=CFcf(0xf),constndim=1

以下是創建一個 3x4x5 矩陣(也稱為機器學習中的“張量”)的代碼示例:

Array::::ones((3,4,5))

輸出:

[[[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0]],

[[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0]],

[[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0],
[1.0,1.0,1.0,1.0,1.0]]],shape=[3,4,5],strides=[20,5,1],layout=Cc(0x5),constndim=3

以下是創建一個零值初始矩陣的代碼示例:

Array::::zeros((3,4,5))

輸出:

[[[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0]],

[[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0]],

[[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0],
[0.0,0.0,0.0,0.0,0.0]]],shape=[3,4,5],strides=[20,5,1],layout=Cc(0x5),constndim=3

對行和列求和

letarr=array![[1.,2.,3.],[4.,5.,6.]];

按行求和

arr.sum_axis(Axis(0))

輸出:

[5.0,7.0,9.0],shape=[3],strides=[1],layout=CFcf(0xf),constndim=1

按列求和:

arr.sum_axis(Axis(1))

輸出:

[6.0,15.0],shape=[2],strides=[1],layout=CFcf(0xf),constndim=1

所有元素求和:

arr.sum()

輸出:

21.0

矩陣轉置:

arr.t()

輸出:

[[1.0,4.0],
[2.0,5.0],
[3.0,6.0]],shape=[3,2],strides=[1,3],layout=Ff(0xa),constndim=2

求點積:

arr.dot(&arr.t())

輸出:

[[14.0,32.0],
[32.0,77.0]],shape=[2,2],strides=[2,1],layout=Cc(0x5),constndim=2

求方根:

arr.mapv(f64::sqrt)

輸出:

[[1.0,1.4142135623730951,1.7320508075688772],
[2.0,2.23606797749979,2.449489742783178]],shape=[2,3],strides=[3,1],layout=Cc(0x5),constndim=2

矩陣操作暫時演示到這里。ndarray 是一個非常強大的工具,你可以使用它來執行與矩陣和線性代數相關的任何任務。

回顧

在本文中,我演示了如何使用 Jupyter 交互式地學習 Rust。Jupyter 是數據科學家(或學生)的超級工具,我們現在可以使用 Rust 在 Jupyter 中完成探索性數據分析任務。Polars、plotters 和 ndarray 是強大的工具集,可以幫助我們處理數據分析和數據預處理工作,這是后續機器學習任務的先決條件。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器學習
    +關注

    關注

    66

    文章

    8420

    瀏覽量

    132685
  • 數據集
    +關注

    關注

    4

    文章

    1208

    瀏覽量

    24713
  • Rust
    +關注

    關注

    1

    文章

    229

    瀏覽量

    6614

原文標題:【Rust AI】01. 使用Jupyter學習Rust

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Rust GUI實踐之Rust-Qt模塊

    Rust-Qt 是 Rust 語言的一個 Qt 綁定庫,它允許 Rust 開發者使用 Qt 框架來創建跨平臺的圖形界面應用程序。Qt 是一個跨平臺的應用程序框架,它提供了一系列的工具和庫,可以幫助
    的頭像 發表于 09-30 16:43 ?1601次閱讀

    Rust語言如何與 InfluxDB 集成

    Rust 是一種系統級編程語言,具有高性能和內存安全性。InfluxDB 是一個開源的時間序列數據庫,用于存儲、查詢和可視化大規模數據集。Rust 語言可以與 InfluxDB 集成,提供高效
    的頭像 發表于 09-30 16:45 ?1175次閱讀

    只會用Python?教你在樹莓派上開始使用Rust

    如果您對編程感興趣,那么您可能聽說過Rust。該語言由Mozilla設計,受到開發人員的廣泛喜愛,并繼續在奉獻者中成長。Raspberry Pi是小型計算機的瑞士軍刀,非常適合學習代碼。我們將兩者
    發表于 05-20 08:00

    怎樣去使用Rust進行嵌入式編程呢

    使用Rust進行嵌入式編程Use Rust for embedded development篇首語:Rust的高性能、可靠性和生產力使其適合于嵌入式系統。在過去的幾年里,Rust在程序
    發表于 12-22 07:20

    如何利用C語言去調用rust靜態庫呢

    新語言的感覺,要做不少的對接工作。也用過Lua,感覺也差不多。評估學習評估Rust語言時,感覺性能和體積應該都不會有太大的問題。加上語言本身主打的安全性,再結合一些庫,用來做一些C語言不擅長的動態操作
    發表于 06-21 10:27

    Rust代碼中加載靜態庫時,出現錯誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    “ [i]malloc ”、“ [i]exit ”。我驗證了使用 ` [i]nm ` 命令。 問題是我打算使用 ffi 在 rust 中使用這個靜態庫。當我嘗試在我的 Rust 代碼中加載靜態庫
    發表于 06-09 08:44

    rust-analyzer Rust編譯器前端實現

    ./oschina_soft/rust-analyzer.zip
    發表于 05-19 09:23 ?2次下載
    <b class='flag-5'>rust</b>-analyzer <b class='flag-5'>Rust</b>編譯器前端實現

    rust-av基于rust的多媒體工具包

    ./oschina_soft/rust-av.zip
    發表于 06-01 11:39 ?1次下載
    <b class='flag-5'>rust</b>-av基于<b class='flag-5'>rust</b>的多媒體工具包

    以調試Rust的方式來學習Rust

    在我上一篇 關于 Rustup 的文章 中,我向你們展示了如何安裝 Rust 工具鏈。但是,如果不能上手操作一下 Rust 的話下載工具鏈又有什么用?學習任何語言都包括閱讀現有的代碼和寫很多的示例程序,這是精通一門語言的好方法。
    的頭像 發表于 01-03 14:56 ?912次閱讀

    Chromium正式開始支持Rust

    泛地在Chromium中使用Rust還需要時間去評估。https://security.googleblog.com/2023/01
    的頭像 發表于 01-14 10:04 ?987次閱讀

    rust語言基礎學習: 智能指針之Cow

    Rust中與借用數據相關的三個trait: Borrow, BorrowMut和ToOwned。理解了這三個trait之后,再學習Rust中能夠實現寫時克隆的智能指針Cow。
    的頭像 發表于 05-22 16:13 ?2933次閱讀

    rust語言基礎學習: rust中的錯誤處理

    錯誤是軟件中不可避免的,所以 Rust 有一些處理出錯情況的特性。在許多情況下,Rust 要求你承認錯誤的可能性,并在你的代碼編譯前采取一些行動。
    的頭像 發表于 05-22 16:28 ?2128次閱讀

    Rust的內部工作原理

    Rust到匯編:了解 Rust 的內部工作原理 非常好的Rust系列文章,通過生成的匯編代碼,讓你了解很多Rust內部的工作機制。例如文章有 Rus
    的頭像 發表于 06-14 10:34 ?806次閱讀
    <b class='flag-5'>Rust</b>的內部工作原理

    谷歌程序員認為學習Rust很easy

    谷歌內部調查顯示,超過 2/3 的受訪者有信心在學習 Rust 時,用兩個月或更短時間內就能為 Rust 代碼庫做出貢獻。此外, 1/3 的受訪者在兩個月或更短的時間內使用 Rust
    的頭像 發表于 07-03 14:56 ?532次閱讀
    谷歌程序員認為<b class='flag-5'>學習</b><b class='flag-5'>Rust</b>很easy

    從Rustup出發看Rust編譯生態

    從Rustup出發看Rust編譯生態 1. Rust和LLVM的關系是怎樣的? 2. Rustup中targets是什么,為什么可以安裝多個? 3. Rust在windows上為什么需要安裝Visual studio?
    的頭像 發表于 01-02 11:00 ?539次閱讀
    主站蜘蛛池模板: 日本不卡一区二区三区在线观看| 99久久国产免费 - 99久久国产免费 | 亚洲jizzjizz在线播放久| 黄网站在线观看| 一区二区三区四区免费视频| 亚洲综合久久综合激情久久| 婷婷六月久久综合丁香一二| 日韩午夜免费| 久优草| 丁香花在线电影小说观看| 2021韩国理论片ok电影天堂| 天天弄| 操碰91| 亚洲视频一| 一级毛片aaa片免费观看| 特黄一级真人毛片| 男人边吃奶边爱边做视频日韩| 黄色美女网址| 午夜视频入口| 国产精品福利一区| 亚洲成av人片在线观看无码| 怡红院网址| 日本色婷婷| 成人网在线看| 久久天天躁狠狠躁夜夜| 91大神精品视频| 一个色中文字幕| 你懂的 在线观看| 综综综综合网| 国产第一页在线观看| 日本不卡视频一区二区三区| 婷婷久久综合九色综合九七| 嫩草影院网站入口| 亚洲网站色| 4hc44四虎www在线影院男同| 午夜视频网址| 色视频免费观看| 国产片翁熄系列乱在线视频| 爽天天天天天天天| 在线精品国产第一页| 五月婷婷六月丁香|