请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
搜索

如何系统性地学习NLP 自然言语处理?

安装工具

假如大家曾经安装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]。ipythonjupyter控制台和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 asciidoctorA.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]

假设有一个二维词频(词袋)向量,对应“hack”和“computer”在“Wired Magazine”和“Town and Country”两个杂志的文章中出现的次数。我们希望可以在研讨某些内容时可以查询这些文章,从而找到有关特定主题的一些结果。查询字符串中包含“hacking”和“computers”两个词。对于词“hack”和“computer”,我们的查询字符串词向量是[1, 1],由于这是我们的查询经过分词和词干还原后的结果(见第2章)。

如今来看哪些文章与我们的查询在欧几里得间隔上最接近。欧几里得间隔是图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()。大家能猜出或计算出四维向量所对应的值吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评9

rainwear 2021-5-5 05:57:43 显示全部楼层
分享了
回复

使用道具 举报

杰迷小Q 2021-5-5 06:09:12 显示全部楼层
分享了
回复

使用道具 举报

分享了
回复

使用道具 举报

fay2999 2021-5-5 06:20:28 显示全部楼层
分享了
回复

使用道具 举报

分享了
回复

使用道具 举报

v7270 2021-5-5 06:29:53 显示全部楼层
分享了
回复

使用道具 举报

柠檬番茄小辣椒 2021-5-6 09:33:23 来自手机 显示全部楼层
lz也多多分享一下感受,想换工作了
回复

使用道具 举报

羽吹心月 2021-5-6 15:55:58 来自手机 显示全部楼层
我反手就是一个么么哒,不谢
回复

使用道具 举报

生卋劫 2021-5-7 16:55:52 显示全部楼层
我是个凑数的。。。
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies