首頁>技術>

安裝工具

如果大家已經安裝nlpia包(https://github.com/totalgood/nlpia),就可以執行本書中的所有示例。我們會保持README檔案中的安裝說明為最新版本。但是,如果你已經安裝了Python 3,而且覺得自己手氣不錯(或者幸運地擁有一個Linux環境)的話,那麼可以嘗試執行:

$ git clone https://github.com/totalgood/nlpia$ pip3 install -e nlpia

如果上面的命令不起作用的話,那麼可能需要在作業系統下安裝一個軟體包管理器和一些二進位制軟體包。我們將用3節分別介紹不同作業系統下的一些具體使用說明:

Ubuntu;Mac;Windows。

在這幾節中會展示作業系統包管理器的安裝方法。一旦安裝了軟體包管理器(或者使用一個像Ubuntu這樣已經安裝包管理器的對開發人員友好的作業系統),就可以安裝Anaconda3。

A.1 Anaconda3

Python 3具有很多高效能和表達能力強的功能,非常適合NLP。在幾乎所有系統上安裝Python 3的最簡單方法是安裝Anaconda3。這樣做的另一個好處是提供了一個包和環境管理器,可以在各種容易出問題的作業系統(如Windows)上安裝很多容易出問題的包(如matplotlib)。

可以執行程式碼清單A-1的程式碼,以程式設計方式安裝最新版本的Anaconda及其conda軟體包管理器。

程式碼清單A-1 安裝Anaconda3

$ OS=MacOSX  # or Linux or Windows$ BITS=_64  # or '' for 32-bit$ curl https://repo.anaconda.com/archive/ > tmp.html$ FILENAME=$(grep -o -E -e "Anaconda3-[.0-9]+-$OS-     x86$BITS\.(sh|exe)" tmp.html | head -n 1)$ curl "https://repo.anaconda.com/archive/$FILENAME" > install_anaconda$ chmod +x install_anaconda$ ./install_anaconda -b -p ~/Anaconda$ export PATH="$HOME/Anaconda/bin:$PATH"$ echo 'export PATH="$HOME/Anaconda/bin:$PATH"' >> ~/.bashrc$ echo 'export PATH="$HOME/Anaconda/bin:$PATH"' >> ~/.bash_profile$ source ~/.bash_profile$ rm install_anaconda

現在就可以建立一個虛擬環境:不是Python virtualenv,而是一個更完整的conda環境,它將所有Python的二進位制依賴項與作業系統Python環境隔離開來。然後,可以在該conda環境中使用程式碼清單A-2安裝NLPIA的依賴項和原始碼。

A.2 安裝nlpia

我們喜歡在使用者目錄$HOME下面的code/子目錄下安裝正在開發的軟體原始碼,但是讀者也可以把它放在任何自己喜歡的地方。如果程式碼清單A-2中的程式碼不起作用,請檢視nlpia的README檔案,以獲取更新的安裝說明。

程式碼清單A-2 使用conda安裝nlpia原始碼

$ mkdir -p ~/code$ cd ~/code$ git clone https://github.com/totalgood/nlpia$ cd ~/code/nlpia$ conda install -y pip  ⇽--- 在根conda環境下為pip安裝最新的conda二進位制檔案$ pip install --upgrade pip  ⇽--- 將pip更新為最新的pypi.python.org版本,這裡終於pip安裝了pip$ conda env create -n nlpiaenv -f conda/environment.yml  ⇽--- 建立一個conda環境,即一個"$HOME/Anaconda3/envs/nlpia"內的目錄及二進位制執行檔案和原始碼之間的依賴關係$ source activate nlpiaenv  ⇽--- 啟用Python環境$ pip install --upgrade pip  ⇽--- 在nlpiaenv環境下安裝最新的pip$ pip install -e .   ⇽--- 為nlpia建立一個可編輯的原始碼目錄,從而無論何時將編輯結果儲存到磁碟,所有的原始碼及資料變化都會實時線上
A.3 整合開發環境

現在你的機器上有了Python 3和NLPIA,下面只需要一個優秀的文字編輯器來搭建我們的整合開發環境(IDE)。我們不安裝JetBrains提供的像PyCharm這樣的完整系統,而安裝適合小規模團隊開發使用的個人工具(如為單人團隊所用的Sublime Text),後者可以把一件事做得很好。

提示 開發者為開發者開發工具確實存在,特別是當開發團隊是一個人的團隊時更是如此。個人開發者通常會開發出比公司開發者更好的工具,因為個人更願意吸納其使用者的程式碼和建議。由於需要而開發一個工具的個人開發者一般是開發一個針對其工作流進行最佳化的工具。如果他們開發的工具可靠、功能強大且很受歡迎,那麼他們的工作流會非常棒。從另一個角度說,像Jupyter這樣的大型開源專案也很棒。只要它們沒有使用開源專案的商業許可程式碼分支,它們一般就會非常通用並且功能齊全。

幸好,Python IDE所需的工具都是免費的、可擴充套件的,並且是持續維護的,大多數甚至是開源的,所以你可以把它們留作自用。

Sublime Text 3:帶Package Control和Anaconda自動糾錯檢查的文字編輯器。Meld:適用於Mac或其他作業系統的程式碼合併工具。ipython(Jupyter控制檯):用於閱讀→評估→列印→迴圈(開發工作流)。jupyter記事本:用於建立報告、教程和部落格文章,或用於與老闆分享結果。

提示 一些非常高效的開發人員使用Python的REPL工作流[1]。ipython、jupyter控制檯和jupyter記事本等REPL控制檯非常強大,同時它們還有help、?、??和%等神奇的命令,另外它們的屬性、方法、引數、檔案路徑甚至是dict鍵都能借助tab健完成自動補全。在使用Google或Stack Overflow搜尋之前,我們可以嘗試使用像>>> sklearn.linear_model.BayesianRidge??這樣的命令來探索所匯入的Python包對應的程式碼文件和原始碼。Python的REPL甚至允許我們在手指不離開鍵盤的情況下執行shell命令(嘗試 >>> !git pull或>>> !find . -name nlpia),這樣可以最大限度地減少上下文切換並最大限度地提高工作效率。

A.4 Ubuntu包管理器

Linux發行版已經安裝了功能齊全的包管理器。如果使用Anaconda的軟體包管理器conda,那麼就像NLPIA安裝說明中所建議的那樣,可能根本用不著系統自帶的那個包管理器。Ubuntu的包管理器叫作apt。在A.3節中我們已經建議安裝了一些軟體包。幾乎可以肯定,你並不需要所有的這些軟體包,但我們還是提供了一個詳盡的工具程式碼清單,以防你在使用Anaconda安裝軟體時提示缺少二進位制檔案。我們可以從第一行開始向下執行,直到conda能夠安裝Python包為止。具體參見程式碼清單A-3。

程式碼清單A-3 使用apt安裝開發工具

$ sudo apt-get update$ sudo apt install -y build-essential libssl-dev g++ cmake swig git$ sudo apt install -y python2.7-dev python3.5-dev libopenblas-dev libatlasbase-     dev gfortran libgtk-3-dev$ sudo apt install -y openjdk-8-jdk python-dev python-numpy pythonpip     python-virtualenv python-wheel python-nose$ sudo apt install -y python3-dev python3-wheel python3-numpy pythonscipy     python-dev python-pip python3-six python3-pip$ sudo apt install -y python3-pyaudio python-pyaudio$ sudo apt install -y libcurl3-dev libcupti-dev xauth x11-apps python-qt4$ sudo apt install -y python-opencv-dev libxvidcore-dev libx264-dev libjpeg8-     dev libtiff5-dev libjasper-dev libpng12-dev

提示 如果apt-get update命令失敗並出現關於bazel的錯誤,那麼可能需要新增谷歌的apt倉庫以及用於TensorFlow的構建工具。

A.5 Mac

在安裝與其他開發人員保持一致所需的所有工具之前,需要一個真正的包管理器(不是XCode)。

A.5.1 一個Mac包管理器

Homebrew可能是最受開發人員歡迎的Mac系統命令列包管理器。它易於安裝,並且包含開發人員使用的大部分工具的一鍵安裝包。它相當於Ubuntu的apt包管理器。蘋果公司本可以確保他們的作業系統能夠與apt相容,但他們不希望開發人員繞過他們的XCode和App Store的“渠道”,這顯然是出於商業利益考慮。所以一些勇敢的Ruby開發人員開發了他們自己的包管理器。[2]它幾乎和apt或任何其他作業系統自帶的二進位制包管理器一樣好。具體參見程式碼清單A-4。

程式碼清單A-4 安裝brew

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/     install/master/install)"

系統會要求按回車鍵確認,並輸入root或者sudo密碼。因此,在輸入密碼並且安裝指令碼開始順利執行之前,不要離開去煮咖啡。

A.5.2 一些工具包

brew裝好之後,可能還需要安裝一些好用的Linux工具,如程式碼清單A-5所示。

程式碼清單A-5 安裝開發工具

$ brew install wget htop tree pandoc asciidoctor
A.5.3 準備工作

如果你對NLP和軟體開發非常認真,那麼需要確保作業系統準備妥當以便能夠勝任工作。下面是我們在Mac上建立新的使用者賬戶時安裝的內容。

Snappy:用於螢幕截圖。CopyClip:用於管理剪貼簿。

如果想與其他NLP開發者分享螢幕截圖,就需要一個螢幕截圖軟體,如Snappy。而剪貼簿管理器(如CopyClip)則允許你一次複製和貼上多項內容,並在不重啟系統的情況下保留剪貼簿歷史記錄。剪貼簿管理器提供在圖形使用者介面執行復制和貼上操作時搜尋控制檯歷史([ctrl] - [R])的強大功能。

同時我們還應該增加bash shell的歷史記錄,新增一些更安全的rm -f別名,設定預設編輯器,建立彩色提示符文字,以及為瀏覽器、文字編輯器和程式碼合併工具新增open命令,具體如程式碼清單A-6所示。

程式碼清單A-6 bash_profile指令碼

#!/usr/bin/env bashecho "Running customized ~/.bash_profile script: '$0' ......."export HISTFILESIZE=10000000export HISTSIZE=10000000#  append the history file after each sessionshopt -s histappend#  allow failed commands to be re-edited with Ctrl-Rshopt -s histreedit#  command substitions are first presented to user before executionshopt -s histverify# store multiline commands in a single history entryshopt -s cmdhist# check the window size after each command and, if necessary, update the valu     es of LINES and COLUMNSshopt -s checkwinsize# grep results are colorizedexport GREP_OPTIONS='--color=always'# grep matches are bold purple (magenta)export GREP_COLOR='1;35;40'# record everything you ever do at the shell in a file that won't be unintent     ionally cleared or truncated by the OSexport PROMPT_COMMAND='echo "# cd $PWD" >> ~/     .bash_history_forever; '$PROMPT_COMMANDexport PROMPT_COMMAND="history -a; history -c; history -r; history 1 >> ~/     .bash_history_forever; $PROMPT_COMMAND"# so it doesn't get changed againreadonly PROMPT_COMMAND# USAGE: subl http://******.com # opens in a new tabif [ ! -f /usr/local/bin/firefox ]; then    ln -s /Applications/Firefox.app/Contents/MacOS/firefox /usr/local/bin/     firefoxfialias firefox='open -a Firefox'# USAGE: subl file.pyif [ ! -f /usr/local/bin/subl ]; then    ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /     usr/local/bin/sublfi# USAGE: meld file1 file2 file3if [ ! -f /usr/local/bin/meld ]; then    ln -s /Applications/Meld.app/Contents/MacOS/Meld /usr/local/bin/meldfiexport VISUAL='subl -w'export EDITOR="$VISUAL"# you can use -     f to override these interactive nags for destructive disk writesalias rm="rm -i"alias mv="mv -i"alias ..="cd .."alias ...="cd ../.."

可以使用GitHubGist搜尋功能找到其他bash_profile指令碼。

A.6 Windows

用於包管理的命令列工具(如Windows上的cygwin)並不是那麼好。但如果在Windows機器上安裝了GitGUI,那麼會得到一個bash提示符和一個能執行Python REPL控制檯的可用終端工具。

(1)下載並安裝git安裝程式。

(2)下載並安裝GitHub Desktop。

git安裝程式附帶了一個版本的bash shell,應該可以在Windows中很好地工作,但它安裝的git-gui對使用者不是十分友好,特別是對於初學者更是如此。除非在命令列(Windows下的bash shell)裡使用git,否則在Windows下所有git的push/pull/merge需求都應透過GitHub Desktop來完成。在本書的整個編輯過程中,我們遇到了一些問題:當出現版本衝突時,git-gui會執行一些無法預料的操作,這些操作覆蓋了其他人提交的內容,即使在不涉及衝突的檔案中也是如此。這就是我們建議在原始git和git-bash之上安裝GitHub Desktop的原因。GitHub Desktop提供了對使用者更加友好的git體驗,讓你知道什麼時候需要pull或push或merge更改結果。[3]

一旦在Windows終端上運行了一個shell,就可以像我們在其他部分一樣使用github倉庫README中的說明,安裝Anaconda並使用conda包管理器來安裝nlpia包。

虛擬化

如果對Windows感到不滿意,可以安裝VirtualBox或者Docker,然後用Ubuntu作業系統建立一個虛擬機器。這個主題需要用整本書(或至少一章)來介紹,在這個領域有比我們做得更好的人:

Jason Brownlee;Jeroen Janssens;Vik Paruchuri;Jamie Hall。

在Windows世界中使用Linux的另一種方法是使用微軟的Ubuntu shell應用程式。我沒有用過,所以我無法保證它與你要安裝的Python包的相容性。如果你嘗試使用,請在nlpia倉庫中與我們分享你的知識,並在文件上發起一個新功能(feature)或拉取(pull)請求。Manning出版社網站上的本書論壇也是你分享知識和獲取幫助的好地方。

A.7 NLPIA自動化

幸運的是,nlpia有一些自動環境配置程式,可以下載NLTK、Spacy、Word2vec模型以及本書所需的資料。只要呼叫的nlpia包裝器函式(如segment_sentences())需要任何上述的資料集或模型,就會觸發這些下載程式。但是,該軟體還在開發中,並不斷由像各位一樣的讀者進行維護和擴充套件。因此,當nlpia的自動化失敗時,你可能想知道如何手動安裝這些軟體包並下載所需的資料,從而使它們能夠正常工作。你也可能只對那些用於句子解析和詞性標註的資料集感到好奇。因此,如果要自定義環境,後續的附錄將展示如何安裝和配置功能齊全的NLP開發環境所需的各個元件。

如上工作準備好可以來閱讀《自然語言處理實戰》這本書了,先來看一下這本的學習路線

說的是哪一本書?

自然語言處理實戰 利用Python理解、分析和生成文字

你需要準備的數學知識:向量和矩陣(線性代數基礎)

量和數字是計算機思考的語言。位是計算機處理的最基本的“數字”,有點兒像人類思考的語言,字母(字元)是詞中最基本、不可切分的部分。所有數學運算都可以簡化為位序列上的若干邏輯運算。當我們以類似的方式閱讀時,人腦也是在處理字元序列。因此,如果想要教會計算機理解我們的詞,那麼第一個挑戰就是提出計算機可用的,用於表示字元、詞、句子和中間概念的向量,從而實現看似智慧的行為。

向量

向量是一個有序的數字序列,沒有任何“跳躍”。在scikit-learn和numpy中,向量是一個稠密的陣列(array),它的使用方式很像Python的數字列表(list)。我們使用numpy陣列而不是Python列表的主要原因是前者的速度快很多(是後者的100倍),並且記憶體佔用更少(只有後者的1/4)。另外,我們可以使用向量運算,例如,可以將整個陣列乘以一個值,而無須使用for迴圈遍歷每個值。當有大量文字包含基於向量和數字表示的大量資訊時,這一點非常重要。建立向量過程如程式碼清單C-1所示。

程式碼清單C-1 建立向量

>>> import numpy as np>>> np.array(range(4))array([0, 1, 2, 3])>>> np.arange(4)array([0, 1, 2, 3])>>> x = np.arange(0.5, 4, 1)>>> xarray([ 0.5, 1.5, 2.5, 3.5])>>> x[1] = 2>>> xarray([ 0.5, 2, 2.5, 3.5])>>> x.shape(4,)>>> x.T.shape(4,)

陣列有一些列表沒有的屬性,例如.shape和.T。.shape屬性包含向量維度的長度或大小(即其包含的物件個數)。當命名陣列和向量(或者只是數字)變數時,我們使用小寫字母,就像正式的數學符號一樣。線上性代數、物理和工程學課本中,這些字母通常用粗體表示,有時在字母上方用箭頭修飾(特別是使用黑板或白板的教授們)。

如果聽說過矩陣,那麼可能知道它可以被看成是一個行向量陣列,如下:

>>> np.array([range(4), range(4)])>>> array([[0, 1, 2, 3],           [0, 1, 2, 3]])>>> X = np.array([range(4), range(4)])>>> X.shape(2, 4)>>> X.T.shape(4, 2)

T屬性返回矩陣的轉置矩陣。矩陣的轉置矩陣是沿著左上角到右下角的假想對角線翻轉後得到的矩陣。所以,給定下面一個矩陣A:

>>> A = np.array([[1, 2, 3], [4, 5, 6]])>>> Aarray([[1, 2, 3],       [4, 5, 6]])

其對應的轉置矩陣是:

>>> A.Tarray([[1, 4],       [2, 5],       [3, 6]])

因此,如果A初始化為行向量的集合,那麼A.T將會把這些行向量轉換為列向量。

距離

兩個向量之間的距離可以透過很多不同的方式來度量。兩個向量的差還是向量,如程式碼清單C-2所示。

程式碼清單C-2 向量的差

>>> Aarray([[1, 2, 3],       [4, 5, 6]])>>> A[0]array([1, 2, 3])>>> A[1]array([4, 5, 6])>>> np.diff(A, axis=0)array([[3, 3, 3]]>>> A[1] - A[0]array([3, 3, 3])

[3, 3, 3]向量確切地給出了兩個向量在每個維度的距離。想象一下,假設上述兩個向量分別代表兩個人所在的曼哈頓街區和樓層:向量的差就是從其中一個位置到另一個位置需要行走的確切方向。如果你在第一街和第二道拐角公寓的3樓,那麼你對應街、道、樓層的座標就是[1, 2, 3],就和上例中一樣。如果你的Python導師在第四街和第五道拐角公寓的6樓,那麼她的座標就是[4, 5, 6]。所以,這兩個向量之間的差值([3, 3, 3])表示你需要向北走3個街區,向東走3個街區,然後向上爬3個樓層到達她的公寓。實際上,向量和數學並不關心像地心引力這種煩人的細節。因此,代數學假設你可以踏著窗戶外面“回到未來”中的懸浮滑板上,在車流上方的3層樓高處快速行駛,然後到達線性代數導師的公寓。

如果你告訴導師她的公寓和你的公寓的距離是[3, 3, 3],她會嘲笑這個愚蠢的精確率。當談論距離時,稍微聰明的人會將上述3個數字簡化成一個數字,即一個標量。所以,如果你說她的位置有6個街區遠,她就會明白你的意思,你忽略了不重要的樓層維度,因為這對你的懸浮滑板(或電梯)而言不值一提。除了忽略某些維度,你還使用了一種有時稱為曼哈頓距離的巧妙的距離度量。後面,我們會展示如何計算300維詞向量之間的曼哈頓距離,就像計算二維公寓位置向量一樣容易。

1.歐幾里得距離

當提到“像烏鴉飛行一樣”時,我們說的就是二維向量的歐幾里得距離(即歐式距離)。它是由向量定義的空間中兩個點之間的直線距離(即向量的“尾部”或“頭部”之間的長度)。

歐幾里得距離也稱為L2範數,因為它是兩個向量差的長度。L2中的“L”代表長度。L2中的“2”表示在對這些值求和之前(且在求和的平方根之前)向量差的各個維度對應的指數(平方)。

歐幾里得距離也稱為RSS距離,其表示距離或差值平方和的平方根,即:

euclidean_distance = np.sqrt(((vector1 - vector2) ** 2).sum())

下面我們看一下在Patrick Winston的AI系列講座中提到的一個NLP示例中的一些向量之間的歐幾里得距離。[1]

現在來看哪些文章與我們的查詢在歐幾里得距離上最接近。歐幾里得距離是圖C-1中4條線的長度。它們看起來非常接近,是不是?為了讓搜尋引擎針對此查詢返回一些有用的文章,我們該如何解決這個問題?

圖C-1 歐幾里得距離的計算

我們可以計算詞數相對於文件中詞總數的比率,並基於該比率計算歐幾里得距離。但是在第3章中我們已經學了更好的計算該比率的方法——TF-IDF。TF-IDF向量之間的歐幾里得距離傾向於成為文件距離(逆相似性)的良好衡量標準。

如果要使用限定的歐幾里得距離,我們可以將所有向量歸一化為單位長度(每個向量長度為1)。這將確保所有向量之間的距離都在0到2之間。

2.餘弦距離

另一種對距離計算的調整使我們的距離值更加有用。餘弦距離餘弦相似度的取反結果(cosine_distance = 1 - cosine_similarity)。餘弦相似度是兩個向量之間夾角的餘弦。因此,在上例中,查詢字串的TF向量與“Wired Magazine”文章的向量之間的夾角遠小於該查詢與“Town and Country”文章之間的夾角。這正是我們想要的結果。因為查詢“hacking computers”應該為我們返回“Wired Magazine”雜誌的文章,而不是關於騎馬(“hacking”)[2]、打獵、晚宴和鄉村風格的室內設計等娛樂活動的文章。

該距離可以透過計算兩個歸一化向量的點積來進行有效計算,歸一化向量即每個向量均除以自己的長度,如程式碼清單C-3所示。

程式碼清單C-3 餘弦距離

>>> import numpy as np>>> vector_query = np.array([1, 1])>>> vector_tc = np.array([1, 0])>>> vector_wired = np.array([5, 6])>>> normalized_query = vector_query / np.linalg.norm(vector_query)>>> normalized_tc = vector_tc / np.linalg.norm(vector_tc)>>> normalized_wired = vector_wired / np.linalg.norm(vector_wired)>>> normalized_queryarray([ 0.70710678,  0.70710678])>>> normalized_tcarray([ 1.,  0.])>>> normalized_wiredarray([ 0.6401844 ,  0.76822128])

我們的查詢TF向量與其他兩個TF向量之間的餘弦相似度(向量之間夾角的餘弦)分別為:

>>> np.dot(normalized_query, normalized_tc) # cosine similarity0.70710678118654746>>> np.dot(normalized_query, normalized_wired) # cosine similarity0.99589320646770374

我們的查詢與這兩個TF向量之間的餘弦距離是1減去餘弦相似度,即:

>>> 1 - np.dot(normalized_query, normalized_tc)  # cosine distance0.29289321881345254>>> 1 - np.dot(normalized_query, normalized_wired)  # cosine distance0.0041067935322962601

下面給出了餘弦相似性用於計算NLP中TF向量相似度的原因:

計算簡單(只需乘法和加法);有一個方便的取值範圍(−1到+1);其取反(餘弦距離)易於計算(1 − 餘弦相似度);其取反(餘弦距離)有界(0到+2)。

然而,與歐幾里得距離相比,餘弦距離有一個缺點:它不是真正的距離度量,因為此時三角形不等式並不成立。[3]這意味著如果“red”詞向量與“car”詞向量的餘弦距離為0.5,與“apple”詞向量的餘弦距離為0.3,則“apple”和“car”的距離可能遠遠超過0.8。當想用餘弦距離來證明向量的一些性質時,三角不等式是很重要的。當然,在實際的NLP問題中很少會出現這種情況。

3.曼哈頓距離

曼哈頓距離也稱為計程車距離或L1範數。之所以稱為計程車距離,因為如果這些向量的座標與街道網格對齊並且它們都是二維向量的話,那麼該距離表示出租車從一個向量到達另一個向量需要行駛的距離。[4]這個距離也稱為L1範數。

曼哈頓距離計算起來非常簡單:計算所有維度的絕對距離的和。使用我們前面虛構的雜誌向量,曼哈頓距離將是:

>>> vector_tc = np.array([1, 0])>>> vector_wired = np.array([5, 6])>>> np.abs(vector_tc - vector_wired).sum()10

如果在計算曼哈頓距離之前對向量進行了歸一化,則計算的距離會有很大差異:

>>> normalized_tc = vector_tc / np.linalg.norm(vector_tc)>>> normalized_wired = vector_wired / np.linalg.norm(vector_wired)>>> np.abs(normalized_tc - normalized_wired).sum()1.128...

我們可能希望這個距離度量限定在一定的範圍內,如0~2,但它並不會如此。與歐幾里得距離一樣,曼哈頓距離是一個真實度量,因此它遵從三角不等式,並且可以用於依賴真實距離度量的數學證明中。但是與歸一化向量的歐幾里得距離不同,我們不能指望歸一化向量之間的曼哈頓距離保持在一個理想的範圍內,如0~2。即使已經把向量全部歸一化為長度為1的向量,曼哈頓距離的最大長度也會隨著維數的增加而增長。對於歸一化的二維向量,任意兩個向量之間的最大曼哈頓距離約為2.82()。對於三維向量,這個值約為3.46()。大家能猜出或計算出四維向量所對應的值嗎?

22
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Java學習第三天:資料型別與變數(一)