数据之形-全-
数据之形(全)
原文:
zh.annas-archive.org/md5/60ef8636ae2c6aa8b7637efb8aed193d译者:飞龙
第一章:参考文献
第一章
Ahmed, Zo, Bertie Vidgen 和 Scott A. Hale。“解决自动在线仇恨检测中的种族偏见:朝着公平和准确的仇恨用户检测迈进,采用几何深度学习。”EPJ 数据科学 11, no. 1 (2022): 8。
Alloghani, Mohamed 等人。“关于数据科学中有监督与无监督机器学习算法的系统评价。”数据科学中的有监督与无监督学习 (2020): 3–21。
Draper, Norman R. 和 Harry Smith。“‘虚拟’变量。”应用回归分析 (1998): 299–325。
Feuerriegel, Stefan, Mateusz Dolata 和 Gerhard Schwabe。“公平的人工智能。”商业与信息系统工程 62, no. 4 (2020): 379–384。
Hridayami, Praba, I. Ketut Gede Darma Putra 和 Kadek Suar Wibawa。“使用 VGG16 深度卷积神经网络进行鱼类物种识别。”计算机科学与工程杂志 13, no. 3 (2019): 124–130。
Khattak, Faiza Khan 等人。“临床文本中词嵌入的调查。”生物医学信息学杂志 100 (2019): 100057。
Köppen, Mario。“维度灾难。”见于第五届在线工业应用软计算世界大会(WSC5)论文集,4–8. 第 1 卷. 世界软计算联合会,2000。
LeCun, Yann, Yoshua Bengio 和 Geoffrey Hinton。“深度学习。”自然 521, no. 7553 (2015): 436–444。
Mitchell, J. Clyde。“社会网络。”人类学年鉴 3 (1974): 279–299。
Nelder, John Ashworth 和 Robert W.M. Wedderburn。“广义线性模型。”皇家统计学会学报:A 类(综合)》 135, no. 3 (1972): 370–384。
Orimoloye, Israel R. 等人。“湿地动态的地理空间分析:南非伊西曼加利索湿地的湿地枯竭与生物多样性保护。”沙特国王大学科学杂志 32, no. 1 (2020): 90–96。
Patrick, Edward A. 和 Frederic P. Fischer III。“一种广义的 k-最近邻规则。”信息与控制 16, no. 2 (1970): 128–152。
Rao, J. 等人。“弥合相关性匹配与语义匹配之间的差距,用于短文本相似性建模。”见于2019 年自然语言处理经验方法会议与第 9 届国际联合自然语言处理会议论文集(EMNLP-IJCNLP),由 Sebastian Padó 和 Ruihong Huang 编辑,5370–5381. 斯特劳茨堡,PA: 计算语言学协会,2019。
Tumer, Kagan 和 Joydeep Ghosh。“线性组合神经分类器的决策边界分析。”模式识别 29, no. 2 (1996): 341–348。
van der Aalst, Wil M.P. 等人。“过程挖掘:一种平衡欠拟合与过拟合的两步方法。”软件与系统建模 9, no. 1 (2010): 87–111。
Wang, Juanjuan 等人。“使用 SMOTE 算法和局部线性嵌入对不平衡数据进行分类。”见于2006 年第 8 届信号处理国际会议。第 3 卷. 纽约:电气与电子工程师协会,2006。
第二章
Barabási, Albert-László和 Réka Albert。“随机网络中的尺度出现。”科学 286 卷,第 5439 期(1999 年):509–512。
Csardi, G.和 Nepusz, T.(2006 年)。“用于复杂网络研究的 igraph 软件包。”InterJournal,复杂系统,第 1695 号(2006 年):1–9。
Erdős, Paul 和 Alfréd Rényi。“随机图演化。”匈牙利科学院数学研究所出版物 5 卷,第 1 期(1960 年):17–60。
Estrada, Ernesto,Franck Kalala-Mutombo 和 Alba Valverde-Colmeiro。“非随机长程相互作用网络中的流行病传播。”物理评论 E 84 卷,第 3 期(2011 年):036110。
Fiedler, Miroslav。“图的代数连通性。”捷克斯洛伐克数学杂志 23 卷,第 2 期(1973 年):298–305。
Fountsop, Arnauld Nzegha,Jean Louis Ebongue Kedieng Fendji 和 Marcellin Atemkeng。“农业植物的深度学习模型压缩。”应用科学 10 卷,第 19 期(2020 年):6866。
Giansiracusa, Noah 和 Cameron Ricciardi。“法庭中的几何学。”美国数学月刊 125 卷,第 10 期(2018 年):867–877。
Jalili, Mahdi 和 Xinghuo Yu。“通过添加高效的跨社区链接增强具有社区结构的网络的同步性。”IEEE 网络科学与工程交易 3 卷,第 2 期(2016 年):106–116。
Leonard, Rosemary,Debbie Horsfall 和 Kerrie Noonan。“利用社交网络分析识别临终关怀者支持网络的变化。”BMJ 支持与姑息护理 5 卷,第 2 期(2015 年):153–159。
Li, Lun 等人。“走向无标度图的理论:定义、性质和影响。”互联网数学 2 卷,第 4 期(2005 年):431–523。
Lou, Tiancheng 等人。“学习预测社交网络中的互惠和三角闭合。”ACM 数据发现知识交易(TKDD) 7 卷,第 2 期(2013 年):1–25。
Moore, Christine,John Grewar 和 Graeme S. Cumming。“量化网络弹性:主要干扰前后的比较显示网络指标的优势和局限性。”应用生态学杂志 53 卷,第 3 期(2016 年):636–645。
Page, Lawrence 等人。PageRank 引用排名:为网络带来秩序。技术报告。斯坦福信息实验室,1999 年。
Saucan, Emil 等人。“离散曲率和网络分析。”MATCH 数学与计算化学通讯 80 卷,第 3 期(2018 年)。
Seshadhri, Comandur,Tamara G. Kolda 和 Ali Pinar。“Erdős-Rényi 图的社区结构和无标度集合。”物理评论 E 85 卷,第 5 期(2012 年):056109。
Sparrow, Malcolm K。“将网络分析应用于刑事情报:前景评估。”社会网络 13 卷,第 3 期(1991 年):251–274。
Struweg, Ilse。“Twitter 社交网络分析:南非医疗保险法案案例。”在电子商务、电子服务和电子社会会议中,120–132 页。瑞士,洛桑:斯普林格,洛桑,2020 年。
Valente, Thomas W.。"创新扩散中的社交网络阈值。" 社交网络 18 卷,第 1 期(1996 年):69-89。
Wasserman, Stanley 和 Katherine Faust。社会网络分析:方法与应用。 剑桥:剑桥大学出版社,1994 年。
Watts, Duncan J.和 Steven H. Strogatz。"‘小世界’网络的集体动力学。" 自然 393 卷,第 6684 期(1998 年):440-442。
Weber, Melanie,Emil Saucan 和 Jürgen Jost。"用 Forman-Ricci 曲率和相关几何流特征化复杂网络。" 复杂网络杂志 5 卷,第 4 期(2017 年):527-550。
第三章
Abueldahab, Sheima M.E.和 Franck Kalala Mutombo。"SIR 模型和喀土穆的 HIV/AIDS。" 开放获取图书馆杂志 8 卷,第 4 期(2021 年):1-10。
Al Hasan, Mohammad 等人。"使用监督学习进行链接预测。" SDM06:链接分析、反恐和安全研讨会 30 页(2006 年):798-805。
de Souza, Danillo Barros 等人。"使用离散 Ricci 曲率推断 COVID-19 流行病网络脆弱性和系统风险。" 统计力学杂志:理论与实验 2021 年,第 5 期(2021 年):053501。
Emmons, Scott 等人。"在规模上分析网络聚类算法和聚类质量度量。" PLOS One 11 卷,第 7 期(2016 年):e0159161。
Estrada, Ernesto,Franck Kalala-Mutombo 和 Alba Valverde-Colmeiro。"非随机长程相互作用网络中的流行病传播。" 物理评论 E 84 卷,第 3 期(2011 年):036110。
Jamal, Wasifa 等人。"使用从同步态中提取的脑连接度量进行自闭症谱系障碍分类的监督学习。" 神经工程杂志 11 卷,第 4 期(2014 年):046019。
Kunegis, Jérôme。"Konect:科布伦茨网络收集。" 在第 22 届万维网国际会议论文集中,1343-1350 页。纽约:计算机协会,2013 年 5 月。
Lichtenwalter, Ryan N.,Jake T. Lussier 和 Nitesh V. Chawla。"链接预测中的新视角和方法。" 在第 16 届 ACM SIGKDD 国际知识发现与数据挖掘会议论文集中,243-252 页。纽约:计算机协会,2010 年 7 月。
Liu, Renming 等人。"监督学习是一种准确的基于网络的基因分类方法。" 生物信息学 36 卷,第 11 期(2020 年):3457-3465。
Reichardt, Jörg 和 Stefan Bornholdt。"社区检测的统计力学。" 物理评论 E 74 卷,第 1 期(2006 年):016110。
Sanchez-Oro, Jesus 和 Abraham Duarte。"社交网络中进行社区检测的迭代贪婪算法。" 未来一代计算机系统 88(2018 年):785-791。
Sieranoja, Sami 和 Pasi Fränti。"将 k 均值算法调整为图聚类。" 知识与信息系统 64 卷,第 1 期(2022 年):115-142。
Souabi, Sonia 等. “基于社区检测和事件相关性的社会学习网络推荐方法。” 见 欧洲、中东和北非信息系统与技术支持学习国际会议,65–74。瑞士、沙姆:Springer,2019。
Yang, Zhao, René Algesheimer 和 Claudio J. Tessone. “人工网络中社区检测算法的比较分析。” 科学报告 6, 第 1 期(2016):1–18。
第四章
Akkoyunlu, Eralp Abdurrahim. “大图的最大团体枚举。” SIAM 计算期刊 2, 第 1 期(1973):1–6。
Dika, Sandra L. 和 Kusum Singh. “社会资本在教育文献中的应用:一项批判性综合。” 教育研究评论 72, 第 1 期(2002):31–60。
Edelsbrunner, Herbert 和 Dmitriy Morozov. “持久同调:理论与实践。” 见 2012 年欧洲数学大会,克拉科夫,7 月 2–7 日,31–50。芬兰赫尔辛基:EMS 出版社,2014。
Ghrist, Robert. “条形码:数据的持久拓扑。” 美国数学会公报 45, 第 1 期(2008):61–75。
Hauser, Christoph, Gottfried Tappeiner, 和 Janette Walde. “学习区域:社会资本和弱联系对创新的影响。” 区域研究 41, 第 1 期(2007):75–88。
Jonsson, Jakob. 图的单纯复形。斯德哥尔摩:皇家技术学院,2005。
Knill, Oliver. “关于随机图的维度和欧拉特征。” arXiv 预印本 arXiv:1112.5749(2011)。
Lee, Hyekyoung 等. “大脑网络的判别性持久同调。” 见 2011 年 IEEE 国际生物医学影像学会议:从纳米到宏观,841–844。纽约:电气和电子工程师学会,2011。
Lee, Hyekyoung 等. “通过图过滤和 Gromov-Hausdorff 度量计算大脑网络的形状。” 见 医学影像计算与计算机辅助干预国际会议,302–309。德国柏林、海德堡:Springer,2011。
Lee, Hyekyoung 等. “通过网络过滤建模加权功能性大脑网络。” 见 NIPS 代数拓扑与机器学习研讨会。第 3 卷。圣地亚哥:神经信息处理系统,2012。
Lütgehetmann, Daniel 等. “计算有向旗帜复形的持久同调。” 算法 13, 第 1 期(2020):19。
Nziku, Dina Modestus 和 John Joseph Struthers. “非洲女性创业:弱联系在缓解委托人—代理人问题中的作用。” 小企业与企业发展期刊 25, 第 3 期(2018):349–367。
Weber, Melanie, Emil Saucan 和 Jürgen Jost. “一个网络的形状能看出来吗?” arXiv 预印本 arXiv:1608.07838(2016)。
Zomorodian, Afra 和 Gunnar Carlsson. “计算持久同调。” 见 第二十届计算几何年会论文集,347–356。纽约:计算机协会,2004。
第五章
Alt, Helmut 和 Michael Godau。“计算两个多边形曲线之间的弗雷歇距离。”计算几何与应用国际期刊 5 卷 1 期第二部分(1995 年):75–91。
Anowar, Farzana,Samira Sadaoui 和 Bassant Selim。“降维算法的概念和实证比较(PCA,KPCA,LDA,MDS,SVD,LLE,ISOMAP,LE,ICA,t-SNE)。”计算机科学评论 40 卷(2021 年):100378。
Arowolo, Micheal Olaolu 等人。“使用 KNN 分类器的优化混合调查型降维方法用于疟疾媒介。”大数据杂志 8 卷 1 期(2021 年):1–14。
Balasubramanian, Mukund 和 Eric L. Schwartz。“Isomap 算法和拓扑稳定性。”科学 295 卷 5552 期(2002 年):7。
De Maesschalck, Roy,Delphine Jouan-Rimbaud 和 Désiré L. Massart。“马哈拉诺比斯距离。”化学计量学和智能实验室系统 50 卷 1 期(2000 年):1–18。
Diedrich, Holger 和 Markus Abel。lle(版本 1.1)。软件包。2012 年 3 月 21 日。cran.nexr.com/web/packages/lle/index.html。
Drost, Hajk-Georg。“Philentropy:信息理论和 R 中的距离量化。”开源软件杂志 3 卷 26 期(2018 年):765。
Faisal, M.和 E.M. Zamzami。“使用欧几里德距离,坎贝拉距离和曼哈顿距离比较质心 K 均值性能的分析。”物理学会议系列杂志 1566 卷 1 期(2020 年):012112。
Ghorbani, Hamid。“马哈拉诺比斯距离及其在检测多变量异常值中的应用。”大学系列数学与信息学 34 卷 3 期(2019 年):583–595。
Gower, John Clifford。“欧几里德距离矩阵和非欧几里德距离矩阵的性质。”线性代数及其应用 67 卷(1985 年):81–97。
Higuchi, Tomoyuki。“基于分形理论的不规则时间序列的方法。”物理学 D:非线性现象 31 卷 2 期(1988 年):277–283。
Huttenlocher, Daniel P.,Gregory A. Klanderman 和 William J. Rucklidge。“使用 Hausdorff 距离比较图像。”IEEE 模式分析与机器智能交易 15 卷 9 期(1993 年):850–863。
Jongbo, Olayinka Ayodele 等人。“慢性肾病诊断的集成方法的发展。”科学非洲 8 卷(2020 年):e00456。
Kraemer, Guido 和 Maintainer Guido Kraemer。dimred(版本 0.2.6)。软件包。2022 年 7 月 11 日。cran.r-project.org/web/packages/dimRed。
Liebscher, Volkmar。“Gromov 遇见系统发育学——树空间上生物可计算度量的新动物。”arXiv 预印本 arXiv:1504.05795(2015 年)。
Mautner, F.I。“对称黎曼空间上的测地线流。”数学年刊(1957 年):416–431。
Mémoli, Facundo。“欧几里德空间中的 Gromov-Hausdorff 距离。”在2008 年 IEEE 计算机学会计算机视觉和模式识别研讨会中,1–8。纽约:电气和电子工程师学会,2008 年。
Mohibullah, Md, Md Zakir Hossain, and Mahmudul Hasan. “使用 k-medoids 比较欧几里德距离函数和曼哈顿距离函数。” 国际计算机科学与信息安全杂志 13, no. 10 (2015): 61.
Mori, Usue, 等人. TSdist (版本 3.7.1). 软件包. 2022 年 8 月 31 日。cran.r-project.org/web/packages/TSdist.
Oksanen, Jari, 等人. vegan:社区生态学软件包(版本 2.6-4)。2022 年 10 月 11 日。cran.r-project.org/web/packages/vegan.
Rényi, Alfréd. “关于概率分布的维度和熵。” 匈牙利科学院数学学报 10, no. 1 (1959): 193–215.
Ringnér, Markus. “主成分分析是什么?。” 自然生物技术 26, no. 3 (2008): 303–304.
Rodrigues, Érick O. “结合闵可夫斯基和切比雪夫:新的距离提议和使用k最近邻分类器的距离度量调查。” 模式识别信件 110 (2018): 66–71.
Roweis, Sam T., 和 Lawrence K. Saul. “通过局部线性嵌入进行非线性降维。” 科学 290, no. 5500 (2000): 2323–2326.
Sevcikova, Hana, 等人. fractaldim (版本 0.8-5). 软件包。2021 年 10 月 7 日。cran.r-project.org/web/packages/fractaldim.
Theiler, James. “估计分形维度。” 美国光学学会杂志 A 7, no. 6 (1990): 1055–1073.
Torgerson, Warren S. “多维缩放:I. 理论和方法。” 心理测量学 17, no. 4 (1952): 401–419.
Vallender, S.S. “计算线上概率分布之间的 Wasserstein 距离。” 概率论及其应用理论 18, no. 4 (1974): 784–786.
Van der Maaten, Laurens, 和 Geoffrey Hinton. “使用 t-SNE 可视化数据。” 机器学习研究杂志 9, no. 11 (2008).
Wei, Boxian, 等人. knnGarden (版本 1.0.1). 软件包. 2012 年 7 月 13 日。cran.microsoft.com/snapshot/2019-03-14/web/packages/knnGarden.
Wolpert, Scott A. “测地线长度函数和 Nielsen 问题。” 微分几何杂志 25, no. 2 (1987): 275–296.
第六章
Augugliaro, Luigi, Angelo Mineo, 和 Ernst C. Wit. “dglars:用于估计稀疏广义线性模型的 R 软件包。” 统计软件杂志 59 (2014): 1–40.
Augugliaro, Luigi, Angelo Mineo, 和 Ernst C. Wit. “通过循环坐标下降方法进行差分几何 LARS。” 在 计算统计国际会议(COMPSTAT 2012) 中,67–79。荷兰海牙:国际统计学会/国际统计计算协会,2012 年。
Babatunde, Seye, Richard Oloruntoba, 和 Kingsley Agho. “非洲紧急医疗商品: 物流模型回顾, 建议模型, 和研究议程。” 人道物流与供应链管理杂志 (2020).
Desbrun, Mathieu, 等. “离散外微分。” arXiv 预印本 math/0508341 (2005).
Gebhart, T., X. Fu, 和 R.J. Funk. “随波逐流? 使用 Hodge 理论对美国卫生保健交付网络进行大规模分析。” 在 2021 年 IEEE 国际大数据会议 (Big Data), 3812–3823. 纽约: 电气和电子工程师学会, 2021.
Hale, Trevor, 和 Christopher R. Moberg. “提高供应链灾难准备性: 安全场所选址的决策过程。” 国际物流管理杂志 35, no. 3 (2005): 195–207.
Hirani, Anil Nirmal. “离散外微分。” 博士论文, 加州理工学院, 2003.
Ngwenya, Ngonidzahe K., 和 Micheline J.A. Naude. “供应链管理最佳实践: 南部非洲人道援助案例。” 交通与供应链管理杂志 10, no. 1 (2016): 1–9.
Sommese, Andrew J., Jan Verschelde, 和 Charles W. Wampler. “数值代数几何导论。” 在 解决多项式方程 中, 编辑 Manuel Bronstein 等, 301–337. 柏林: Springer, 2005.
Xu, Qianqian, 等. “随机图上的 HodgeRank 用于主观视频质量评估。” IEEE 多媒体交易 14, no. 3 (2012): 844–857.
Yeh, I-Cheng, 和 Che-hui Lien. “数据挖掘技术在信用卡客户违约概率预测准确性方面的比较。” 应用专家系统 36, no. 2 (2009): 2473–2480.
第七章
Edelsbrunner, Herbert, 和 John Harer. “持久同调—一项调查。” 当代数学 453 (2008): 257–282.
Farrelly, Colleen M., 等. “使用分层聚类方法分析桥接构造: 对身份的应用。” 人格研究杂志 70 (2017): 93–106.
Gross, Miraca U.M. 特殊天才儿童. 纽约: Routledge, 2002.
Pearson, P., D. Muellner, 和 G. Singh. “Tdamapper: 使用 mapper 进行拓扑数据分析。” 2015, mran.microsoft.com/snapshot/2016-08-05/web/packages/TDAmapper/README.html.
Singh, Gurjeet, Facundo Mémoli, 和 Gunnar E. Carlsson. “高维数据集和 3D 对象识别的拓扑方法。” PBG@ Eurographics 2 (2007).
Wadhwa, Raoul R., 等. “TDAstats: 用于计算拓扑数据分析中持久同调的 R 管道。” 开源软件杂志 3, no. 28 (2018): 860.
第八章
Alexander, J.C., 和 James A. Yorke. “同伦延续方法: 可数值实现的拓扑程序。” 美国数学学会交易 242 (1978): 271–284.
Fendji, Jean Louis Ebongue Kedieng, 等. “监视任务中大型农场无人机路径规划的充电站成本效益布局。” 对称性 12, no. 10 (2020): 1661。
Hernandez, Emili, Marc Carreras, 和 Pere Ridao. “机器人应用中的同伦路径规划算法比较。” 机器人与自主系统 64 (2015): 44–58。
Lokhorst, Justin, 等. lasso2 (版本 1.2-19). 软件包. 2014 年 5 月 31 日. cran.nexr.com/web/packages/lasso2/index.html。
Tsukurimichi, Toshiaki, 等. “使用分段线性同伦延续的条件选择推断用于稳健回归和异常值检测。” 统计数学学会年刊 (2022): 1–32。
Velez-Lopez, Gerardo C., 等. “一种新型的无碰撞同伦路径规划方法,适用于平面机器人臂。” 传感器 22, no. 11 (2022): 4022。
第九章
Abbott, Jade, 和 Laura Martinus. “南部非洲语言的神经机器翻译基准测试。” 见 2019 年 NLP 拓展研讨会论文集, 98–101. 斯特劳兹堡, PA: 计算语言学会, 2019。
Adelani, David Ifeoluwa, 等. “MasakhaNER:面向非洲语言的命名实体识别。” 计算语言学会会刊 9 (2021): 1116–1131。
Agirrezabal, Manex, Inaki Alegria, 和 Mans Hulden. “英语诗歌的韵律分析中的机器学习。” 见 COLING 2016,第 26 届国际计算语言学大会技术论文集, 772–781. 斯特劳兹堡, PA: 计算语言学会, 2016。
Beyers, Chris. 自由诗史. 费耶特维尔: 阿肯色大学出版社, 2001。
Bird, Steven. “NLTK:自然语言工具包。” 见 COLING/ACL 2006 互动展示会论文集, 69–72. 斯特劳兹堡, PA: 计算语言学会, 2006。
Devine, Peter, Yun Sing Koh, 和 Kelly Blincoe. “在软件用户反馈中评估无监督文本嵌入。” 见 2021 年 IEEE 第 29 届国际需求工程会议工作坊(REW), 87–95. 纽约: 电气与电子工程师协会, 2021。
Devlin, Jacob, 等. “Bert:深度双向变换器的预训练用于语言理解。” arXiv 预印本 arXiv:1810.04805 (2018)。
Eiselen, Roald, 和 Martin Puttkammer. “为十种南非语言开发文本资源。” 见 第九届国际语言资源与评估会议(LREC'14)论文集, 3698–3703. 卢森堡: 欧洲语言资源协会, 2014。
Jivani, Anjali Ganesh. “词干提取算法的比较研究。” 国际计算机应用技术期刊 2, no. 6 (2011): 1930–1938。
Medhat, Walaa, Ahmed Hassan, 和 Hoda Korashy. “情感分析算法与应用:一项调查。” 艾因沙姆斯工程期刊 5, no. 4 (2014): 1093–1113。
Nadeau, David, 和 Satoshi Sekine. “命名实体识别与分类的调查。” Lingvisticae Investigationes 30, no. 1 (2007): 3–26.
Pennebaker, James W. “代词的秘密生活。” New Scientist 211, no. 2828 (2011): 42–45.
Plisson, Joël, Nada Lavrac, 和 Dunja Mladenic. “一种基于规则的词形还原方法。” 斯洛文尼亚卢布尔雅那: Jožef Stefan Institute, 2004.
Reif, Emily, 等. “可视化与测量 BERT 的几何结构。” Advances in Neural Information Processing Systems 32 (2019).
Ross, Bruce, 编. Journey to the Interior: American Versions of Haibun. Clarendon, VT: Tuttle, 1998.
Visser, Ruan, 和 Marcel Dunaiski. “使用 BERT 进行文本内引用的情感与意图分类。” 见 第 43 届南非计算机科学与信息技术学会会议录,由 Aurona Gerber 编,129–145。第 85 卷。南非计算机科学与信息技术学会,2022。
Webster, Jonathan J., 和 Chunyu Kit. “分词作为自然语言处理中的初始阶段。” 见 COLING 1992 第 4 卷:第 14 届国际计算语言学会议论文集。斯特劳兹堡,PA:计算语言学协会,1992。
Yasuda, Kenneth. Japanese Haiku: Its Essential Nature and History. Clarendon, VT: Tuttle, 2011.
第十章
Bauer, U., Kerber, M., 和 Reininghaus, J. “持久同调的分布式计算。” 见 2014 年算法工程与实验会议录(ALENEX),31–38。费城:工业与应用数学学会,2014。
Birman, Kenneth P. “可靠分布式计算的过程组方法。” Communications of the ACM 36, no. 12 (1993): 37–53.
Cui, Shawn X., 等. “量子最大流/最小割。” Journal of Mathematical Physics 57, no. 6 (2016): 062206.
Farhi, Edward, Jeffrey Goldstone, 和 Sam Gutmann. “一种量子近似优化算法。” arXiv 预印本 arXiv:1411.4028 (2014).
Farrelly, Colleen M., 和 Uchenna Chukwu. “量子算法的基准测试。” Digitale Welt 3, no. 2 (2019): 38–41.
Fountsop, Arnauld Nzegha, Jean Louis Ebongue Kedieng Fendji, 和 Marcellin Atemkeng. “农业植物的深度学习模型压缩。” Applied Sciences 10, no. 19 (2020): 6866.
Fukushima, Kunihiko, 和 Sei Miyake. “Neocognitron:一种自组织神经网络模型,用于视觉模式识别机制。” 见 Competition and Cooperation in Neural Nets: Proceedings, Kyoto 1982,由 S. Amari 和 M.A. Arbib 编,267–285。柏林:Springer, 1982。
Markov, Igor L., 和 Mehdi Saeedi. “通过电路合成加速量子数分解。” Physical Review A 87, no. 1 (2013): 012310.
Mutanga, O., 和 A.K. Skidmore. “结合成像光谱学和神经网络绘制南非克鲁格国家公园草地质量。” Remote Sensing of Environment 90, no. 1 (2004): 104–115.
Resch, Salonik. QuantumOps (版本 3.0.1). 软件包. 2020 年 2 月 3 日. cran.r-project.org/web/packages/QuantumOps.
Schuld, Maria, 等. “Circuit-centric quantum classifiers.” Physical Review A 101, no. 3 (2020): 032308.
Su, Xiaolong, 等. “Experimental preparation of eight-partite cluster state for photonic qumodes.” Optics Letters 37, no. 24 (2012): 5178–5180.
Ubaru, Shashanka, 等. “Quantum topological data analysis with linear depth and exponential speedup.” arXiv 预印本 arXiv:2108.02811 (2021).
Vidal, Guifre, 和 Christopher M. Dawson. “Universal quantum circuit for two-qubit transformations with three controlled-NOT gates.” Physical Review A 69, no. 1 (2004): 010301.
Wittek, Peter. 量子机器学习:量子计算对数据挖掘的意义. 圣地亚哥:学术出版社, 2014.
Yoon, Hee Rhang, 和 Robert Ghrist. “Persistence by parts: Multiscale feature detection via distributed persistent homology.” arXiv 预印本 arXiv:2001.01623 (2020).
第六章 数据集
“对于那些 IQ 在顶部 0.01%(极度聪明)的人,你的教育路径是什么样的?” Quora. www.quora.com/For-those-of-you-with-an-IQ-in-the-top-0-01-profoundly-gifted-what-has-your-educational-path-looked-like.
第九章 数据集诗歌
下面是数据集中 Farrelly 诗歌的行号:
-
Frogpond, 卷 41:3
-
Frogpond, 卷 41:3
-
Presence, 2019 年冬季
-
Another Trip Around the Sun, 2019 年
-
Failed Haiku, 2020 年 12 月
-
Bundled Wildflowers, 2020 年
-
Frogpond, 卷 43:3
-
Failed Haiku, 2020 年 1 月
-
“Brother” 在 Frogpond, 卷 42:1
-
“Writing on the Wall” 在 Haibun Today, 卷 13:3, 2019 年 9 月
-
“Fires and Stones” 在 Haibun Today, 卷 12:4, 2018 年 12 月
-
“Captain’s Log, Major Azax” 在 Leading Edge, 第 75 期
-
“Snug Jackets” 在 #Femku, 2019 年 3 月
-
“Browsing History” 在 drifting-sands-haibun, 第 1 期
-
“A Shadow in the Night” 在 Night to Dawn, 第 38 期
-
“Crossing the Styx” 在 cattails, 2020 年 4 月
-
“Anya” 在 Vine Leaves Literary Journal, 第 10 期
-
“Overtown Store Front” 在 StepAway, 2013
-
“After War” 在 Cacti Fur, 2017 年 3 月
-
“Jackson ER” 在 POND, 卷 38
-
“Consuming Fire” 在 Four and Twenty, 卷 4:11
-
Four and Twenty, 卷 6:8
-
“Moonlit Night” 在 The Marquette Journal, 2005 年秋季
-
“Do You See Me Sleeping Over There” 在 Lake City Lights, 2012 年
-
“Reminder Notes in a Trash Can” 在 The Casserole, 2014 年
-
“Calvin Today” 在 The Casserole, 2014 年
-
“Slick City Streets” 在 The MacGuffin, 卷 36:3
-
“Teachings of a Street Prophet” 在 The Recusant, 2012 年
-
“Blue Eyes” 在 RiverLit, 2013 年
-
“Ever After” 在 The Transnational, 卷 1
-
“Saturday Night Fire” 在 Vine Leaves Literary Journal, 第 4 期
-
“Forgotten” 在 Lake City Lights, 2012 年
第二章:索引
请注意索引链接到每个术语的大致位置。
A
邻接矩阵
中心性,27,30,33–35
有向和无向网络,27
疾病传播跟踪,67,69
持久同调,91–92
谱理论,49–50
加权网络,27
赤池信息准则(AIC),137,140
代数连接度,50,51
alpha(衰减参数),35,39
alpha 中心性。见 Katz 中心性
权威中心性
定义,35
社交网络中的测量,39–41
平均感知器标记器,183–184
B
Barabási-Albert 模型,52
基(Hamel 基),133
BERT(双向编码器来自变压器),189–190
beta,70
Betti 数,85–86
定义,85
欧拉特征,87
示例,85–86
持久同调,88–89
子群挖掘,156–157
验证测量工具,161
顶点之间的中介性
应用,32–33
桥梁,64
社区挖掘,60
疾病传播跟踪,68
图滤波,79
社交网络中的测量,37,38,41,42
概述,32–33
利用社交媒体网络指标进行预测,57,59
拓扑数据分析,194
双向编码器来自变压器(BERT),189–190
二项分布
分散度,137
熵,107–110
Bonacich 中心性。见 Katz 中心性
桥梁
中介中心性,38,64,68
疾病传播跟踪,68
利用社交媒体网络指标进行预测,56–57
walktrap 算法,61
browseVignettes(),xxii
C
calculate_homology(),157
坎贝拉距离,101–102, 103, 118
Čech 复形,82
中心性,29–42
应用,30
将聚类应用于社交媒体数据集,60
权威中心性,35
顶点的介数,32–33
顶点的接近度,31
定义,30
顶点的度,30–31
疾病传播跟踪,68
距离和,24
特征向量中心性,33–34
图滤波,77–79
中心度,35
Katz 中心性,35
在示例社交网络中测量,36–42
页面排名中心性,34–35
利用社交媒体网络指标进行预测,56–59
谱理论,27, 49
拓扑数据分析,194
拓扑维度,82
切比雪夫距离,101, 116
选择排序比较,149–152
HodgeRank,152
信息缺失,150–151
没有一致的偏好,151
概述,149–150
偏好循环,150–151
电路中心量子分类器,203–204
分类和分类器
机器人账号检测,64, 66
卷积神经网络分类器,110
维度诅咒,16–17
决策边界,10–11
定义,2
同调,85–86
同伦,167, 169
图像分类,18–20, 200–204
逻辑回归分类器,16–17
度量几何,116–119
过拟合和欠拟合,13
概述,10–11
诗歌分析项目,186, 189–190
预测边的形成,59
量子分类器,203–204
监督分类器,59, 65
支持向量机分类器,103
封闭三角形,43, 49
顶点的接近度
在社交网络中的测量,37, 38
概述,31
CNNs(卷积神经网络),18–19, 110, 202–204
上同调,141, 146
社区挖掘(聚类顶点),59–64
评估聚类结果的质量,61–62
使用随机游走探索网络,61
概述,59–60
运行聚类算法,62–64
自旋玻璃聚类,62
条件费舍尔信息,134–135
条件 Rao 得分,135
连通分量
图拉普拉斯算子,50, 51
同调,85–86, 89
随机游走算法,34
子群挖掘,156
凸优化问题,148
卷积神经网络(CNNs),18–19, 110, 202–204
COVID-19 大流行,72–73, 127
螺旋流,152
维度诅咒,7, 14, 95
几何视角,17
概述,13–17
欧几里得空间中的扰动点,14–16
D
数据几何,1–21
机器学习,2–4
匹配算法,4
监督学习,2–3
无监督学习,3
结构化数据,4–17
虚拟变量,5–7
数值电子表格,8–10
监督学习,10–17
非结构化数据,17–21
图像数据,18–20
网络数据,17–18
文本数据,20–21
数据完整性,4
数据点
在结构化数据中,4, 7–9
监督学习,9, 11, 14, 17
无监督学习,3
数据科学几何,95–129
距离度量,96–116
熵,107–110
基于范数的距离度量,99–105
形状比较,110–116
小数据集模拟,98–99
Wasserstein 距离,105–107
分形,125–129
具有度量几何的k最近邻,116–119
流形学习,119–125
Isomap,121–122
局部线性嵌入,122–124
多维缩放,120–122
t-分布随机邻居嵌入,124–125
决策边界
分类,10–11
过拟合,13
决策树
决策边界,10, 11
过拟合,13
深度学习
卷积神经网络,18, 202–203
定义,4
几何,18
黎曼流形,18
向量嵌入,20–21
网络度,48–49
顶点度(度中心性)。另见 Katz 中心性
应用,31
社区挖掘,60
Forman–Ricci 曲率,46
图过滤,76, 78–79
图拉普拉斯,50
入度和出度,30
k 均值聚类,60, 61
局限性,31
在社交网络中的测量,41
概述,30–31
无标度图,52
拓扑维度,82–84
三元闭包,43
系谱图,89, 107, 158–160
网络密度
疾病传播跟踪,69, 71
图过滤,77
概述,48–49
因变量
定义,2
虚拟变量,5
图像分类,203
连接函数,135
回归,11, 12
监督学习,2–3
顶点中心度度量,56, 58
dgLARS 算法,133–140
信用违约预测,138–140
交叉验证 vs. 非交叉验证,136–140
抑郁预测,136–138
概述,133–136
诗歌分析项目,186
风险倾向测量,134–135
dglars 软件包,136
网络直径
图滤波,79–80
网络比较,65–66
概述,49
微分几何,88。另见 dgLARS 算法
微分几何最小角回归算法。见 dgLARS 算法
迪杰斯特拉算法,199
维度
诅咒,7, 13–17, 95
定义,14
减少,95, 119–120, 184
无监督学习,3
有向网络,19
应用,26
权威中心度,39–40
无向转换为有向,39–40
定义,26
顶点度,30
边,28
特征向量中心性,34
中心度,39–40
网络互连性,48
R 中的网络,26–27
PageRank 算法,33
推特,17, 26
灾难物流规划,142–146
离散外微分,140–146
上同调,141, 146
微分形式,141
灾难物流规划,142–146
工程问题,146
概述,140, 141
社交网络分析,141–142
dist(),99, 101, 104
距离度量,96–116
熵,107–110
基于范数的距离度量,99–105
概述,96–98
形状比较,110–116
小数据集模拟,98–99
Wasserstein 距离,105–107
分布式计算,194–195
顶点的多样性,42
道琼斯工业平均指数(DJIA),127–128
虚拟变量,5–7
类别变量,5–6
几何,5–7
多重共线性,7
D-Wave,197
E
埃博拉疫情,29
顶点的离心率
直径和,49
图过滤,80
概述,45
半径和,49
边列表,26–27
边
相邻,28
顶点的接近度,31
顶点度,30
网络密度,48–49
描绘,25
有向和无向网络,17,26
疾病传播跟踪,67–69,70
顶点的多样性,42
Erdös-Renyi 图,51–52
欧拉特征,87
Forman–Ricci 曲率,46–47
图过滤,76–78,80
社区内和社区间边的密切性,61
社交媒体中的链接预测,58–59
网络比较,65
概述,25
路径长度,28
加权和无权网络,28–29
网络效率,49
顶点效率,44–45
eigen(),50
特征值,33,49–50
特征向量,33,49–50
特征向量中心性,33–39
权威和枢纽性,35
Katz 中心性和,36
社交网络中的测量,38–39
概述,33–34
PageRank 中心性和,34–35
弹性网络回归,101
EM 算法,171
实体
命名实体识别,180
传播,66–68
顶点和边,25
熵,107–110
顶点的多样性,42
相对的,135
香农熵,42
流行病学
中心性,30
疾病传播跟踪,67–74
谱半径,50
Erdös-Renyi 图,51–52
网络比较,65–66
持久同调,90–93
欧几里得距离
维度诅咒,14, 16
k最近邻,118–119, 186
多维缩放,121, 122
网络距离和,29
基于范数的距离度量,99–103
电子表格几何,9
欧几里得向量空间
维度诅咒,15, 16
定义,8
流形,119
多维缩放,120–122
形状比较,113–116
电子表格几何,8
切空间,133
向量嵌入,21
欧拉特征,87–88
贝蒂数,87
高斯-博内定理,88
极大团,87
负的,87
单纯复合体,87
最大期望(EM)算法,172
F
机器人账户检测,18, 24
顶点度,30
全局网络指标,47
链接预测,58
网络距离,24
文本搜索,20
无向网络,17, 26
快速贪婪聚类,61–64
特征重要性,3
过滤
图过滤,76–81
网络过滤,75–94
费舍尔信息,134–135
旗复合体,82–83
fMRI。见功能性磁共振成像
Forman–Ricci 曲率
微分几何,88
破坏通信和疾病传播,72–73
概述,45–47
股市变点检测,129
Forman–Ricci 流,73–74
分形,125–129
弗雷歇距离,111–112
功能性磁共振成像
网络比较,64,66
持续同调,90–93
G
伽玛,70
基于门的电路,196–197
高斯-邦尼定理,88
高斯分布,172–173
高斯噪声,14
gcd(),199–200
基因组学,17,88,136
数据集,86,101,119
测地线,33,44,121
切空间和,96–97
几何深度学习,18
地理空间数据,8–9,9
选区划分,24
全局网络度量,47–51
图滤波,79
网络的互连性,48–49
网络比较,93
网络的谱测度,49–51
网络上的传播过程,49
谷歌
图像搜索,202–203
PageRank 算法,33
PageRank 中心性,34–35
文本搜索,20
GPT-3,189
梯度下降,169–171
梯度流,152
图直径,79–80
图滤波,76–81
大脑成像研究,80
度中心性,78–79
图直径,79–80
图拉普拉斯,50–51
图论,24,195,198–199
最大公约数,199–200
贪婪算法,61–64
Gromov-Hausdorff 距离,113–116,160
gromovlab 软件包,114
H
Hamel 基,133
海明距离,163–164
谐波流,152
Hausdorff 距离, 113, 160
hclust(), 156
热图, 11, 89
help(), xxii
层次聚类, 3, 89, 156–158, 163
霍奇-赫尔姆霍兹分解, 152
HodgeRank, 152
同伦, 85–94
Betti 数字, 85–86
同调, 140–141, 146
已定义, 85
微分几何, 88
欧拉特征, 87–88
持久同伦, 88–89, 129, 159, 195
测量验证与, 160–161
网络比较与, 89–94, 155–156
子群体挖掘与, 156–157, 159, 162
同伦弗雷歇距离, 111
同伦算法, 167–177
比较, 173
同伦, 已定义, 167
基于同伦的回归, 169–174
逻辑回归与基于同伦的回归, 174–176
概览, 167–168, 169
中心性
社区挖掘, 60
已定义, 35
图滤波, 77
社交网络中的测量, 39–42
无监督学习, 60
超参数
分类, 11
已定义, 3
过拟合, 13
回归, 12
I
IBM, 197
igraph 库, 27, 29–30, 35, 43, 52, 85, 87, 90, 165
cluster_edge_betweenness(), 64
默认值, 39
eccentricity(), 49
edge_density(), 48, 69
efficiency(), 49
sample_gnp(), 51
sample_pa(), 52
sample_smallworld(), 52
sir(), 70
spectrum(), 50
transitivity(), 49
图像分类
卷积神经网络,18–20
量子计算方法,200–204
图像数据
卷积神经网络,18–19,20
Forman–Ricci 流,73–74
概述,18–20
持续同调,88–89
入度,30
自变量
决策树,11
定义,2
dgLARS 算法,135
维度,14,101
虚拟变量,5,7
几何深度学习,18
图像分类,19,203
多重共线性,7
监督学习,2–3
无监督学习,3
顶点中心性度量,57–58
实例。见 数据点
网络的互连性,40,44,47–49,52
逆 Hamming 距离,164
Isomap,121–122
等距嵌入,113,116
K
Katz 中心性
特征向量中心性和,35
社交网络中的测量,39
概述,35
k-means 聚类,3
社区挖掘,59–60
vs. Mapper 算法,161,163
k 最近邻 (k-NN),2–3
决策边界,10,11
虚拟变量,7
度量几何,116–119
过拟合,13
诗歌分析项目,186
回归,11–12
knnGarden 软件包,117
KONECT 风帆网络,69–71
Kullback-Leibler 散度
dgLARS 算法,135
熵,108–110
t-分布随机邻域嵌入,124
L
Lasso 算法
同伦优化,172,174–176
Lasso 回归,101
诗歌分析项目,190
lasso2 软件包,172
线性相关性,7
线性回归,2–3
dgLARS 算法,136, 138
利用社交媒体网络指标进行预测,57
多重共线性,7
监督回归,12
与同伦基础回归相比,173–174, 176
链接函数,136
链接预测,58–59
局部线性嵌入(LLE),122–124
局部最优解,169–172, 174, 176
逻辑回归,2
维度诅咒,16
决策边界,10, 11
dgLARS 算法,140
链接函数,136
多重共线性,7
过拟合,13
与同伦基础回归相比,174–176
Louvain 聚类,62–64
M
机器学习类别,2–4
匹配算法,4
监督学习,2–3
无监督学习,3
mahalanobis(), 103
马氏距离,103–104, 105
曼哈顿距离,100–102
k-最近邻,116, 118–119
多维缩放,121, 122
子群挖掘,156–157
流形假设,95
流形学习,119–125
Isomap,121–122
局部线性嵌入,122–124
多维缩放,120–122
与主成分分析相比,119
t-分布随机邻居嵌入,124–125
流形
定义,8
距离度量,96, 98, 194
高斯-博内特定理,88
同调,85, 88
黎曼流形,18
切空间,132–133
Mapper 算法,161–166
逐步进行,162–163
使用 TDAmapper 在数据中找到聚类结构,163–166
匹配算法,4
Matlab,152
极大团,82–84
灾难后勤规划,144
欧拉特征,87
量子网络算法,197
MDS(多维缩放),120–122
median(), 70
度量几何,98
分形,125–129
k 近邻,116–119
流形学习,119–125
闵可夫斯基距离,101–102, 121
MNIST 数据集,204
模型拟合
dgLARS 算法,137–138
同伦回归,172
非线性,147, 149
模块化,61–64
Morse 函数,162
多重共线性,7, 133
多核方法,193–195
多维缩放(MDS),120–122
N
命名实体识别,180
自然语言处理
流水线,180–181
基于拓扑的工具,188–191
网络分析,55–74
传播分析,66–74
城镇间的疾病传播跟踪,67–69
风帆冲浪者之间的疾病传播跟踪,69–72
干扰通信和疾病传播,72–74
监督学习,56–59
社交媒体中的日记预测,56–58
社交媒体中的链接预测,58–59
无监督学习,59–64
将聚类应用于社交媒体数据集,59–60
社区挖掘,61–64
网络比较,64–66
网络深度,31, 33
网络距离,28–29
应用,24, 28–29
定义,28
社交媒体中的链接预测,59
持续同调,91–93
加权和无权网络,28
网络过滤,75–94
图过滤,76–81
同调,85–94
贝蒂数,85–86
欧拉特征,87–88
持久同调,88–89
与之比较,90–94
单纯复合体,81–85
网络几何,23–54
有向和无向网络,18
全局网络度量,47–51
网络的互连性,48–49
网络的谱度量,49–51
在网络上的传播过程,49
用于现实行为的模型,51–53
Erdös-Renyi 图,51–52
无标度图,51–52
Watts-Strogatz 图,52–53
网络科学,24–25
网络理论,25–29
有向网络,26
R 中的网络,26–27
路径和网络距离,28–29
概述,17–18
黎曼流形,18
顶点度量,30–47
中心性,30–42
顶点的多样性,42
顶点的离心率,45
顶点的效率,44–45
Forman–Ricci 曲率,45–47
三元闭包,43–44
定义的网络,8
神经网络,2
卷积,18–19, 202–204
决策边界,10, 11, 13
基于同伦的优化,172
量子,203–204
基于拓扑的 NLP 工具,189
神经科学和脑成像
图滤波,80
网络比较,64
持久同调,90–93
NLP。见 自然语言处理
NLTK 工具包,181, 183–184
节点。见 顶点
非凸对象,147–148
非线性代数,146–149
凸优化问题,148
非凸对象,147–148
数值代数几何,147–149
与线性代数相比,146–147
非线性空间,132–140
dgLARS 算法,133–140
信用违约预测,138–140
抑郁预测,136–138
概述,133–136
切线空间,132–133, 135
未选择的预测因子,135
范数,定义,99
数值代数几何,147–149
数值电子表格。见 电子表格
O
观察。见 数据点
开放三角形,43
出度,30
异常值检测,24
网络比较,66
隐性异常值,104
子群挖掘,159
过拟合
维度诅咒,14, 16–17
概述,13
P
PageRank 算法,33, 198
PageRank 中心性,34–35
社区挖掘,60
社交媒体中的链接预测,59
社交网络中的测量,38–39, 41, 42
路径,定义,28
PCA(主成分分析),3, 119
困惑度,124–125
PERRON-FROBENIUS 定理,34
持久图
测量工具验证,159–161
持久同调,89, 91–93
诗歌分析项目,187–188
形状比较,110
子群挖掘,157
持久同调,88, 155–159
测量工具验证,160–162
多核方法,195
网络比较,90–94
异常值检测,159
概述,88–89
股市变化点检测,129
子群挖掘,156–159
PET(正电子发射断层扫描),64, 90–93
philentropy 软件包,108
plot_persist(), 157
诗歌分析项目,180–188
R 中的分析,184–188
诗歌形式,181–182
自然语言处理流水线,180–181
向量归一化,184
标记词性,183–184
对文本数据进行标记化,183
基于拓扑的自然语言处理工具,188
点云,82, 88–89, 146, 156–157, 162–163
泊松分布,56–57
泊松回归,57, 58
多项式,147–148
正电子发射断层扫描,64, 90–93
预测器。见独立变量
预训练的转换器模型,189
主成分分析,3, 119
概率密度函数,106–108, 109
概率分布
熵,107–110
t-分布随机邻域嵌入,124
Wasserstein 距离,105–107
传播分析。见扩散分析
毕达哥拉斯距离,100。另见欧几里得距离
Python
BERT 模型,189
分布式计算,194
帮助资源,xxiii
自然语言处理,180–181
诗歌分析项目,183–184
量子计算,196–199
Q
量子算法,197–200, 204
量子退火,197
量子近似优化算法(QAOA),198
量子分类器,203–204
量子计算方法,193–205
图像分类器,200–204
量子算法开发,199–200
量子网络算法,197–199
基于量子比特的模型,196–197
基于量子模式的模型,197
量子最大流和最小割算法,197–198
QuantumOps 软件包,198–200,203–204
量子比特
电路中心的量子分类器,203
量子网络算法,198
基于量子比特的模型,196–197
基于量子模式的模型,197
Quora 数据集,136,156,160,163,166,174
R
R(编程语言)
下载,xxi–xxii
帮助资源,xxii
安装,xxii
安装软件包,xxii
说明文,xxii–xxiii
网络半径,35,49–50
随机森林,2
决策边界,11
回归,11–12
随机游走算法
顶点的多样性,42
特征向量中心性,34,38
链接预测,59
映射网络,24
PageRank 中心性,35,38–39
量子算法,198
walktrap 算法,61–64
冗余预测变量,133,135
正则表达式分词器,183
回归
定义,2
虚拟变量,5–6
弹性网络回归,101
基于同伦的回归,169–176
期刊排名,66
线性回归,2–3,12
dgLARS 算法,136,138
利用社交媒体网络指标进行预测,57
多重共线性,7
与基于同伦的回归比较,173–174,176
逻辑回归,2
维度诅咒,16
决策边界,10,11
dgLARS 算法,140
链接函数,136
多重共线性,7
过拟合,13
与基于同伦的回归比较,174–176
概述,11–12
泊松回归,57,58
强化学习,4
里奇曲率,45。另见 Forman–Ricci curvature
黎曼流形,18
Rigetti,197
RStudio,xxii
S
SBERT(基于双向编码器变换的句子表示),189
无标度图,52–53
网络比较,65–66
持久同调,90–93
散点图,11,100,119,171
选择的预测因子,135
香农熵,42
形状比较,110–116
Fréchet 距离,111–112
Gromov-Hausdorff 距离,113–116
海斯道夫距离,113
单纯复形,81–85
Čech 复形,82
共链,141
欧拉特征,87
过滤,82
旗复形,82–83
Mapper 算法,162
最大团,82–84
概述,81–82,84
持久同调,88–89,156–157
拓扑维度,82–84
Vietoris-Rips 复形,82
模拟退火,62
单链接层次聚类,89,156,163
SIR 模型。见易感-感染-恢复模型
SMOTE(合成少数过采样技术),8
社交网络
代数连通性,50
机器人账号检测,18,24,64,66
中心性,30–42
聚类顶点,59–64
日记条目预测,56–58
有向和无向网络,17–18
离散外微分,141–142
Forman–Ricci 曲率,46,47
图过滤,76–80
影响者,24,30–31
链接预测,58–59
网络深度,33
单纯复形,82–83,84
虚假信息传播,9,66–67
子群挖掘,156–157
传递性,43,44
三元闭包,43
顶点与全局度量,47
Watts-Strogatz 图,52
网络的谱隙,50
网络的谱度量,49–51
谱半径,35,49–50,79
Spinglass 算法,62
Spinglass 聚类,62–64
传播分析,66–74
疾病传播追踪
城镇之间,67–69
风帆滑水者之间,69–72
扰乱通信和疾病传播,72–74
网络上的传播过程,49
电子表格
邻接矩阵,27
分类,10
虚拟变量,5–7
欧几里得向量空间,8
的几何结构,8–10
地理空间数据,8–9
结构化数据,4
统计包,99
股票市场变化点检测,127–129
顶点的强度(加权度),30,82
结构化数据,4–17
定义,4
虚拟变量,5–7
数值电子表格,8–10
有监督学习,10–17
分类,10–11
维度诅咒,14–17
过拟合,13
回归,11–12
子群挖掘
Mapper 算法,161–166
持续同调,156–159
有监督学习,10–17
算法视为函数,2–3
分类,10–11
与无监督学习结合,3
维度诅咒,14–17
过拟合,13
概述,2–3
预测
社交媒体中的日记条目预测,56–58
社交媒体中的链接预测,58–59
回归,11–12
训练数据和测试数据,3
支持向量机,2,172
易感-感染-恢复模型
已定义,68
疾病传播跟踪
城镇间,67–69
风帆冲浪者,69–72
干扰通信和疾病传播,72–74
合成少数类过采样技术(SMOTE),8
T
表格数据。参见结构化数据
切线,线,96,132–133
切平面,96,132,133
切线空间,96,124,131–135,149
欧几里得空间和,113
测地线和,96
线性代数和,133
非选定预测因子,135
冗余预测因子,135
选择的预测因子,135
目标。参见因变量
TDA。参见拓扑数据分析
TDAmapper 包,163–166
TDAstats 包,156–157,161
t-分布随机邻域嵌入(t-SNE),124–125,185–186,189–190
测试误差
维度灾难,14
过拟合,13
测试数据
已定义,3
过拟合,13
文本数据
概览,20–21
诗歌分析项目,179–191
向量嵌入,20–21
拓扑数据分析,159–166
图过滤,76
Mapper 算法,161–166
测量工具验证,159–161
多核方法,194–195
持久同调,155–159
子群体挖掘,156–159
拓扑维度,82–85
圆环,86,168
训练数据,已定义,3
训练误差,13
传递性
社区挖掘,60
全球网络度量,49
顶点度量,43–45
Treebank 分词器,183
三元闭包,43–44,79
三角不等式条件,101
TSdist 软件包,111
t-SNE(t-分布随机邻居嵌入),124–125,185–186,189,190
Twitter,17–18,26,30–31
U
UCI 信用违约数据集,138–139
欠拟合,13–14
无向网络,19
转换为有向,39–40
定义,26
Facebook,17,26
网络的互连性,48
R 中的网络,27
非结构化数据,17–21
图像数据,18–20
网络数据,17–18
文本数据,20–21
无监督学习,59
聚类顶点,59–64
评估聚类结果的质量,61–62
通过随机游走探索网络,61
概述,59–60
运行聚类算法,62–64
spinglass 聚类,62
与监督学习结合,3
概述,3
无权网络,27–28,30–32,34–35
V
向量嵌入,20–21
顶点度量,30–47
中心性,30–42
权威中心性,35
顶点的介数,32–33
顶点的亲近度,31
顶点的度,30–31
特征向量中心性,33–34
中心性枢纽,35
Katz 中心性,35
在示例社交网络中测量中心性,36–42
PageRank 中心性,34–35
社区挖掘,59–60
定义,47
顶点的多样性,42
顶点的离心率,45
顶点效率,44–45
Forman–Ricci 曲率,45–47
预测
社交媒体中的日记预测, 56–58
社交媒体中的链接预测, 58–59
三元闭合, 43–44
顶点
中介中心性, 32–33, 64
近似性, 31
社区挖掘, 59–64
的度, 30–31
描述, 25
有向网络和无向网络, 26
之间的距离, 28
的多样性, 42
的偏心性, 45, 49
的效率, 44–45
邻近, 28
概述, 25
的强度, 30
Vietoris-Rips 复形, 82
W
Walktrap 算法, 61–64
Wasserstein 距离, 93, 105–107
Watts-Strogatz 图, 52–53, 61
网络比较, 65–66
持久同调, 90–93
波函数, 197
顶点的加权度(强度), 30, 82
加权网络
邻接矩阵, 27
顶点的度, 30
疾病传播追踪, 67–69
顶点的多样性, 42
特征向量中心性, 34
图滤波, 76–81, 84–85
PageRank 中心性, 35
路径和网络距离, 28–29
单纯形复形, 84–85
顶点的强度, 30
X
Xanadu, 197
Y
YouTube, 4
第三章:数据的几何结构

你可能会想,既然传统的数据科学方法已经如此流行且强大,为什么还需要基于拓扑学和几何学的数据科学方法呢?这个问题的答案有两个部分。首先,今天的数据格式种类繁多,远比传统的电子表格更加异乎寻常,比如社交网络或文本文件。虽然这些异质数据曾被称为非结构化数据,但我们现在意识到,它们通常是结构化的,只不过它们的几何结构比关系数据库中的一系列电子表格更为复杂。拓扑学和几何学的数据科学使我们能够直接在这些异质领域中工作,并将它们转换为更为熟悉的电子表格领域。其次,最近的一个发现表明,即便是电子表格结构化的数据背后,也潜藏着几何结构。通过拓扑学和几何学的数据科学,我们能够利用这种隐藏的几何结构的力量。
本章将从回顾传统机器学习中的主要概念开始,讨论数据如何被结构化,以及机器学习算法如何通常使用这些结构化数据。接着,我们将从几何学角度回顾监督学习、过拟合和维度灾难。然后,我们将预览其他几种常见的数据类型——网络数据、图像数据和文本数据——并暗示如何在机器学习中利用它们的几何结构。如果你已经熟悉传统机器学习及其应用于现代数据形式的挑战,可以跳过本章,直接进入第二章,技术内容将在那里正式开始,尽管你可能会觉得本章提供的传统机器学习主题的几何学视角仍然很有趣。
机器学习类别
目前存在许多类型的机器学习算法,而且每天都有新的算法被发明出来。跟上所有最新的发展可能会很困难,但将机器学习算法分为几大类会有所帮助。
监督学习
监督学习算法通常旨在预测某些内容,比如在新的医院协议下的治疗结果,或者客户在接下来六个月离开的概率。我们预测的变量称为因变量或目标变量,用于预测的变量称为自变量或预测变量。当我们预测的是数值型变量(例如症状严重程度量表)时,这称为回归;当我们预测的是类别型变量(如生存或死亡类别)时,这称为分类。
一些最受欢迎的监督学习算法包括k最近邻(k-NN)、朴素贝叶斯分类器、支持向量机、随机森林、梯度提升和神经网络。阅读本书不需要掌握这些话题,但如果对至少一种回归方法和一种分类方法有所了解(如线性回归和逻辑回归),会有所帮助。话虽如此,如果你不确定这些内容,也不用担心——这一章会涵盖你所需的概念。
每种监督学习算法都是一种特定类型的函数,具有与数据中的独立变量数量相同的输入变量。我们将这个函数视为根据独立变量的任何值预测因变量的值(参见图 1-1)。对于具有独立变量x[1]、x[2]、...、x[n]的线性回归,这是一个线性函数:f(x[1]、x[2]、...、x[n]) = a[1]x[1] + a[2]x[2] + ...。对于其他方法,它是一个复杂的非线性函数。对于许多方法,这个函数是非参数化的,这意味着我们可以通过算法计算它,但无法用公式表达它。**

图 1-1:独立变量流、监督机器学习算法(视为函数)和因变量预测
使用监督学习算法通常涉及将数据划分为两个集合。一个是训练数据,其中算法试图调整函数中的参数,使得预测值尽可能接近实际值。在前面的线性回归示例中,参数是系数a[i]。另一个是测试数据,我们在此测量算法执行的效果。超参数是用户必须指定的任何参数(与通过训练过程直接从数据中学习到的参数不同)。k表示最近邻数目的超参数在k-NN 中就是一个例子。
在监督学习算法训练完成后,我们可以使用它来做出新的预测,并估计每个独立变量对因变量的影响(称为特征重要性)。特征重要性有助于做出干预决策。例如,了解哪些因素最能影响患者因传染病死亡,可以在疫苗供应有限时为疫苗接种策略提供参考。
无监督学习
无监督学习算法通常专注于数据探索——例如,通过减少数据集的维度来更好地可视化数据,查找数据点之间的关系,或者检测异常数据点。在无监督学习中,没有因变量——只有自变量。因此,我们不会将数据拆分为训练集和测试集;我们只是将无监督方法应用于所有数据。无监督学习的应用包括基于数百万个遗传标记的市场细分和祖先群体可视化。无监督学习算法的例子包括 k-means 聚类、层次聚类和主成分分析(PCA)——但同样,你不需要了解这些主题就可以阅读本书。
无监督学习和监督学习可以有效地结合。例如,你可以使用无监督学习来发现数据中的新问题,并使用监督学习来回答这些问题。你还可以使用无监督学习进行降维,作为预处理步骤,以提高监督学习算法的性能。
匹配算法与其他机器学习
机器学习的另一个常见应用是匹配算法,它通过计算点之间的距离来查找数据集中相似的个体。这些算法通常用于向用户推荐产品;它们也用于数据完整性检查,以确保在允许机器学习算法创建模型之前,某些人群的数据是充足的。
随着机器学习和人工智能的兴起,数据完整性变得越来越重要。如果数据中未能很好地捕捉到某些重要的子群体,算法就会倾向于偏向多数群体。例如,如果语言识别系统没有来自非洲或亚洲语言群体的足够数据,系统就很难学习到这些语言群体特有的人类语音声音,例如科伊桑语的咔嗒音或普通话的声调。匹配算法也被用来尝试从经验数据中提取因果关系,当随机对照试验不可行时,它们能够将相似的参与者配对,就像他们被分配到治疗组和安慰剂组一样。
我们可以提及许多其他类型的算法,在实践中,算法类别之间往往存在重叠。例如,YouTube 的推荐算法在监督和无监督方式中都使用深度学习(这涉及基于具有多个“隐藏层”的神经网络的机器学习),以及匹配算法和机器学习的另一个支柱强化学习(其中算法通过探索真实或模拟环境来自行开发策略——超出本书的范围)。然而,前面提供的机器学习基本路线图将指导我们贯穿本书。
接下来,让我们更仔细地看一下这些算法期望的数据格式。
结构化数据
机器学习算法,以及数据科学和统计方法通常在结构化数据(也称为表格数据)上运行,这意味着一种类似电子表格的对象(数据框或矩阵),其中列是变量,行是数据点(也称为实例或观测)。这些通常存储在关系数据库中,与其他结构化数据一起。表格结构使我们能够讨论自变量、因变量和数据点。本书的重点之一是如何处理不以这种良好格式呈现的数据。但即使是表格数据,几何视角也可能非常有用。
首先,让我们深入研究一个示例,展示几何如何帮助我们更好地理解和处理结构化数据中的分类变量。
虚拟变量的几何形式
图 1-2 显示了存储为 Microsoft Excel 工作簿的电子表格的一部分。这里的最后一列是 Outcome,因此我们将其视为因变量;其他三列是自变量。如果我们将这些数据用于监督学习算法,那将是一个回归任务(因为因变量是数值)。第一个自变量是二进制数值(取值为 0 和 1),第二个自变量是离散数值(取整数值),第三个自变量是分类的(有三个性别类别)。一些算法接受分类变量,而另一些要求所有变量都是数值。除非类别是有序的(例如调查数据,其值为“非常不满意”、“不满意”、“满意”和“非常满意”),将分类变量转换为数值的方法是用一组二进制虚拟变量替换它,这些变量用值 1 和 0 表示每个类别的是/否格式。在图 1-3 中,我们用两个虚拟变量列替换了性别变量列。

图 1-2:Microsoft Excel 工作簿中结构化数据的示例
即使对于这样一个常见且简单的过程,几何考虑也有助于阐明正在发生的事情。如果分类变量的值是有序的,那么我们可以通过将这些值沿着一个一维轴放置,以反映这些值的顺序,将它们转换为一个单一的数值变量。例如,调查中的“满意”,“非常满意”和“极度满意”可以编码为 1、2 和 3,或者如果你希望“满意”和“非常满意”之间的差异小于“非常满意”和“极度满意”之间的差异,那么你可以将它们编码为 1、2 和 4。

图 1-3:一个转换后的结构化数据集,其中分类变量已被替换为两个二进制虚拟变量
如果类别没有顺序——比如男性、女性和非二元——我们不希望强制将它们全部放入一个维度中,因为这样会人为地对它们进行排序,并使其中一些类别比其他类别更接近(见图 1-4)。

图 1-4:将分类变量的值放在一个维度中会使其中一些类别比其他类别更接近。
几何上,当我们创建虚拟变量时,我们为不同的类别创建了新的轴。有两种方法可以做到这一点。有时,你会看到人们为每个分类变量的值使用一个虚拟变量,而在其他时候,你会看到人们为除一个值之外的所有值使用虚拟变量(就像我们在图 1-3 中所做的那样)。为了理解区别,让我们看看我们的三类别性别变量。
使用三个虚拟变量将类别放置在一个等边三角形的顶点上:男性的坐标为(1,0,0),女性的坐标为(0,1,0),非二元的坐标为(0,0,1)。这确保了各个类别之间的距离相等。只使用两个虚拟变量意味着男性的坐标为(1,0),女性的坐标为(0,1),非二元的坐标为(0,0)。这将我们的等边三角形在三维空间中投影到二维平面上的直角三角形,这样做会扭曲距离。男性和女性现在比彼此更接近非二元,因为它们在这个等腰直角三角形中被长度√2 ≈ 1.4 的斜边分开(见图 1-5)。因此,一些机器学习算法会错误地认为类别男性和女性与类别非二元更相似,而不是彼此。

图 1-5:创建性别虚拟变量的两种方法。左边,我们为每个类别使用一个轴,这确保了各个类别之间的距离相等。右边,我们只使用两个轴,这导致一些类别比其他类别更接近。
那么为什么要同时使用两种虚拟变量方法呢?对于n值分类变量,使用n个虚拟变量而不是n – 1 会导致多重共线性,在统计语言中,这是独立变量之间的相关性。这里的相关性是每个虚拟变量完全且线性地由其他变量决定。代数上,这是线性相关性,意味着一列是其他列的线性组合。这种线性相关性在几何上可以看到:将n个类别放置在n维空间中时,它们仅覆盖一个(n – 1)维平面。在图 1-5 中,左侧三个向量的线性组合仅覆盖包含三角形的平面,而右侧的线性组合则覆盖整个二维坐标系。
多重共线性会导致线性回归和逻辑回归的计算问题,因此对于这些算法,我们应该使用n – 1 个虚拟变量而不是全部n个。即使对于不会遇到这个特定计算问题的方法,尽可能使用较少的独立变量通常更好,因为这有助于减少维度诅咒——这是数据科学中的一个基本主题,我们将很快从几何角度讨论。
另一方面,对于像k-NN 这样的算法,数据点之间的距离至关重要,我们不希望丢弃虚拟变量之一,因为那会扭曲距离(正如我们在图 1-5 中看到的那样),并导致性能不佳。在使用虚拟变量方法时,有时机会和地点,思考几何学可以帮助我们决定何时使用哪种方法。
在使用虚拟变量将所有分类变量转换为数值变量后,我们准备考虑电子表格的几何形态。
数字电子表格的几何形态
我们可以将数字电子表格看作描述欧几里得向量空间 R^(d) 中的一组点(每行一个点),这是一个几何空间,在二维中看起来像一张平面纸,在三维中看起来像一个实心砖块,但在所有方向上无限延伸,可以是任意维度。这里,d 是列数,也是空间的维度。数字数据集中的每一列代表这个空间中的一个轴。具体来说,每个数据点的d维坐标只是该行中的值。
当d = 1 时,这个欧几里得向量空间R^(d)是一个直线。当d = 2 时,它是一个平面。当d = 3 时,它就是我们习惯思考的三维空间。虽然人类实际上无法直观地理解超过三个垂直坐标轴的空间,但即便如此,我们仍然可以通过数学和计算工具分析高维几何。这里需要注意的是,正如平面之外存在许多二维形状(例如球面或圆环面,甚至更奇特的莫比乌斯带),三维空间之外也存在许多三维几何空间(如三维球体内部或四维球体表面)。这同样适用于更高维的空间。传统上,处理结构化数据意味着从R^(d)的角度来看数据,而非从这些其他几何空间的角度来看。
R^(d)的欧几里得向量空间结构非常强大;它允许我们计算各种有用的内容。我们可以计算任何一对数据点之间的距离,这对于广泛的机器学习算法来说是必要的。我们可以计算连接任意两点的线段,这被合成少数类过采样技术(SMOTE)用于调整训练样本中的不平衡类别。我们可以计算数据中每个坐标的均值,这对于填补缺失值很有帮助(即,通过已知数据对缺失值进行最佳猜测,从而填补缺失值)。
然而,这种漂亮的欧几里得向量空间结构也具有特定和僵化的性质。幸运的是,我们可以在没有全局欧几里得坐标的更一般的环境中计算点之间的距离、连接点的最短路径以及各种形式的插值,包括流形(像球面这样的几何对象,放大看时与通常的欧几里得空间相似,但在全局上可以具有更有趣的形状和结构——将在第五章中讲解)和网络(在第二章中正式引入的关系结构)。
举一个具体的例子,假设你正在处理大规模的地理空间数据,比如基于邮政编码的犯罪统计数据。你如何对数据点进行聚类或构建任何预测模型?最直接的方法是使用纬度和经度作为变量来传达数据的地理空间特征。但是,这种方法很快就会遇到问题,因为它将圆形的地球投影到平面上,这种方式会显著扭曲距离。例如,经度的范围是从-180°到+180°,所以位于本初子午线两侧的两个点,可能在英里数上非常接近,但在经度上却可能相距非常远(见图 1-6)。因此,能够在球面数据上工作的机器学习算法非常有用,避免了将数据映射到平面表面上的需要。

图 1-6:将纬度和经度(左图)作为地理空间数据的变量会扭曲数据点之间的距离。如图所示,位于零度经线两侧非常接近的点,在经纬度平面(右图)上表示为非常远的点。
即使你在处理已经结构化为表格的电子表格数据时,可能仍然存在隐藏的几何结构是相关的。例如,假设你有三个数值变量(因此你的数据位于R³空间中),但所有数据点都位于或接近三维空间中的一个球面上。你是否希望考虑点与点之间的距离是沿球面表面的路径长度(这就是球面几何中所做的)还是穿过球体的直线距离(这是传统欧几里得机器学习中所做的)?答案取决于上下文,这是数据科学家需要根据领域知识来决定的——这通常不是算法应该自行决定的内容。例如,如果你的数据点代表一个空中无人机可以访问的房间中的位置,那么欧几里得距离更好;如果你的数据点代表全球范围内的机场,并且有国际航空公司提供服务,那么球面几何更好。
拓扑学和几何数据科学的主要任务之一是发现数据点自然存在的几何对象(就像机场示例中的球面,但在高维空间中可能是非常复杂的形状)。另一个主要任务是利用这些几何对象,这通常涉及以下一个或多个方面:
-
应用已适应更一般几何环境的常规机器学习算法版本
-
应用基于数据形状的全新几何算法
-
提供有意义的全球坐标,将数据转换为结构化的电子表格,以便传统的统计和机器学习工具能够成功应用
本书的主要目标是详细讲解所有这些概念,并展示如何轻松有效地实现它们。但首先,在本介绍性章节的剩余部分,我们将解释一些传统数据科学主题中涉及的几何内容(就像我们之前讲解虚拟变量时所做的)。我们还将暗示一些不同类型的“非结构化”数据所涉及的几何结构,作为后续章节的预览。
监督学习的几何学
本节将提供一些标准机器学习主题的几何视角:分类、回归、过拟合以及维度灾难。
分类
一旦数据集被转换为一个数值化的电子表格(假设有 d 列),监督分类器的任务是标记每个新输入数据点的预测类别。这可以通过 决策边界 来理解,即我们将 R^(d) 空间划分为不重叠的区域,并为每个区域分配一个类别,表示分类器将为该区域中的所有点预测的标签。(注意,相同的类别可以分配给多个区域。)这些区域允许的几何形状类型由所选的监督分类器方法决定,而这些形状的具体细节则通过训练过程从数据中学习。这为分类过程提供了一个启发性的几何视角。
在图 1-7 中,我们看到在 d = 2 的简单二分类示例中,一些标准分类算法的决策边界。

图 1-7:几种分类算法在二维空间中的决策边界
逻辑回归产生线性决策边界。(不过,通过在模型中加入高阶项,您可以实现非线性决策边界。)决策树通过用各自的不等式划分自变量来构建,这导致决策边界由水平和垂直线段组成。在更高的维度中,我们不再是水平和垂直线,而是与坐标轴对齐的平面。随机森林是决策树的集成,仍然会产生这种形式的决策边界,但它们通常包含更多的部分,形成看起来弯曲的形状,实际上是由许多小的水平和垂直线段组成的。k-NN 分类器产生多边形决策边界,因为它们根据哪些有限的训练数据点最接近来划分空间。神经网络可以产生复杂的、弯曲的决策边界;这种高度的灵活性既是优点也是缺点,因为如果不小心,它可能会导致过拟合(我们稍后会讨论过拟合问题)。
研究不同分类器算法产生的决策边界可以帮助您更好地理解每个算法的工作原理;它还可以帮助您根据数据的外观选择要使用的算法(对于维度更高的数据,其中d > 2,您可以通过绘制不同变量对的二维快照来获取数据)。只需记住,涉及许多选择——要使用哪些变量,是否包括高阶项,要为超参数设置什么值等等——所有这些选择都会影响可能的决策边界类型。每当遇到一个您尚不熟悉的分类算法时,开发对其的直觉的最佳方法之一是绘制它产生的决策边界,并查看随着您调整超参数而变化的方式。
回归
监督回归也可以从几何角度来看,尽管有点难以可视化。回归算法不是基于类别预测将空间划分为有限数量的区域,而是为空间中的每个点分配一个数值;当d = 2 时,这可以绘制为热图或三维曲面。图 1-8 展示了一个例子,在这个例子中,我们首先创建了 10 个具有随机依赖变量值的随机点(在顶部图中显示,圆圈大小表示值),然后我们为一组密集点的预测值绘制了 3D 散点图,最后在使用k=3 的k-NN(左下)和随机森林(右下)时根据高度进行着色。

图 1-8:训练数据,依赖变量数值由圆圈大小表示(顶部图),以及两种非线性回归算法的三维预测曲面:3-NN(左下)和随机森林(右下)
线性回归的预测曲面(此处未显示)是一个大的倾斜平面,而这里展示的两种方法的曲面是一组有限数量的平坦区域,其中预测值保持恒定。请注意,这些区域对于k-NN 是多边形,对于随机森林是矩形;这种情况总是如此。此外,在本例中使用的超参数选择,随机森林的区域比k-NN 的区域要小。换句话说,与k-NN 算法相比,随机森林在数据空间中以手术精度切割数据;后者更像是用屠夫刀切南瓜。但这并不总是如此——这种粗糙度的比较取决于随机森林中使用的树的数量和k-NN 中使用的邻居的数量。重要的是,对于回归的更细分区就像对于分类的更灵活的决策边界:它通常在训练数据上看起来不错,但在新数据上泛化效果不佳。这将引出我们的下一个主题。
过拟合
让我们回到图 1-7 中的决策边界图。乍一看,似乎边界越灵活,算法的表现越好。这在考虑训练数据时是正确的,但真正重要的是算法在测试数据上的表现。预测分析中的一个著名问题是过拟合,即当一个预测算法过于灵活,以至于学习到了训练数据的特定细节,从而在新的未见数据上表现得更差。
在图 1-7 中,逻辑回归算法错误地分类了最左边的圆,而决策树则创建了一个长条形区域,正确地分类了这个点。如果圆形倾向于位于左边,十字形则倾向于位于右边,那么创建这个长条形区域可能会在应用到新数据时损害分类性能——如果是这样的话,这就是决策树过拟合训练数据的一个例子。
通常来说,随着预测算法灵活性的增加,训练误差倾向于不断下降,直到最终稳定,而测试误差则先下降,然后达到最小值,再上升(见图 1-9)。我们希望测试误差曲线的最低点:那是我们能够实现的最佳预测性能。它发生在算法足够灵活,能够拟合数据分布的真实形状,但又足够刚性,不会学习到仅适用于训练数据的虚假细节时。

图 1-9:训练误差与测试误差作为预测算法灵活性的函数的图示,展示了过拟合的概念
在图 1-9 中所示的普遍行为通常发生在调整超参数时:随着神经网络中神经元数量的增加、k-NN 中邻居数k的减少、决策树中分支数量的增加等,分类器的决策边界变得更加灵活。
高维灾难
有时,考虑图 1-9 中的 x 轴表示复杂性而非灵活性会有所帮助。更灵活的算法往往更复杂,反之亦然。衡量算法复杂性的一个最简单但最重要的标准是它使用的独立变量的数量。这也被称为数据的维度。如果独立变量的数量是d,那么我们可以认为该算法是在一个d维欧几里得向量空间R^(d)中输入点。对于固定数量的数据点,使用过少的独立变量往往会导致欠拟合,而使用过多的独立变量则容易导致过拟合。因此,图 1-9 也可以解释为展示随着数据维度增加而不增加数据集大小时,预测算法的错误分数发生了什么变化。
随着维度的增加而最终导致测试误差增大的现象是一个普遍现象,称为维度灾难。在处理结构化数据时,列的数量相对于行的数量较大(如基因组学等领域的常见情况),预测算法容易出现过拟合,而且许多机器学习方法中驱动的数值线性代数也会崩溃。这是一个巨大的问题,许多技术已经被开发出来以帮助应对这一问题——其中一些将在本书后续部分讨论。现在,让我们看看几何学如何为维度灾难提供一些启示。
理解维度灾难的一种方法是考虑欧几里得距离,即在任意多个维度上,像鸟飞行一样的直线距离。想象在一张方形纸上画出两对点,其中一对点彼此靠近,而另一对点彼此远离,如图 1-10 所示。

图 1-10:二维空间中两对点的绘图
让我们通过加入一些高斯噪声来扰动这些点;也就是说,我们将从双变量正态分布中绘制四个向量,并将这些向量加到四个点的坐标上。这样做会使点在随机方向上稍微移动。我们将这样做多次,每次记录扰动后左边一对点之间的欧几里得距离,以及右边一对点之间的距离。如果扰动足够大,我们偶尔会发现左边的点距离彼此比右边的点还远,但总体而言,左边扰动的欧几里得距离会小于右边扰动的欧几里得距离,正如图 1-11 中的直方图所示。

图 1-11:在图 1-10 的左侧,经过随机小幅扰动后的欧几里得距离的直方图(附近点显示为浅灰色),而右侧则是远离点的直方图(显示为深灰色)。
接下来,让我们将我们的方形纸片嵌入为一个二维平面,并将其放置在一个更高维度的欧几里得空间R^(d)中,然后重复扰动这些点并计算欧几里得距离的实验。在更高维度中,这些扰动会在更多的方向上发生。具体来说,你可以把每个点的x和y坐标用d-2 个零填充,然后对每个d个坐标添加少量噪声。图 1-12 显示了在d = 10 和d = 100 维度下进行此过程时欧几里得距离的结果直方图。

图 1-12:如图 1-11 所示的欧几里得距离直方图,不同之处在于这里的数据是在d = 10 维(左)和d = 100 维(右)下嵌入后的结果。
我们可以看到,随着维度d的增加,两个分布逐渐重叠并且越来越接近。因此,当涉及到噪声时(如现实世界中常有的情况),增加额外的维度会破坏我们区分近点对和远点对的能力。换句话说,随着数据维度的增加,数据中的信号会越来越容易被噪声掩盖,除非你确信这些额外的维度包含了额外的信号。这是一个相当深刻的洞察,通过相对简单的欧几里得几何学我们可以看到这一点!
我们还可以使用扰动来解释为什么高维度会导致过拟合。在图 1-13 中,左侧显示了四个点在平面R²中,它们被两个类别标记,且配置不可线性分割(这意味着没有高阶项的逻辑回归分类器将无法正确分类这些点)。

图 1-13:在二维空间中不可线性分割的两类数据点(左)通过将其嵌入三维空间后(右)并进行扰动后可以线性分割。
即使我们对这些点进行少量噪声扰动,也无法找到一条线来分隔这两类数据。在图的右侧,我们通过为每个点添加一个常数作为第三坐标,将这些点嵌入了R³。(几何上,这意味着我们把原本的R²平面放置在这个三维空间的xy平面之上。)然后我们对这些点进行小幅扰动。经过这次三维扰动后,我们可以看到这两类数据变得可线性分割,这意味着逻辑回归分类器在这里将能够达到 100%的准确率。(在图中,我们勾画了一条倾斜的平面来分割这两类数据。)
刚开始,这种额外的灵活性看起来像是一件好事(有时候确实如此!),因为它让我们能够提高训练准确率。但请注意,我们在三维空间中的分类器并没有学会以一种有意义的方式分开各个类别,以便能在新的、未见过的数据上进行泛化。它实际上只是学会了从某个特定扰动中提取垂直噪声。换句话说,增加数据的维度往往会增加分类器拟合训练数据中噪声的可能性,而这恰恰是导致过拟合的原因。
也有一个几何角度来解释由维度诅咒所引起的计算挑战。想象一个边长为 10 单位的正方形,面积为 100 单位。如果我们再添加一个轴,那么我们就得到了一个体积为 1,000 单位的立方体。如果再加一个,我们就得到了一个四维立方体,体积为 10,000 单位。这意味着数据会变得更加分散——随着维度的增加,数据变得更加稀疏。如果我们将一个低维空间中 100 个点的相对密集数据集放入一个 1,000 维的空间中,那么在这个空间中就会有很多地方距离这 100 个点都很远。一个人在这个空间中四处寻找点,可能需要付出大量努力才能找到一个。如果他有限的时间框架内进行寻找,他可能根本找不到任何点。简单来说,高维度下的计算更困难,因为需要跟踪更多的坐标,数据点也更难找到。
在接下来的章节中,我们将通过几何学探讨几种处理高维数据的方法,包括减少数据维度、创建能够显式建模数据几何以拟合模型的算法,以及计算在高维空间中比欧几里得距离更有效的距离。设计用于处理高维数据的机器学习算法领域仍在不断发展,这要归功于基因组学和蛋白质组学等学科,在这些领域中,数据集通常包含数百万或数十亿个独立变量。人们常说需求是发明之母,的确,许多机器学习方法正是在应对高维现实世界数据集的需求下发明出来的。
非结构化数据
今天大多数数据并不是自然存在于电子表格格式中的。比如文本数据、网络数据、图像数据,甚至是视频或声音剪辑数据。每种格式都有其自身的几何特征和分析挑战。让我们开始探索一些这些类型的非结构化数据,看看几何学如何帮助我们理解和建模这些数据。
网络数据
在下一章,你将获得与网络相关的官方定义,但通过处理社交媒体,你或许已经对网络有了一定的了解。Facebook 的好友关系构成了一个无向网络(节点是 Facebook 用户,边是用户之间的好友关系),而 Twitter 账户则构成了一个有向网络(有向边,因为你既有关注者,也有你关注的账户)。网络数据本身没有什么欧几里得空间或电子表格结构的特点。近年来,深度学习已经从传统的欧几里得电子表格设置扩展到一种更为一般的结构——黎曼流形(我们将在第五章讨论);这一概念的主要应用(称为几何深度学习)就是网络数据,尤其是在社交媒体分析中的应用。
例如,Facebook 使用几何深度学习算法自动检测虚假“机器人”账户。除了查看与每个账户相关的传统结构化数据,如人口统计信息和好友数量,这些检测算法还利用了每个账户好友网络的丰富非欧几里得几何特征。从直观上来说,很容易创建看起来有着真实兴趣和好友数量的虚假账户,但要做到使这些账户的好友网络结构类似于真实人群形成的自然好友网络却不容易。网络几何提供了衡量这种“相似性”的方法。
几何深度学习还被用于通过将故事在网络中的传播模式转化为监督学习算法的独立变量,来检测 Twitter 上的假新闻。尽管本书不会涉及几何深度学习,但在处理网络数据时仍有很多事情可以做和需要讨论。例如,我们可以利用网络的几何属性来提取数值变量,从而将网络数据带回到熟悉的结构化数据领域。
图像数据
另一种“非结构化”数据实际上具有丰富的几何结构,那就是图像数据。如果图像是灰度的,可以将每个像素视为一个数值变量;如果是彩色图像(红色、绿色和蓝色值),则每个像素可以视为三个变量。然后,我们可以尝试使用这些变量通过无监督算法对图像进行聚类,或者使用有监督算法进行分类。但是,进行这一操作时的问题在于缺乏空间意识。相邻的像素对与图像两端的像素对被视为相同。深度学习的一个重要分支——卷积神经网络(CNN)被开发出来,目的是将空间意识引入图像。CNN 通过在图像上滑动小窗口,从像素值中创建新的变量。这一领域的成功在很大程度上使得深度学习广泛获得公众的赞誉,因为 CNN 打破了所有图像识别和分类任务的记录。
让我们考虑一个简单的案例,假设有两张图像可能被纳入用于保护工作的大型动物分类数据集中(见图 1-14)。

图 1-14:克鲁格国家公园的象(左)和母狮(右)
动物们展示在自然环境中,那里树叶、树枝和光照各不相同。它们有不同的分辨率。每个动物的颜色也不同。与动物及其周围物体相关的形状存在差异。手动推导出有意义的独立变量以对这些图像进行分类是困难的。幸运的是,卷积神经网络(CNN)被设计来处理这种图像数据,并自动创建有用的独立变量。
基本思想是将每张图像视为一个数学表面(见图 1-15),然后在这个表面上行走,创建出其显著特征的地图——峰值、谷底和其他相关的几何事件。CNN 的下一层在这张地图上继续行走,并创建出其显著特征的地图,随后传递到下一层,以此类推。最终,CNN 将每张图像转换为一系列地图,这些地图按层次结构编码图像的内容,最终层是实际用于分类的地图。对于这些动物图像,第一张地图可能会识别图像中的高对比度区域。接下来的地图可能会将这些区域组合成形状的轮廓。再接下来的地图可能会标明哪些形状是动物。另一个层次可能会定位动物体内的特定解剖特征——这些解剖特征随后可以作为最终物种分类的基础。
CNN 构建这些地图的精确方式是通过监督训练过程内部学习的:随着算法被提供带标签的数据,每一层神经元之间的连接会形成、断裂,然后再次形成,直到最终层对分类任务尽可能有帮助。我们将在第十章进一步探讨 CNN 及其量子版本。

图 1-15:在几何上视为 3D 数学表面的图 1-14 中的母狮头部。
使用计算几何方法来量化峰值和谷值在图像识别和分类之外还有应用。科学家可能想要了解科学现象的动态过程或结构,比如水流或光线在物体上的流动。物体的峰值、谷值和轮廓会影响光线撞击物体时的散射方式,也会决定液体在物体上流动的方式。我们将在本书的后面部分讨论如何挖掘相关峰值、谷值和轮廓的数据。
文本数据
近年来崭露头角的另一种“非结构化”数据形式是文本数据。这里,数据带有的结构不像图像那样是空间性的;而是语言性的。最先进的文本处理(例如,谷歌用于处理搜索短语或 Facebook 和 Twitter 用于检测违反平台政策的帖子)利用深度学习来创建一种称为向量嵌入的东西,将文本转换为**Rd,其中每个单词或句子都表示为欧几里得向量空间中的一个点。每个单词或句子的坐标是通过阅读大量文本数据学习到的,并且深度学习算法以一种方式选择它们,从本质上将语言意义转化为几何意义。我们将在第九章中探讨深度学习文本嵌入。
**例如,我们可能想要可视化关于文档的不同变量集。由于变量形成了一个高维空间,我们无法以人类可视化的方式绘制它们。在后面的章节中,我们将学习将高维数据映射到低维空间的几何方式,以便数据可以在图中轻松可视化。我们可以根据文档类型或其他相关文档属性在这些图中使用颜色或不同形状进行装饰。如果类似的文档在这些图中聚集在一起,那么涉及的一些变量很可能会帮助我们区分文档。具有未知属性但对这些变量进行了测量的新文档可以通过分类算法进行分组。我们将在第九章进一步探讨这一点。
摘要
本章简要回顾了传统机器学习的主要概念,但是在这些概念上加入了几何视角,这对大多数读者可能是新鲜的。在这次回顾中,还讨论了数据结构的含义。主要的观点是,基本上所有的数据都有意义的结构,但这种结构通常是几何性质的,需要几何工具将数据整理成更传统的电子表格格式。这是本书将在全书中更深入探讨的主题。本章还暗示了电子表格数据中一些重要的几何隐藏内容。本书的主要目标之一是展示如何利用这些隐藏的几何特性来提升机器学习算法的性能。
在第二章和第三章,我们将深入探讨用于分析网络数据的算法,包括社交网络和地理网络。这些算法涵盖了用于理解网络结构及个体在网络中角色的本地和全局度量标准,为网络数据开发的聚类方法,用于预测网络中新边的链接预测算法,以及用于理解网络中过程或传染病传播的工具。****
第四章:网络的几何结构

网络,在第一章中我们曾简要接触过,已经在我们生活中扮演着越来越重要的角色;因此,网络数据在数据科学中的作用也越来越大。我们如何衡量社交媒体上用户的影响力?或者评估计算机网络对黑客的抗压能力?或者识别连接不同社交群体的人?这些问题都涉及到网络的几何结构,它们都是我们将在本章探讨的概念的例子。
本章将从一个简短的动机部分开始,论证为什么网络数据是现代数据科学中的一个重要话题,并且大大受益于几何推理。接着,我们将介绍网络理论中的基本概念和定义,它们源自图论这一数学语言。本章的主要内容将是对与网络及其顶点相关的各种量的引导性介绍。最后,我们将简要回顾几种在文献中广泛研究并且在 R 语言中容易生成的随机网络类型。
网络科学简介
网络科学,研究实体通过相互关系的方式进行的学科,是一个重要的跨学科领域,自从社交网络的兴起以来,已经在数据科学中得到了广泛应用。正如我们在第一章中看到的,网络数据在传统意义上是“非结构化”的,但在其他方面它却高度结构化。从数学角度来看,网络根植于一种叫做图论的学科,它将实体和关系提炼成其抽象本质。网络在几何上是丰富的,但它们的几何形态不同于我们通常所理解的欧几里得几何中的角度和直线。为了从网络中提取洞察力,我们必须摆脱电子表格中的欧几里得世界,转而拥抱一种更加奇特的几何学,在这种几何学中,球体看起来与我们习惯看到的圆形物体完全不同。
让我们考虑一个社交媒体的例子。像 Facebook 这样的社交平台上的用户形成了一个网络,距离可以通过连接两个个体的最小友谊数量来定义。这种距离的概念支撑了几种衡量用户在网络中中心性的方法,我们可以用这些方法来量化“影响者”。例如,我们可以计算与 Facebook 用户账户直接连接的朋友数量,或者计算有多少朋友的朋友存在。一个人可能没有很多直接的联系,但可能有许多连接良好的朋友。换句话说,即使某个用户的直接社交圈很小,他也可能拥有一个很大的影响力圈。网络的几何学还允许我们通过衡量一个用户的网络与其他用户的网络相比有多不可能,来检测异常值;这有助于社交媒体平台自动检测不真实的账户。
网络基础的异常值检测在最近一起关于选区划分(选区操控)的问题中得到了一个迷人的应用。在 2018 年之前,宾夕法尼亚州的国会选区地图被广泛认为是支持共和党的党派划分结果,但法院并不信服,直到一组专家引入了网络科学。他们展示了可以将选区地图视为网络,并通过在地图网络空间中计算随机游走来统计性地探查这些网络的几何结构,结果发现宾夕法尼亚州的地图偏离了平均值几个标准差。当时正在考虑的新地图恰好位于地图钟形曲线的中间。他们得出结论,旧地图极不可能是自发形成的;它如此不寻常,以至于必须是地图绘制者(他们依赖当时在职的共和党人)故意设计的,目的是增加共和党席位的数量。相比之下,新地图则典型得多(且更公平)。法院被这一网络分析说服,于是 2018 年废除了旧地图,采用了新地图。
即使在那些表面上看起来与网络无关的情景中,有时也可以将数据视为网络数据——这样做就可以利用一套丰富的工具,这些工具借鉴了网络几何的非凡特性。
本章重点介绍了网络的几何结构及其如何用于定义一系列度量,这些度量量化了网络形状和结构的各个方面。在下一章中,我们将应用这些度量来探索机器学习和其他形式的网络数据分析。让我们正式开始我们的旅程。
网络理论基础
网络传递的是实体之间的成对关系,实体可以是个人、物体、项目等等。这些实体通过顶点(也叫节点)表示,而实体对之间的关系则通过边连接相应的顶点。以下是一些已经作为网络研究的实体和关系的例子:人们之间的电话和短信、在生物通路中相互作用的蛋白质、通过道路连接的城镇、通过页面链接连接的网站、在同一任务中被激活的大脑部分、语言中词语或词性之间的关系——这只是流行例子的一小部分。
在绘制网络时,顶点通常用点表示,有时还会用符号装饰,以便我们知道每个顶点代表的是哪个;边通常是直线段,尽管有时为了避免人工边交叉,可能会选择将一些边绘制成曲线弧。重要的是顶点的集合和它们之间的边,而不是边的长度、角度或顶点的位置。事实上,如图 2-1 所示,同一网络可以有不同的绘制方式。
这些网络具有相同的顶点和连接顶点的相同边,但这些关系的绘制方式有所不同。无论我们如何可视化这些关系,它们的基本结构不会改变。

图 2-1:同一网络的两种不同绘制方式。它们具有相同的顶点和相同的连接顶点的边,但关系的绘制方式有所不同。无论我们如何可视化这些关系,它们的基本结构并没有变化。
定向网络
如果边表示单向关系(即它们从一个顶点指向另一个顶点,前者称为源,后者称为目标),那么网络就是定向的;否则,边表示的是相互关系,网络就是无向的。例如,对于电话交谈,我们可以创建一个无向网络,在每两个有过通话的人之间绘制一条边,或者我们可以创建一个定向网络,用边表示从源人物到目标人物的外拨电话。
具体来说,假设我们有三位同事:Sadako、Pedro 和 Georg。Sadako 是项目负责人,因此她会联系 Pedro 和 Georg。Pedro 联系 Georg,询问项目中与工程方面有关的问题,但 Georg 既没有联系 Pedro,也没有联系 Sadako。Pedro 不会联系 Sadako,因为当 Sadako 联系他时,他已经收到了指示。图 2-2(a)展示了这三位同事的无向网络,而图 2-2(b)展示了定向网络。

图 2-2:三位同事之间的电话网络,其中(a)是无向的,(b)是定向的
定向网络的其他例子包括旅行路线、机器和社会过程、通过针头传播追踪流行病,以及生物过程模型。从数学角度讲,Facebook 和 Twitter 之间最大的区别在于,Facebook 是一个无向网络(朋友关系是相互的),而 Twitter 是一个定向网络(用户既有粉丝,也有被关注的账户)。
R 中的网络
在计算机中表示网络的两种主要方式。边列表只是按任意顺序列出网络中所有边,通过命名每条边的两个顶点(如果网络是有向的,则第一个顶点被视为源,第二个顶点被视为目标)。在 R 中用于处理网络数据的一个有用包是 igraph 库(在 Python 中也有类似的命令和语法)。要从边列表创建图 2-2(b)中的有向网络,可以使用列表 2-1 中的代码。
library(igraph)
edges<-rbind(c("Sadako","Pedro"),c("Sadako","Georg"),c("Pedro","Georg"))
g_colleagues<-graph.edge(edges,directed=T)
列表 2-1:从边列表生成图 2-2(b)中的有向网络的脚本
网络的另一种表示形式是电子表格。如果一个网络有n个顶点,其邻接矩阵是n×n的矩阵,其行和列由顶点索引,其中(i, j)条目中的 0 表示从顶点i到顶点j没有边,而该条目中的 1 表示存在这样的边。如果网络是无向的,则邻接矩阵是对称的(等于其自身的转置,意味着在交换其行和列时保持不变),因为在这种情况下,从顶点i到顶点j有边与从顶点j到顶点i有边是相同的。图示 2-2 提供了使用 R 代码从邻接矩阵而不是边列表构建前述有向网络的代码。
library(igraph)
adjmat<-matrix(c(0,0,0,1,0,0,1,1,0),nrow=3)
rownames(adjmat)<-c("Sadako","Pedro","Georg")
colnames(adjmat)<-c("Sadako","Pedro","Georg")
g_colleagues<-graph_from_adjacency_matrix(adjmat,mode="directed",weighted=T)
列表 2-2:从邻接矩阵生成图 2-2(b)中的有向网络的脚本
邻接矩阵方法的一个主要优势是将网络置于线性代数的框架中,这里有许多强大的工具可用。例如,我们可以利用邻接矩阵的谱理论(特征值和特征向量)来衡量网络中的中心性。邻接矩阵也可以很容易地推广到加权网络;通过允许任意数作为条目(而不仅仅是讨论过的二进制 0 和 1 条目),我们可以为每条边分配一个实数权重,传达该边表示的关系的强度。实际上,这可以用来表示许多不同的重要概念:电话网络中同事之间的通话量,交通网络中位置之间的距离等。你可以把无权网络看作是所有边权重均等于 1 的加权网络。事实上,这就是为什么在图示 2-2 中,尽管我们想要创建无权网络,我们还是将weighted参数设置为T(true)的原因,否则 igraph 会以不同的方式解释邻接矩阵。
网络中的路径和距离
如果两个顶点通过一条边相连,则称它们为邻居。在网络中,如果两条边有一个公共顶点,则它们是相邻的。网络中的路径是一系列相邻的边。如果网络是有向的,则路径中的所有边必须具有兼容的方向。例如,在图 2-2(b)中,我们有一条从 Sadako 到 Pedro,再到 Georg 的两条边的路径,还有一条从 Pedro 到 Georg 的一条边的路径,但从 Pedro 到 Sadako 再到 Georg 不是一条路径,因为这些边的方向不一致。
路径的长度有两种不同的含义,取决于网络是加权的还是无加权的。在无加权网络中,路径的长度是路径中边的数量;在加权网络中,路径的长度是路径中各边权重的总和。两个顶点之间的网络距离是连接它们的最短路径的长度,前提是从一个顶点到另一个顶点存在路径(如果没有路径,网络距离是未定义的)。我们—包括我们自己—通常会说“最短”路径,而不是“最小长度”路径,因为这样听起来更自然。这对于加权网络来说有点误导,因为最小长度路径实际上是权重最小的路径,而不一定是路径中边数最少的最短路径。然而,如果我们小心一点,这只是一个术语上的小瑕疵,我们可以接受。
作为一个例子,让我们考虑图 2-3 中的加权无向网络,表示四个城镇及其之间道路的长度(单位:英里)。

图 2-3:城镇连通性图及连接城镇之间的道路英里数
V2 和 V3 之间的最短路径是经过 V4 的 8 英里路程,而不是直接连接这两个城镇的 12 英里道路。因此,V2 和 V3 之间的网络距离是 8 英里,而不是 12 英里。请注意,这张图中的边和路径的物理长度并不代表由权重定义的长度;换句话说,网络图中的欧几里得距离与网络距离无关!通过 igraph 绘制的网络中,顶点的位置是出于美学原因选择的(例如,为了最小化边的交叉),而不是反映边的权重。刚开始时可能有些难以适应,但随着时间的推移,会变得很自然。列表 2-3 提供了创建和绘制此示例网络的 R 代码。
#create symmetric matrix of town connections and miles between each town
towns<-matrix(c(0,0,0,4,0,0,12,2,0,12,0,6,4,2,6,0),nrow=4)
#label the rows and columns so the towns have names
rownames(towns)<-c("V1","V2","V3","V4")
colnames(towns)<-c("V1","V2","V3","V4")
#create a weighted undirected network from this adjacency matrix
library(igraph)
g_towns<-graph_from_adjacency_matrix(towns,mode="undirected",weighted=T)
#plot town graph with edges labeled by weights
plot(g_towns,edge.label=E(g_towns)$weight,main="Plot of Connected Towns by Road Miles",vertex.color=2,vertex.size=20)
列表 2-3:生成图 2-3 中连接的城镇网络并绘制它的脚本
网络距离在现实世界中的问题中可能起着重要作用。在 2018 年刚果民主共和国东部的埃博拉疫情爆发期间,城镇之间有限的物理路线影响了疫情的传播、医疗物资和人员的供应链物流,以及受影响城镇和没有活跃病例的城镇之间的人口流动。
关于加权网络的一个注意事项:我们往往认为相互接近的顶点(由网络距离定义)是最相关或连接最紧密的。这意味着边的权重越小,所代表的关系就越强。因此,在设置网络中的权重时,你通常会希望使用倒数。例如,在加权电话网络中,而不是将 A 和 B 之间的权重设置为它们之间的通话次数c[AB],你应该将其设置为倒数 1/c[AB],这样与彼此频繁通话的人在加权网络中会更接近(而不是更远)。在第三章中,我们将重新审视图 2-3 中的城市网络,并将权重倒过来,使它们代表接近性而不是距离。
为了开始探索网络距离所建立的几何结构,我们现在将转向一些网络中的中心性(也可以理解为重要性或影响力)概念。由于我们在本章中将始终依赖于 igraph 库,我们将不再在代码片段中包含library(igraph);因此,在运行以下任何代码示例之前,请确保加载该库。
网络中心性度量
测量网络中每个顶点的中心性或重要性,可以让你手动分析网络的结构和功能行为。它还经常用于特征提取,因为中心性度量提供了数值特征,这些特征可以输入到传统的监督和无监督机器学习算法中,正如我们在第三章中将看到的那样。换句话说,中心性度量为网络数据提供了一种更传统的电子表格结构。量化顶点中心性的方法有很多,几乎所有方法都涉及前一节中的一些概念——路径、网络距离和邻接矩阵。
中心性有许多现实世界的应用。在流行病学中,接触追踪网络中更中心的个体往往会传播疾病给更多人,而较不中心的个体传播的疾病较少。事实上,中心个体通常与更多人相连,此外,中心个体往往会将一些原本不太可能相遇的群体连接起来——从而为这些群体之间提供传播疾病的桥梁。在社交媒体中,中心个体就是那些“网红”,他们的意见被许多人听到并广泛传播。在市场营销中,中心个体可以作为广告活动的有利媒介。在犯罪学中,识别毒品分销或有组织犯罪网络中的中心个体可以帮助执法机构更有效地开展行动。在科学研究中,引用网络中的中心性有助于揭示高影响力的出版物。
中心性度量指标远比本章所能涵盖的要多,因此我们将重点介绍一些在 igraph 库中实现的流行指标。
顶点的度
顶点的最基本中心性度量是其度,按照定义,它是与该顶点相连的边的数量。在有向网络中,这可以分为两个部分:入度计算的是将该顶点作为目标顶点的边的数量,出度计算的是将该顶点作为源顶点的边的数量。在 Facebook 网络中,你的度是你的朋友数量;在 Twitter 中,你的入度是你的粉丝数量,而你的出度是你关注的账户数量。回到图 2-3,城镇 V2 和 V3 的度都是 2,而 V1 的度是 1,V4 的度是 3。
在加权网络中,你还可以衡量一个顶点的强度(也称为加权度),即与该顶点相连的所有边的权重之和。在图 2-3 中,城镇 V1、V2、V3 和 V4 的强度分别为 4、14、18 和 12。由于无权网络可以视为所有边的权重均为 1 的加权网络,因此顶点的度实际上是强度的一个特例。
尽管其简单性,顶点的度是一个有价值的度量。它是大多数社交媒体平台公开列出的每个账户的唯一数值指标,通常用于确定影响者在营销活动中推广产品时的报酬。然而,它也有显著的局限性。顶点的度衡量的是该顶点直接连接网络的大小,但它并没有反映网络的结构,也没有考虑这些直接连接之外的内容。为了说明这一点,假设有一个 Twitter 用户拥有 10,000 个粉丝,而这些粉丝每个只有少量粉丝;现在将此与另一个只有几百个粉丝,但其中一些粉丝是极具影响力的用户进行比较。虽然第一个用户的度更高,但哪个用户的推文更可能最终获得更多转发?这个例子提示了网络涉及的既有广度又有深度,而度更侧重于前者。
另一个关于度的示例,说明度能捕捉到什么,不能捕捉到什么,假设在一个接触追踪网络中有两个个体。假设一个用户有更多的联系人(因此度更高),但这些联系人大多数彼此之间已经互相关联,而另一个用户有较少的联系人,但这些联系人分布在多个几乎没有互动的社区中。(稍后在本章中,我们将看到这种情况的具体例子。)在疫情爆发期间,哪个个体的流行病学风险更大?
度数的这两个限制——忽略网络深度和忽略社区桥接属性——是我们必须深入研究网络几何学的主要原因之一。那么,接下来让我们简要地浏览一下超越度数的顶点中心性度量方法。
顶点的接近度
如何判断一个顶点是位于网络中心附近,还是位于边缘附近呢?一个顶点的接近度,定义为该顶点与网络中每个其他顶点之间的网络距离之和的倒数,旨在捕捉这一区别。一个位于网络中心的顶点与其他顶点的距离相对较小,而一个位于边缘的顶点可能与某些顶点的距离适中,但与网络“另一端”的顶点的距离较大。这意味着中心顶点的距离之和小于边缘顶点的距离之和;倒数这个和会反转这个关系,使得中心顶点的接近度得分大于边缘顶点的得分。
在图 2-3 中,你可能直观地猜测 V4 是最中心的,V2 和 V3 是适度中心的,而 V1 是最边缘的。实际上,如果我们忽略边的权重,并将其作为一个无权重的网络来计算接近度得分,我们得到 V1、V2、V3 和 V4 的接近度分别为 0.20、0.25、0.25 和 0.33。例如,V2 的接近度是 1/(1 + 1 + 2)。当使用边的权重时,我们得到的接近度得分为 0.05、0.06、0.04 和 0.08,因此 V4 仍然是最中心的,但现在 V3 是最边缘的;这是因为边的权重使得 V3 与其他顶点的网络距离相对较大。
顶点的介数
一个顶点的介数通过计算有多少条路径经过该顶点来衡量中心性;更精确地说,它是网络中所有其他顶点对之间最短路径的分数之和,这个分数表示每对顶点之间的最短路径中经过该顶点的比例。当考虑图 2-3 作为一个无权重的网络时,V1 的介数为 0,因为没有剩余顶点之间的最短路径经过 V1。V2 和 V3 也是如此。然而,V4 的介数是 2 = 1 + 1 + 0,因为 V1 和 V2 之间有一条最短路径经过 V4,V1 和 V3 之间有一条最短路径经过 V4,而 V2 和 V3 之间的最短路径不经过 V4。
在图 2-4 中,每个顶点的介数得分为 0.5。例如,对于 V1,V2 和 V4 之间的单边路径不经过 V1,V3 和 V4 之间的单边路径也不经过 V1,而 V2 和 V3 之间有两条最短路径,其中一条经过 V1,合计得到介数得分为 0 + 0 + 1/2。

图 2-4:一个四个顶点连接成正方形的网络
如果你将网络看作是编码某物(材料、信息、疾病、交通等)如何在实体之间流动的方式,那么最短路径就是最有效的旅行路线。中介中心性衡量的是移除一个顶点对这些路线的破坏程度。例如,在一个货运配送网络中,一个顶点的中介中心性表示如果某个配送中心关闭(不包括以该配送中心为起点或终点的路线),有多少条运输路线会受到影响,并按影响的程度加权。图 2-3(视为无权网络)中,移除 V1 并不影响其他城市之间的运输路线(中介中心性为 0),但移除 V4 会完全中断两条运输路线(中介中心性为 2)。在图 2-4 中,移除 V1 会影响 V2 和 V3 之间的运输,但只中断它们之间一半的运输路线(中介中心性为 0.5)。中介中心性在估算破坏潜力方面有很多实际应用;例如,它可以帮助识别计算机网络中需要保护的重要服务器(或者在对抗性攻击中最有效的攻击目标!)。
尽管接近中心性和中介中心性衡量的是顶点中心性的不同方面,但它们都基于网络中的最短路径。两点之间的最短路径在几何学中有一个特殊的名称,叫做测地线,我们将在第四章、第五章和第六章中更广泛地讨论这一概念。
本节中我们将介绍的所有剩余的中心性度量都是基于邻接矩阵的,可以将它们视为著名的 PageRank 算法的变种,Google 最初使用该算法(并且在某些方面仍在使用)来通过估算在有向网络中顶点的关联性来对搜索结果进行排名,其中顶点是网站,边是链接。接下来的这些中心性度量涉及的数学更加复杂,但我们会尽量突出主要思想和大致框架。实际上,发展对这些中心性分数所传达信息的直觉要比理解它们计算的细节更为重要。
特征向量中心性
基于邻接矩阵的中心性度量旨在捕捉基本思想:一个顶点的重要性由它所连接的顶点的重要性决定。这就是之前提到的网络深度概念的体现。例如,在社交媒体上,重要的并不仅仅是你拥有多少个粉丝,更重要的是你的粉丝拥有多少粉丝,他们的粉丝又有多少粉丝,依此类推。
让我们把这个思想说得更精确一些。假设我们想为每个顶点 i 分配一个重要性得分 x[i]。一个简单的模型是,假设每个顶点的重要性与其邻接顶点的重要性的加权和成正比:
x[i] = c∑[^(a[ij]x[j])]
其中,求和是针对与顶点 i 邻接的顶点 j,a[ij] 是顶点 i 和顶点 j 之间边的权重,c 是一个比例常数,我们假设它与 i 无关。这个公式可以表示为矩阵方程:
x⃗ = cAx⃗
其中,A 是网络的邻接矩阵。你可能还记得线性代数中的内容,这个方程规定了顶点重要性向量 x⃗ 是邻接矩阵的一个 特征向量,而 1/c 是相应的 特征值。当将矩阵视为线性变换时,特征向量是被拉伸但不旋转的方向,特征值则衡量这些方向被拉伸的程度。
矩阵通常有许多不同的特征向量和特征值,并且特征值不一定是实数,所以乍一看,前述的顶点分配问题可能有许多不同的解——其中一些可能涉及复数值。然而幸运的是,如果我们不允许负的边权重和重要性得分,那么称为 佩龙-弗罗贝纽斯定理 的定理保证我们可以找到唯一的实数解。换句话说,满足非负性条件时,总是存在一种唯一的方式来为网络中所有顶点分配重要性得分,从而满足我们所有的线性邻居影响条件。几乎是这样:为了保证唯一性,我们需要对重要性得分进行归一化(例如,按比例缩放,使得网络中任何顶点的最大重要性得分为 1)。这样做就能得到顶点的 特征向量中心性 得分。
在图 2-3 中,当将网络视为无权网络时,V1、V2、V3 和 V4 的特征向量中心性得分(四舍五入到小数点后两位)分别为 0.46、0.85、0.85 和 1。这与我们直觉一致,V4 是最中心的,而 V1 是最不中心的。当作为加权网络计算时,使用该图中显示的边权重,得分则分别为 0.16、0.91、1 和 0.59。因此,在加权网络中,V1 仍然是最不中心的,但最中心的是 V3。
特征向量中心性(eigenvector centrality)的主要观点是,邻近特征向量中心性得分较高的顶点,其特征向量中心性也较高。用社交网络的术语来说,这意味着你的重要性由你朋友的重要性决定。
我们可以通过从随机游走的角度更精确地解释特征向量中心性。假设你从一个随机顶点开始,不断地选择一个与你当前顶点相连的边来进行随机行走。如果网络是无权的,那么你以相等的概率选择这些边,而如果网络是加权的,则选择边的概率与边的权重成正比。特征向量中心性得分与你在这些随机游走中花费在每个顶点的时间比例成正比。例如,如果网络代表的是万维网(其中顶点是网站,边是链接),那么特征向量中心性反映了如果用户只是随机点击链接,每个网站所获得的流量。
特征向量中心性的一个缺点是,如果两个网络部分之间没有路径连接,随机游走者永远无法在这两部分之间移动。换句话说,每个随机游走者只能局限于它开始时所在的“岛屿”(或者用更数学化的术语,连通分量)。对于有向网络,这个问题尤其严重,因为边只能朝一个方向遍历:如果随机游走者到达死胡同,它将永远被困在那里。帮助随机游走者越过岛屿和死胡同的一种方法是允许它们随机跳跃到网络中的不同位置。这正是我们接下来要看的度量方法的主要思想。
PageRank 中心性
Google 的PageRank 中心性只是特征向量中心性的一个小修改;它在计算特征向量之前,将邻接矩阵替换为一个缩放版本。在图 2-3 中,V1、V2、V3 和 V4 的 PageRank 分数,计算为一个无权网络,分别为 0.13、0.25、0.25 和 0.37。
理解 PageRank 的最佳方式是从随机游走的概率角度来看。我们与特征向量中心性时玩的游戏相同,只不过现在每一步有两种可能性:随机游走者要么像之前一样穿越一条相连的边,要么直接跳到网络中的一个随机顶点。在万维网的例子中,这意味着人们既可以点击链接,也可以直接在浏览器中输入 URL。跳跃的能力帮助随机游走者探索网络的更大范围,这有助于提升这个中心性分数所捕捉的信息,相比于特征向量中心性,它能提供更多的网络覆盖。
Katz 中心性
另一个有用的中心性度量是Katz 中心性(有时也称为Bonacich 中心性或alpha 中心性),它本质上是度数概念的“高阶”扩展。在一个无权网络中,Katz 中心性是一个加权和,表示可以通过长度为 1 的路径到达的顶点数量(这与度数相符)、可以通过长度为 2 的路径到达的顶点数量、可以通过长度为 3 的路径到达的顶点数量,依此类推。这个加权和中的权重由路径长度和一个用户指定的“衰减”参数(称为alpha)决定,alpha 的取值范围从 0 到 1。更准确地说,长度为d的路径的权重为α^(d)。这意味着,越远的顶点,其对加权和的贡献越小。
例如,在社交网络或社交媒体中,你的 Katz 中心性最大贡献者是你的朋友数量,接下来最大贡献者是这些朋友的朋友数量,依此类推。简而言之,Katz 中心性是度数的一个更复杂版本,深入探讨了你网络的整体连接性。事实证明,特征向量中心性是 Katz 中心性在衰减参数趋近于某个特定值时的极限。然而,在选择参数 alpha 时要小心;你应该始终选择它小于网络的谱半径的倒数(我们将在“全局网络度量”部分讲解);如果你不这样做,igraph 不会给你报错或警告信息——你只是会得到一些不合理的值,例如某些顶点的负得分。
中心节点与权威节点
另一种推广特征向量中心性的方式是为每个顶点提供两个独立的重要性得分,而不仅仅是一个。最常见的形式被称为权威性和中心性。从概念上讲,权威性中心性衡量的是网络中多少知识储存在某个顶点,而中心性衡量的是一个顶点有多好地知道如何找到这些知识(即快速访问附近顶点中存储的信息)。这两者是相互关联的:强大的中心节点往往连接到强大的权威节点。中心节点通常在相关顶点之间有很高的连接率,这有助于快速共享信息。
在示例社交网络中度量中心性
为了更好地理解所有这些顶点中心性度量,可以考虑一个比我们之前考虑的更有趣的网络示例。Listing 2-4 中的脚本加载并绘制了一个来自文件的网络,该文件表示本书其中一位作者(Farrelly)的社交网络。你可以在本书的网页上找到这个数据集及其他文件:nostarch.com/shapeofdata。
#load data including no header
mydata<-as.matrix(read.csv("SocialNetwork.csv",header=F))
#convert data to graph
g_social<-graph_from_adjacency_matrix(mydata,mode="undirected",weighted=T)
#plot graph
plot(g_social,main="Farrelly's Social Network",vertex.size=15,vertex.label.cex=0.5,vertex.color=2)
清单 2-4:一个脚本,用于加载社交网络数据集,将其转换为图对象,然后绘制图形
图 2-5 显示了生成的网络图(每次运行该脚本时,结果会略有不同)。

图 2-5:Farrelly 社交网络数据集的图,展示了她的医学院服务小组(上方簇)和退伍军人组织小组(下方簇)之间的连接,其中顶点 7(即 Farrelly 本人)充当了桥梁
发展中心性度量直觉的最佳方法之一是将其绘制为顶点大小参数。(更一般来说,使用顶点大小来展示与网络顶点相关的任何数值属性是一种出色的可视化技术——这可以视为气泡图在网络中的应用。)由于不同中心性度量的范围各不相同,接下来我们将重新缩放每个度量值,使其最大值为 20,因为这似乎能提供比较清晰的图形。清单 2-5 提供了我们用来绘制每个度量的 R 代码。
#betweenness
plot(g_social,vertex.size=20*betweenness(g_social)/max(betweenness(g_social)),vertex.label.cex=0.8,vertex.color=2)
#closeness
plot(g_social,vertex.size=20*closeness(g_social)/max(closeness(g_social)),vertex.label.cex=0.8,vertex.color=2)
#eigenvector centrality
plot(g_social,vertex.size=20*eigen_centrality(g_social)$vector,vertex.label.cex=0.8,vertex.color=2)
#PageRank centrality
plot(g_social,vertex.size=20*page_rank(g_social)$vector/max(page_rank(g_social)$vector),vertex.label.cex=0.8,vertex.color=2)
#Katz centrality (with alpha parameter set to 0.2)
plot(g_social,vertex.size=20*alpha_centrality(g_social,alpha=0.2)/max(alpha_centrality(g_social,alpha=0.2)),vertex.label.cex=0.8,vertex.color=2)
清单 2-5:一个脚本,用于为 Farrelly 社交网络数据集中的每个中心性度量创建气泡图网络图
我们先从接近中心性和介数中心性开始,如 图 2-6 所示。

图 2-6:Farrelly 社交网络数据中接近中心性(左)和介数中心性(右)的气泡图
这里的接近得分似乎能够捕捉到我们期望的结果。位于网络中心的顶点较大,而位于外围的顶点较小。注意,这种中心性概念是基于网络的全局几何形态。例如,V10 的接近中心性得分最高,因为它在整个网络中居于中心位置,尽管它对于两个主要簇(医学院朋友和退伍军人朋友)来说是外围的。
介数中心性(如你所记,旨在捕捉当移除某个位置时,会最大程度地破坏网络流动的地方)为 V7 和 V10 提供了比所有其他顶点更大的得分——这两者是连接网络中两个主要簇的桥梁。V14 的介数得分也相对较大,尽管比 V7 和 V10 小,这表明许多(但不是所有)两个主要簇之间的最短路径都会经过这个顶点。
接下来,我们来看一下 图 2-7 中显示的特征向量中心性和 PageRank 中心性得分。

图 2-7:Farrelly 社交网络数据中特征向量中心性(左)和 PageRank 中心性(右)的气泡图
对于这两种度量,V7(代表 Farrelly 本人)具有最高的值,而且这些值在医学院集群中呈现出一种方式,至少直观上,确实能够捕捉到中心性或重要性的概念。也许这张图最引人注目的是这两种紧密相关的基于特征向量的度量之间的对比。对于特征向量中心性,医学院集群中的值完全压倒了老兵组织集群的值,而 PageRank 中心性似乎更能反映出两个集群内部的中心性和重要性。这种差异的原因在于,随机游走中,人们通常选择相邻的顶点以相等的概率遍历,容易在高度互联的医学院集群中徘徊,并且几乎没有概率走出这个集群,走向 V7 到 V10 之间的唯一一条边。而 PageRank 中心性则在随机游走中引入了一个固定的跳跃概率,帮助它们进入老兵组织集群。
在图 2-8 中,我们展示了 Katz 中心性,正如你所记得的,它是度数的一个高阶版本,不仅考虑邻居的数量,还考虑邻居的邻居数量,依此类推。我们通过指定来自高阶连接的影响衰减率,计算了两个不同的衰减参数 alpha 值下的 Katz 中心性。

图 2-8:Farrelly 社交网络数据上,衰减参数 alpha = 0.2(左)和 alpha = 0.1(右)时 Katz 中心性的气泡图
结果表明,这个网络的谱半径大约为 4,因此我们需要选择小于 0.25 的 alpha 值(这里选择了 0.2 和 0.1)。我们可以看到,无论选择哪种 alpha 值,都将 Farrelly 的 V7 识别为最中心的顶点,但对于较大的 alpha 参数(左图),得分在 V7 附近保持相对较高,随后迅速衰减。而对于较小的 alpha(右图),衰减则不那么陡峭,Katz 中心性得分在整个网络中更加均匀分布。左图更有可能捕捉到我们通常认为的中心性或重要性,通常建议选择一个非常接近谱半径倒数的 alpha 值(绝对不要选择 igraph 中的默认值 1)。
最后,让我们分析权威性和中心性。在无向网络中,这两个度量是重合的,因此我们首先将网络转换为有向网络。由于在这个社交网络中没有自然的好友关系方向,我们将人工进行如下转换:对于网络中的每条边,例如在顶点 i 和顶点 j 之间,以三分之一的概率将其转换为从 i 到 j 的单向边,三分之一的概率将其转换为从 j 到 i 的单向边,三分之一的概率保持为双向边。列表 2-6 显示了执行此操作的代码,并绘制了结果中的中心性和权威性分数。
#randomly remove some entries in the adjacency matrix
mydata_directed<-mydata
for (i in 1:20){
for (j in i:20){
rand<-runif(1)
if(rand < 0.33){mydata_directed[i,j]<-0}
if(rand >= 0.33 & rand < 0.66){mydata_directed[j,i]<-0}
}
}
#use this modified adjacency matrix to create a directed network
g_directed<-graph_from_adjacency_matrix(mydata_directed,mode="directed",weighted=T)
#plot the hub centrality and authority centrality for this directed network
plot(g_directed,vertex.size=20*hub_score(g_directed)$vector,vertex.label.cex=0.8,vertex.color=2,edge.arrow.size=0.4)
plot(g_directed,vertex.size=20*authority_score(g_directed)$vector,vertex.label.cex=0.8,vertex.color=2,edge.arrow.size=0.4)
列表 2-6:将 Farrelly 的社交网络转为有向网络,并绘制结果中的中心性和权威性分数的脚本
图 2-9 显示了结果图。

图 2-9:Farrelly 社交网络的有向版本中,中心性(左)和权威性(右)的气泡图
由于医学院群体的高互联性,医学院成员的中心性分数高于退伍军人群体,Farrelly 的顶点 V7 在该网络中作为一个重要的中心存在。许多医学院成员指向 V5 和 V3,这使得这些顶点具有较高的权威性分数,而 V7 的权威性分数相对较低。这表明,V3 和 V5 是该社区内信息的主要来源,他们将信息传递给 V7,后者再与其他医学院成员分享;相反,退伍军人群体成员之间缺乏一个集中的结构,信息流动效率也较低。
现在我们已经通过可视化方式探讨了所有这些中心性度量,让我们使用其中一些度量来对 Farrelly 的社交网络中的顶点进行排名和比较(回到原始的无向版本)。列表 2-7 中的代码可以与 列表 2-4 中的代码结合,生成一些中心性度量的数据集。
#create dataset of a few centrality measures on Farrelly's social network
data_social<-cbind(page_rank(g_social)$vector,degree(g_social),hub_score(g_social)$vector,betweenness(g_social))
colnames(data_social)<-c("PageRank","Degree","Hub Score","Betweenness")
列表 2-7:创建 Farrelly 社交网络中几个顶点中心性分数表格的脚本
表 2-1 显示了这些顶点的分数,每列中前两项以粗体显示。
表 2-1:Farrelly 社交网络顶点的中心性度量分数
| 顶点 | PageRank | 度数 | 中心性分数 | 介数 |
|---|---|---|---|---|
| V1 | 0.032 | 2 | 0.414 | 0 |
| V2 | 0.020 | 1 | 0.168 | 0 |
| V3 | 0.075 | 5 | 0.682 | 19.500 |
| V4 | 0.032 | 2 | 0.370 | 0 |
| V5 | 0.057 | 4 | 0.685 | 2.000 |
| V6 | 0.046 | 3 | 0.505 | 1.000 |
| V7 | 0.111 | 8 | 1.000 | 100.500 |
| V8 | 0.044 | 3 | 0.550 | 0 |
| V9 | 0.044 | 3 | 0.550 | 0 |
| V10 | 0.048 | 3 | 0.306 | 90.917 |
| V11 | 0.050 | 3 | 0.118 | 26.667 |
| V12 | 0.022 | 1 | 0.021 | 0 |
| V13 | 0.069 | 4 | 0.087 | 18.917 |
| V14 | 0.067 | 4 | 0.127 | 61.083 |
| V15 | 0.068 | 4 | 0.088 | 36.000 |
| V16 | 0.040 | 2 | 0.024 | 23.083 |
| V17 | 0.040 | 2 | 0.034 | 21.917 |
| V18 | 0.065 | 3 | 0.009 | 20.250 |
| V19 | 0.043 | 2 | 0.011 | 10.167 |
| V20 | 0.026 | 1 | 0.002 | 0 |
在很大程度上,介数中心性将 V7 和 V10 识别为连接网络的最重要的顶点。然而,V10 的其他中心性得分则要谦逊得多,表明它主要作为社区之间的桥梁,而不是网络的真正中心。这是有道理的,因为 V10 在退伍军人群体中显得相当不起眼。它恰好连接到 Farrelly 的 V7,并通过她连接到医学院社区。另一方面,Farrelly 的 V7 有许多邻居(如度数所示),并且在中心度得分和 PageRank 中排名靠前——这与我们对该网络的概念理解相符,即该网络传递的是两个独立的社区,而 Farrelly 参与其中。
V3 在度数和 PageRank 方面排名第二;此人似乎处于医学院社区的社交中心。V5 具有第二高的中心度得分,表明它靠近医学院社区的重要成员。中心度得分(由于该网络是无向的,因此与权威度得分相同)也将 V12 与 V20 区分开来。两者都是退伍军人群体社区的度数为一的外围顶点,并且 PageRank 和介数中心性得分较低。然而,V12 的中心度得分较高,因为它靠近一个高度互联的小子社区。
网络的其他量
网络几何不仅提供了顶点的中心性度量。在本节中,我们将介绍与网络中顶点相关的其他一些有趣的量。示例包括捕捉你朋友之间相识可能性的传递性得分,捕捉当顶点被移除时流量转移程度的效率得分,以及捕捉网络结构扭曲的曲率得分。
顶点的多样性
虽然中心性中的枢纽和权威性涉及通过有向网络的信息潜在流动,但与加权网络中的顶点相关的另一个度量则涉及从数学信息理论的角度看待信息。顶点的多样性是与该顶点连接的边的权重分布的香农熵(一个衡量变量或一组变量信息内容的分数)的缩放版本。如其名所示,这捕捉了附加在每个顶点上的边的权重多样性。熵在均匀分布时最大,因此当所有边的权重相等时,多样性得分最大(并缩放为 1),随着权重的变化,多样性得分会逐渐下降。可以这样理解:在一个加权网络上进行的随机漫步(概率与边的权重成比例)在多样性得分接近 1 的顶点上最难预测,而在多样性得分较小的顶点上则较为容易预测。
三元闭合
网络理论中的一个有用概念是三元闭合,即已经拥有一对边的顶点三元组之间形成三角形的趋势。用更通俗的语言来说,这相当于在问你两个朋友是否可能互为朋友。考虑图 2-10 所示的朋友网络。

图 2-10:一个有一个友谊链接未知的友谊网络,说明了三元闭合的概念
在这里,贾斯廷和贾森是朋友,贾斯廷和米克也是朋友。问题是贾森和米克是否是朋友。这种情况称为以贾斯廷为中心的三角形。如果贾森和米克不是朋友,则称为开放三角形;如果他们是朋友,则称为封闭三角形。一个大多数为封闭三角形的网络表明高度的凝聚力。在社交网络中,这意味着拥有共同朋友的个体很可能相互认识。另一方面,拥有许多开放三角形的网络可能表明凝聚力较弱,但也可能意味着数据缺失或信息不完整:人们可能不会在社交媒体上添加所有现实中的朋友,情报数据可能不包含恐怖分子小组之间所有的通信形式,等等。在任何现实世界的场景中,可能存在一些关系只是尚未被记录下来。
衡量三元闭合的一种方式是通过传递性,它为每个顶点分配一个值,表示以该顶点为中心的三角形中已经闭合的比例。在社交网络中,你的传递性是指你两个朋友相互成为朋友的概率。我们来将以下内容添加到我们从示例 2-6 中的图示集合中:
#compute and plot transitivity for each vertex in Farrelly's social network
plot(g_social,vertex.size=20*transitivity(g_social,type="local",isolates="zero"),vertex.label.cex=0.8,vertex.color=2)
将名为type的参数设置为local,会指示 igraph 计算每个顶点周围的传递性,将名为isolates的参数设置为zero,会强制对度为 1 的顶点的得分设置为 0(否则得分为NaN,因为度为 1 的顶点没有围绕它的三角形)。图 2-11 显示了结果图。

图 2-11:Farrelly 社交网络的传递性气泡图
从另一个角度看,这表明医学院社区比退伍军人社区更具凝聚力,互联性更强。很可能,参加相同课外活动的医学生会在同一班级中互相认识并交流。然而,需要注意的是,Farrelly 的 V7 在医学院个体中的传递性得分相对较低,这意味着尽管该小组整体上比较亲密,但 Farrelly 的一些医学院朋友彼此之间并不是朋友。(V7 的传递性得分还受到影响,因为 Farrelly 的医学院朋友与退伍军人组的朋友 V10 之间没有朋友关系。)
一个顶点的效率和离心率
回想一下,我们之前讲过的两个中心性度量,接近度和中介度,是通过网络中最短路径(或测地线)的长度来定义的。另一个基于最短路径的有趣度量,叫做效率,它是对每个顶点按如下方式定义的:移除该顶点,然后计算所有与该顶点相邻的顶点之间的网络距离。接着,对这些距离的倒数取平均值。移除顶点就像设置了一个路障,而相邻顶点之间的距离则衡量了因路障而必须绕行的距离。倒数这些距离意味着较大的绕行距离会使得效率较低,反之亦然。效率衡量了网络中每个顶点的交通如何容易地被绕过。
效率是探讨网络局部几何结构的一个有用方法。这里的局部指的是我们正在探索每个顶点附近的网络几何结构;这与接近度和中介度不同,后者更具有全局性质,因为它们涉及整个网络的路径。让我们在代码清单 2-6 中添加效率的计算。我们需要一个额外的库来实现这一点:
#load the brainGraph library that adds on to igraph
library(brainGraph)
#compute efficiency for each vertex in Farrelly's social network
efficiency(g_social,type="local")
我们没有显示这个气泡图,因为它看起来与图 2-11 中的传递性图非常相似。事实上,在该网络中,传递性分数与效率分数的相关性为 0.96。在其他网络中,尤其是更大、更复杂的网络中,这种情况未必成立。需要注意的是,传递性是一个极其局部的度量,因为它只考虑相邻顶点及其之间的边。相比之下,效率虽然也是局部的,但由于阻塞物可能延伸到超出直接邻居的网络部分,因此它能够访问到更大范围的网络。
另一种基于路径的顶点度量是 偏心率,它像接近度和介数一样,考虑到网络的全局几何结构。它为每个顶点分配从该顶点到网络中任何其他顶点的最大网络距离。这衡量了每个顶点的外围程度,因此较低的偏心率分数通常表示更中心的顶点。我们稍后会详细讨论这一度量。
Forman–Ricci 曲率
Ricci 曲率是几何学中的一个概念,用于衡量直线在曲面上的扭曲程度以及这种扭曲的增长或收缩速率。你可以将其视为一种力量,使直线变成弯曲的路径(就像在湿纸巾上放一个小手重物)。请参见图 2-12,它展示了从左到右 Ricci 曲率逐渐增大的概念性插图。

图 2-12:一条直线的中点通过在 Ricci 曲率不断增加的空间中滑动(从左到右)而变形
将这一概念从连续几何学转化到网络领域的一个变体称为 Forman–Ricci 曲率。计算 Forman–Ricci 曲率的第一步是给网络中每条边分配一个数值,表示该边所在的邻域的网络扩展程度。使用的数值是 2 减去与该边连接的两个顶点的度数之和;这是该边相邻的边数的负值。例如,在 Farrelly 的社交网络中(图 2-5),V7 和 V10 之间的边具有 Forman–Ricci 曲率 -8(由 V7 的六个非 V10 邻居和 V10 的两个非 V7 邻居得来)。
接下来,我们使用这些边分数来给顶点分配分数,方法如下:一个顶点的 Forman–Ricci 曲率是与该顶点连接的边的 Forman–Ricci 曲率之和。Forman–Ricci 曲率几乎总是负数,因此在可视化时,我们通常使用其相反数。 在列表 2-8 中,我们计算了 Farrelly 社交网络的 Forman–Ricci 曲率,然后使用其相反数绘制顶点的大小和边的粗细。
#compute the degrees of all vertices
d<-degree(g_social)
#count edges and initiate vector of edge curvature values
l<-length(E(g_social))
frc<-rep(NA,l)
#loop to calculate and store Forman-Ricci edge curvature
for (I in 1:l){
w<-as.vector(ends(g_social,E(g_social)[i],names=F))
frc[i]<-2-d[w[1]]-d[w[2]]
}
#count vertices and initiate vector of vertex curvature values
n<-length(d)
frcv<-rep(NA,n)
#loop to calculate and store Forman-Ricci vertex curvature
for (i in 1:n){
I<-as.vector(incident(g_social,i))
frcv[i]<-sum(frc[I])
}
#plot the network with vertex and edge size given by the negated curvature
plot(g_social,edge.width=-frc,vertex.size=-20*frcv/max(-frcv),vertex.label.cex=0.8,vertex.color=2)
列表 2-8:一个计算并绘制 Farrelly 社交网络的 Forman–Ricci 曲率的脚本
图 2-13 展示了结果图。

图 2-13:Farrelly 的社交网络的负费曼-里奇曲率
如你所见,网络中边缘更多的区域具有更高的负费曼-里奇曲率。这种情况发生在网络分散的中心区域(例如在这里围绕 Farrelly 的 V7 的医学学校社区)以及紧密相连的区域(例如在退伍军人小组成员中的紧密四顶点子社区)。
在传统几何学中,曲率用于研究物质如何在物体表面流动。类似地,费曼-里奇曲率可以用于研究网络流动模式。我们将在第三章中讨论网络流动的概念。
全局网络度量
到目前为止讨论的所有度量都是顶点度量,意味着它们为网络中的每个顶点分配一个分数,量化顶点在网络中的角色或位置。例如,你可以提取你的 Facebook 好友网络,并使用这些顶点度量来衡量每个人在网络中的中心性。然而,有时我们不仅仅需要比较单个网络中的顶点,而是需要比较不同的网络。例如,你可能想比较你的 Facebook 好友网络和另一个人的 Facebook 好友网络,或者你可以比较你在 Facebook 上的好友网络与你在其他社交媒体平台上的好友网络。在这种情况下,我们需要为整个网络分配一个单一的数值;这些度量有时被称为全局网络度量,或者如果网络的上下文明确,可以简称为全局度量。让我们了解几个重要的度量。
网络的互联性
最简单的全局度量是网络中的顶点数量和边的数量。与这些紧密相关(但通常更有用)的度量是密度,它是网络中边的数量除以该顶点集上可能的最大边数。一个无向网络如果有n个顶点,最多有

边(不允许有环或多重边),而有向网络的最大边数是这个数量的两倍。密度提供了一个粗略的衡量网络互联程度的指标;在 igraph 中,可以使用edge_density()函数来计算密度。图 2-14 展示了一些具有不同密度的网络。

图 2-14:顶行的三个网络的密度都是 25%,而左下角和右下角的网络密度分别为 50%和 75%。
网络中的平均度数也是一个有用的全局度量,但它包含与密度完全相同的信息,并且与密度完美相关。事实上,平均度数是所有顶点度数的总和除以顶点数量,而所有顶点度数的总和总是边数的两倍。因此,平均度数和边密度之间相差一个常数,这个常数仅取决于网络中的顶点数。因此,你可以选择使用其中一个度量,而同时使用两者并不会带来额外的好处。
前一节讨论的传递性概念(量化三元闭合)也有一个全局对应物。当在 igraph 的 transitivity() 函数中将 type 参数设置为 global 时,会计算出一个数字,表示网络中闭合的三角形占所有三角形的比例。这为衡量网络的整体互联性提供了另一种方法,与边密度不同。
网络中的传播过程
更为分散的网络通常与更为紧凑的网络表现出不同的行为。例如,考虑三个朋友——阿马拉(Amara)、伊马尼(Imani)和塔拉吉(Taraji)——在午餐桌上互相传递消息。我们会期望这三位女孩在桌子上互相交换信息比她们在不同的课堂上发短信或在走廊里擦肩而过时聊天更容易。让我们来看一些不同的方法来量化网络的传播情况。
在 igraph 的 efficiency() 函数中,将 type 参数设置为 global 会得到该度量的全局版本,它计算网络中所有顶点对之间的距离的倒数的平均值。在这个全局效率的变体中没有任何障碍物。高度互联的网络往往具有较高的全局效率,因为高互联性意味着顶点之间有很多直接路径,但总体而言,最好将全局效率视为衡量网络紧凑性的指标。网络越分散,其全局效率越低。
我们还可以计算网络的直径,它是网络中所有顶点的最大偏心度(因此,也是两个顶点之间的“最长最短路径”)。网络的半径是最小偏心度,表示网络中心与网络最远部分之间的距离。在 igraph 中,你可以先使用eccentricity()函数对所有顶点进行评分,然后使用标准的 R 命令从中提取最大值和最小值。直径和半径都量化了数据传播的某些方面。一种可能导致直径和半径之间差异较大的结构是那些由多个松散的枢纽通过一个单一的桥接个体互相连接的结构。
网络的谱度量
我们已经看到,邻接矩阵和与其紧密相关的其他矩阵的特征向量在多个顶点中心性度量中扮演着重要角色;邻接矩阵的谱理论(特征值和特征向量)还为我们提供了一些有用的全局度量。网络的 谱半径(在我们讨论 Katz 中心性时提到过)是邻接矩阵的最大特征值。谱半径的多种性质已经被数学上确立。本质上,谱半径衡量了网络中的传播过程。当考虑到有害实体在网络中传播时,如假新闻或病毒,谱半径与网络的鲁棒性是反比关系。例如,在我们下一章将讨论的流行病学模型中,较小的谱半径意味着疾病在网络中传播会更快地消失。
要在 R 中计算网络的谱半径,可以使用 igraph 中的 spectrum() 函数,它利用了邻接矩阵通常具有的稀疏结构,或者可以使用 R 中任何标准的特征向量或特征值实现,例如对网络的邻接矩阵使用 eigen() 函数。
由于 igraph 的 spectrum() 函数可选地返回邻接矩阵的所有特征值和特征向量,因此很容易利用它来计算其他谱度量——例如 谱差,即邻接矩阵的最大特征值(谱半径)与第二大特征值之间的差异。谱差控制着某些算法和随机过程在网络上的收敛时间,除此之外,还有其他一些应用。其他有用的谱度量基于一种称为 图拉普拉斯算子 的邻接矩阵变体,它是通过对邻接矩阵取负值并将每个顶点的度数添加到相应的对角矩阵项中得到的。图拉普拉斯算子零特征值的重数表示网络的连通分量数。图拉普拉斯算子最小的非零特征值称为 代数连通性;它是衡量网络连通性的度量,表示将网络分割成更小部分的难易程度。Farrelly 的社交网络具有相对较低的代数连通性,因为移除一个顶点会将网络分裂成退伍军人组和医学院组。
列表 2-9 展示了如何计算图拉普拉斯算子,并从中提取连通分量数量和代数连通性。
#compute the graph Laplacian of a network g
lap<-laplacian_matrix(g)
#compute the eigenvalues and round to avoid numerical issues
evals<-round(eigen(lap)$values,digits=5)
#compute number of connected components
sum(evals == 0)
#compute the algebraic connectivity
unique(evals)[length(unique(evals))-1]
列表 2-9:一个计算网络 g 的图拉普拉斯算子并从中提取连通分量数量和代数连通性的脚本
例如,在 Figure 2-15 中显示的两个网络上运行此代码,每个网络都有七个连接组件,左侧网络的代数连通性为 0.062,右侧网络的代数连通性为 0.09。

图 2-15:两个网络,绘制以说明与图拉普拉斯矩阵相关的谱度量。它们具有相同数量的连接组件,但右侧网络具有更高的代数连通性。
如果你想比较不同大小网络的分数,最好使用归一化拉普拉斯矩阵;要做到这一点,只需在计算图拉普拉斯矩阵时将normalized=T设置为第一行中的 Listing 2-9。
用于现实世界行为的网络模型
有几种不同类型的网络可以作为现实世界行为的重要模型;这些提供了有用的基准,用来比较真实世界的网络和数据。让我们从最简单的构建开始。
Erdös–Renyi 图
Erdös–Renyi 图 是根据顶点对的均匀分布随机生成边的网络。这些是通过 sample_gnp() 函数在 igraph 中创建的。 Figure 2-15 中的两个网络都是通过使用 sample_gnp(50,0.05) 创建的,这将创建一个具有 50 个顶点和边概率为 5% 的网络。以这种方式创建的图的密度将接近指定的边概率,但不一定等于它——就像反复抛硬币不总是会得到一半的正面和一半的反面一样。 Figure 2-14 中的网络也是用 sample_gnp() 创建的。
Erdös–Renyi 图提供了一个有用的零假设。如果你认为你的网络结构非常有序,那么它的边应该远离均匀分布,因此网络看起来或行为不像一个 Erdös–Renyi 网络。在接下来的两章中,我们将看到如何实际实现这个想法。Erdös–Renyi 图在自然界中并不经常出现,特别是在社会驱动的环境中。真实网络几乎总是比纯随机边的网络更有结构。
无标度图
无尺度图 是一种网络,其度分布渐近遵循幂律分布,这意味着存在一个常数 c,使得度为 2d 的顶点的比例是度为 d 的顶点的比例的 1/2^(c) 倍(至少大致如此,且随着 d 增加,近似值会更加准确)。常数 c(称为 幂指数)通常在 2 到 3 之间。这个幂律特性导致了许多顶点的度数远高于网络中平均度数的存在。因此,无尺度网络通常呈现出类似于机场航站楼在中央安全门连接的轮辐形状。这些网络中的枢纽有助于缩短顶点之间的距离,从而赋予这些网络某些“小世界”特性。
这些网络有着迷人的历史和成熟的理论,虽然我们没有足够的空间深入讨论。该领域中的一个有趣辩论是,许多自然发生的网络是否是无尺度的——包括互联网页面、社交网络、生物网络,甚至是航空旅行网络——如果是的话,这种现象为何会发生。
生成无尺度网络有多种方法;其中一种比较流行的方法在 igraph 中通过 sample_pa() 函数得到了方便的实现。它依赖于所谓的 Barabási–Albert 模型。
Watts–Strogatz 图
Watts–Strogatz 图 是由 1998 年提出的一种随机图模型生成的网络,它倾向于产生比无尺度网络更强的“小世界”特性,例如紧密相连的社区和许多顶点之间较短的网络距离。这些网络通常包括通过冗余和备用路径强化的路径。它们在生物学和社会过程中特别常见。例如,大脑连接网络(在神经元和功能区域层面)、选民网络、社交媒体平台上的影响者网络以及食物链常常形成 Watts–Strogatz 网络。
由于我们已经看到了一些 Erdös–Renyi 图的例子(见图 2-14 和 2-15),现在让我们创建一些其他类型的网络。在图 2-16 中,我们使用 sample_pa(100,power=2.5,directed=F) 来生成几个无尺度网络,并使用 sample_smallworld(1,100,2,0.05) 来生成几个 Watts–Strogatz 网络。我们留给有兴趣的读者去查阅 igraph 文档,了解后者函数中参数的选择。

图 2-16:两个无尺度网络(顶部)和两个 Watts–Strogatz 网络(底部)
第一行的无标度网络每个都有一个显著的枢纽,而左侧的网络还额外有一个不太显眼的次级枢纽。假设这些是电力网连接,一场暴风雨摧毁主枢纽时,无标度网络的影响会波及更多的用户,而不是瓦茨–斯特罗加茨网络。这也是为什么许多现实世界的网络在设计时会遵循冗余重的结构。瓦茨–斯特罗加茨网络没有像无标度网络那样显著的枢纽,但它们拥有纯随机的厄尔多斯–雷尼网络所没有的大量结构。例如,前面提到的那些长的强化路径结构,在这些底部的图中很容易识别出来。
总结
本章首先简要介绍了数据科学中对网络的需求以及网络科学中对几何的需求。接着,我们介绍了网络及其中涉及的对象——顶点、边、路径等。然后,我们定义并探索了一系列度量标准,用以量化网络及其顶点的各种属性。最后,本章以几个随机图模型作结,这些模型对于生成合成网络数据非常有用,实际网络数据可以与其进行比较。
第五章:网络分析

在第二章中,我们讨论了一些网络几何指标;在本章中,我们将使用这些指标。首先,我们将解释如何通过顶点指标在网络中进行监督学习,即预测与顶点相关的值并预测网络中的新边;我们还将探讨顶点指标如何使你能够在网络中进行顶点聚类。然后,我们将讨论一些直接在网络几何结构内操作的聚类算法。接下来,我们将解释如何使用全局网络指标对包含多个网络的数据集进行机器学习和统计分析。然后,我们将探讨流行病学中的易感、感染和恢复(SIR)模型的网络变体。通过这个模型,我们可以观察到从疾病到错误信息等实体是如何在网络中传播的,以及网络几何如何影响这种传播。最后,我们将研究如何使用顶点指标制定有针对性的策略来干扰这种传播。
使用网络数据进行监督学习
网络数据通常伴随着传统的结构化数据集,其中的行通过网络中的顶点进行标识。例如,你可能有一个社交网络数据集,其中包含个人(顶点)列表、他们之间的友谊(网络中的边)以及一列或多列提供有关每个个体的额外非网络信息的数值或分类列——例如年龄、性别或薪水。我们可能希望将此视为一个监督学习问题,在其中我们训练一个机器学习算法来预测数据列中的一个值。做到这一点的方法是使用顶点指标作为自变量(以及其他任何数据列),这使得算法在进行预测时可以结合每个顶点在网络中的角色。让我们来试试这个方法。
利用社交媒体网络指标进行预测
让我们回到 Farrelly 的社交网络,之前我们在第二章分析了该网络,说明了不同的顶点中心性度量。不同网络部分之间的桥梁或紧密连接一些医学院朋友的中心节点,如何影响 Farrelly 在医学院第一学期的日记中提到这些人的频率呢?让我们看看网络指标如何与这个社交网络中的日记提及相关。
我们将选择几个顶点中心性指标,并将 Farrelly 的日记数据作为该集合中的因变量。让我们加载数据,并使用列表 3-1 检查因变量的分布。
#import dataset
g<-read.csv("SocialNetworkModel.csv")
#create a histogram of the data
hist(g$Diary.Entries,main="Diary Entry Histogram",xlab="Diary Entries")
列表 3-1:导入相关的 .csv 文件以进行进一步分析的脚本
图 3-1 显示了因变量分布的直方图(泊松分布)。

图 3-1:Farrelly 社交网络的日记条目数据的直方图
通常,计数变量,如符合泊松分布的变量,包含大量零值和接近零的值,以及一些大值。从图 3-1 可以看到,这一结果符合泊松分布。泊松分布的变量可能会对机器学习算法造成问题,因为它们涉及大量的零值和一些异常值,比如涉及 V10 的日记条目。这表明,与其他机器学习算法相比,广义线性模型(泊松回归)可能是更适合的监督学习模型。看起来网络中的大多数个体在整个学期中几乎没有(如果有的话)被提及。然而,还是存在一些异常值,包括法雷利和她在网络中的最亲密朋友(V3、V10 和 V14)。让我们深入探讨一下,看看中心性度量如何预测日记提及。在清单 3-2 中,我们对法雷利社交网络中的相关指标进行了采样,并将其作为自变量纳入我们的泊松回归模型。
#create a training sample from Farrelly's social network metrics
n<-dim(g)[1]
set.seed(10)
train.index=sample(1:n,15)
train<-g[train.index,]
#build a Poisson regression model
gl<-glm(Diary.Entries~.,data=train,family="poisson")
#examine performance with a model summary and Chi-squared test
summary(gl)
1-pchisq(summary(gl)$deviance,summary(gl)$df[2])
清单 3-2:计算泊松回归并分析其结果的脚本
你的结果可能会因 R 版本的种子设置不同而有所变化,但在我们使用这个数据集和其他种子(10 次随机分割中的 9 次)建模的样本中,汇总函数显示,介数中心性似乎在模型中具有较大的系数值,并且是预测法雷利社交网络数据集中日记条目提及最一致的指标。我们的样本中的卡方检验值从p < 0.01 到p = 0.25 不等。当我们检查与线性回归相关的图表时,可以看到大部分样本很好地符合回归方程。图 3-2 展示了清单 3-2 生成的两幅图(包括 V3、V7 和 V13 作为异常值)。
小样本量可能是导致样本间差异的原因之一,但总体而言,我们有一个良好的预测模型。事实上,这反映了法雷利自己直觉的观点,即她的社交网络中的桥梁往往协调那些能将她的社交网络中不同部分结合起来的、令人难忘的事件和活动。我们将在第六章和第八章中回顾小样本量和异常值对回归模型的不稳定性,并介绍一些更稳定的模型,以便在这些情况下获得一致的模型结果。

图 3-2:在清单 3-2 中运行的泊松回归的残差图和分位数图
在这种分析中,具有依赖变量且与个人社交网络更紧密相关的更大网络(例如政治观点的强度、锻炼习惯等)通常表现得更好。在生物网络中,中心性度量可以用来预测疾病的严重程度、药物在临床试验中的反应概率,或社交网络基础上的行为健康干预六个月后的疾病风险。分析网络的几何形状通常会产生有用的独立变量,用于预测与网络节点相关的某些特性。
预测社交媒体中的网络链接
网络中另一种重要的监督学习形式是链接预测,它根据网络的结构或元数据推断潜在的新边。预测链接的一种方法是利用网络的先前增长模式来预测哪些边最有可能出现。这在现实世界中有许多应用,其中一些最显著的应用是在社交媒体中。每当 Facebook 或其他平台建议你添加某人为好友时,后台算法会对其用户网络运行链接预测,并给你与这个潜在好友之间的缺失边赋予一个高分。有许多复杂的方法可以进行链接预测,但一种常见的通用策略是将问题转化为传统的欧几里得监督学习任务。让我们以 Farrelly 的社交网络为例来概念性地探讨这一点。
想象一下这个网络随时间演化,二元指标表示自上一个时间段以来形成的边。如果我们能够根据网络在过去时间段中的几何形态来预测某一时间段内的边形成,那岂不是很酷吗?或者如果我们可以使用节点标签(例如课表或志愿者日期)来预测下一个时间段的边形成呢?
对于独立变量,我们可以使用与两个节点相关的任何特征集合。这些可以是基于网络的内在特征,也可以是社交网络中用户人口统计等外在特征。基于网络的预测因子有两种类型。我们可以通过选择一个函数,将每一对节点的两个节点分数聚合成一个单一的数字(常见的选择包括求和、最大值、均值和差值的绝对值)。例如,我们可以计算每对节点的 PageRank 分数,然后取这两个分数的平均值来为节点对赋值。
另一种基于网络的特征使用某种度量来表示两个顶点之间的网络关系;这里最自然的选择是两个顶点之间的网络距离,尽管你也可以尝试其他选项,如两个顶点之间的最短路径数量或随机游走从一个顶点到另一个顶点的平均时间。所有这些基于网络的预测因子应当针对当前版本的网络进行计算,而不是早期的快照,并且这些基于网络的预测因子可以与任何非网络特征结合使用。(实际上,大多数非网络特征是附加在单个顶点上的,而不是顶点对,因此你再次需要对它们进行聚合,以便为每对顶点得到一个单一的评分。)
一旦为某一感兴趣时间段计算了独立预测因子,并且该时间段存在指示变量,就可以使用监督分类器来预测该时间段内的边缘形成。边缘形成的可能性得分越高,表示在下一个时间段该关系存在的可能性越大。在 Farrelly 的社交网络中,介数中心性可能是主要的基于网络的预测因子,以及来自医学第一学期的社交活动数据或日记条目。她原始社交网络中的每个人在学期结束时都与她相连(大多数人彼此之间也有联系)。
使用网络数据进行无监督学习
就像我们可以使用第二章中的顶点度量作为监督学习任务中的预测因子一样,我们也可以将它们作为无监督学习任务中的特征。在聚类的情况下,这将把顶点划分为具有相似功能的集合(中心、桥梁等)。在网络科学中,聚类顶点被称为 社区挖掘,因此,当我们将顶点度量用于此目的时,我们获得的社区是通过它们在网络中所扮演的结构角色来定义的。
将聚类应用于社交媒体数据集
在清单 3-3 中,我们将 k-means 聚类应用于 Farrelly 的社交网络数据集,这是我们在第二章中的主要运行示例。
#rescale the matrix of vertex metrics and apply k-means with k=3
clust<-kmeans(scale(vertdata),3)
#plot the network with clusters represented by vertex color and label
plot(g,vertex.size=6,vertex.color=clust$cluster,vertex.label=clust$cluster)
清单 3-3:一个使用 k-means 对顶点度量进行聚类的脚本,将来自图 3-1 的网络顶点聚为 k = 3 组
使用 k-means 方法,k = 3,并使用 PageRank、度、中心性、介数和传递性作为特征(我们首先对其进行重新缩放),得到的聚类均值和大小见表 3-1,这些值是从原始重新缩放的值计算得出的。
表 3-1:Farrelly 社交网络顶点度量的 k-means 聚类(k = 3)的聚类均值和大小
| 聚类 | PageRank | 度 | 中心性 | 介数 | 传递性 | 聚类大小 |
|---|---|---|---|---|---|---|
| 1 | 0.05 | 3.14 | 0.54 | 3.21 | 0.80 | 7 |
| 2 | 0.11 | 8.00 | 1.00 | 100.50 | 0.25 | 1 |
| 3 | 0.05 | 2.50 | 0.08 | 25.75 | 0.097 | 12 |
由于 k-means 聚类涉及随机初始化,因此每次尝试时可能会得到不同的聚类结果。对于这个特定的聚类,我们看到一个顶点被分配到它自己的聚类(Farrelly 的顶点,V7);除了转移性得分之外,这个顶点的所有得分都异常高,因此在许多指标上它是一个异常值。其余的顶点被分配到另外两个聚类中,这两个聚类似乎主要通过以下特征区分:一个聚类具有较高的枢纽度和转移性得分,而另一个聚类具有较高的介数中心性。让我们通过对顶点按聚类标记进行绘图来展示这个网络(这样做是对 列表 3-3 中代码的简单改编);见 图 3-3。

图 3-3:Farrelly 的社交网络按聚类着色和标注,对应于 表 3-1 中总结的 k-means 聚类
我们看到,Farrelly 确实是她自己的聚类,并且非常巧妙的是,聚类 1 几乎完全是剩余的医学院个体,而聚类 2 则是退伍军人组的个体。有趣的是,有一个医学院的人被分配到了聚类 3,因为他们是孤立的(转移性得分为零),并且不属于医学院个体的主要群体。
网络中的社区挖掘
到目前为止,我们已经使用网络的几何结构来提取特征,并对其应用了传统的欧几里得机器学习聚类算法。另一种聚类网络中顶点的方法(称为 社区挖掘)是直接依赖于网络的几何结构。我们将简要介绍几种实现方式。
使用随机游走探索网络
Walktrap 算法通过随机游走来探索网络并寻找社区,其中随机游走“被困住”在某些区域。如果随机游走经常停留在一组特定的顶点中,那么这组顶点就很可能构成一个聚类。例如,在 Farrelly 的社交网络中,从医学院个体中开始的随机游走,很有可能会长时间停留在这些个体中,因为唯一的出路是从 Farrelly 的顶点跨越一座桥。事实上,要离开这里,随机游走必须经过 Farrelly 的顶点,然后我们会选择那座桥作为下一步(从该顶点出发,只有八分之一的概率选择这座桥,因为该顶点有八条边)。同样,从退伍军人组开始的随机游走也很有可能会停留在他们中间。通过这种方式,walktrap 算法擅长找到通过桥梁分隔的社区。该方法的一个缺点是,它需要大量计算资源来探索大型网络。
评估聚类的质量结果
在传统的欧几里得聚类中,评估聚类结果质量的典型方法是将每个聚类内的距离与不同聚类之间的距离进行比较。有一个广泛应用于顶点聚类的网络变种思想:顶点聚类的模块度是指随机选择一条边连接到同一聚类中两个顶点的概率,减去如果网络中的边是随机分布时发生这种情况的概率。从直观上看,这种方法比较的是社群内边和社群间边的数量。它有点像一种“提升”度量,因为它比较了聚类在“边缘保持在同一聚类内”的效果,相较于随机化基准的表现。在前一章介绍的 Watts–Strogatz 网络的一个重要的小世界特性是它们通常是高度模块化的(即具有较高模块度得分的聚类)。
模块度还使得你可以将顶点聚类视为一个优化问题:我们寻找最大化模块度得分的聚类划分。尝试所有可能的聚类划分并不实际,因此已经引入了多种算法,旨在寻找高模块度的聚类,但并不保证找到全局最优解。两种常见的方法是贪心算法,其中贪心意味着每一步都朝着最能增加模块度的方向前进,而不是短期内采取次优步骤,期望它们能够在长期内带来更大的收益。
Louvain 聚类就是一种贪心算法。它从将每个顶点视为独立的聚类开始,然后在每次合并邻近聚类时,只有这样做能增加模块度,算法才会进行合并。一旦这个迭代的局部优化过程终止,算法通过合并所有被分配到同一聚类的顶点来创建一个新的、更小的网络。在这个新网络中,每个顶点都是一个独立的聚类,因此可以在这个较小的图上再次运行相同的迭代局部优化过程。这个算法在实践中非常快速,且通常表现良好,但它在大型网络中常常难以找到较小的社群。还有一种更快的贪心算法,通常被称为快速贪心聚类,但它往往无法达到很高的模块度得分。
理解 Spinglass 聚类
另一种聚类方法不涉及随机游走或局部优化。相反,它借鉴了统计力学,这是一门研究粒子相互作用的物理学分支。自旋玻璃算法基于系统中粒子之间的磁耦合(正负电荷);它们的目标是优化电荷在系统中的排列方式。这可以应用于顶点聚类,称为自旋玻璃聚类。基本思路是定义与聚类相关的能量,并尝试最小化这个能量。这个能量最小化过程通常通过模拟退火来完成,模拟退火是一种优化算法,其根源也在统计力学中。在模拟退火中,与其总是朝着最能降低能量的方向前进(这会在贪心算法中出现,从而有可能陷入局部最优解),不如设置一个温度参数来确定是否朝着一个“错误”的方向移动的概率。随着算法的进行,温度会逐步降低。这有助于算法在初期探索能量景观的较大区域,之后再定下来并聚焦于某一特定解。它模仿了金属冶炼中的冷却过程,在这个过程中金属得以净化。
在社交网络上运行聚类算法
让我们尝试在 Farrelly 的社交网络上运行这四种顶点聚类算法。列表 3-4 实现了这一操作,并绘制了结果,计算了模块化得分(要运行此操作,请确保您已加载此网络数据,如列表 2-4 所示)。
#run walktrap, louvain, fast greedy, and spinglass clustering algorithms
cw<-cluster_walktrap(g_social)
modularity(cw) #0.505
plot(cw,g_social,vertex.size=15,vertex.label.cex=0.6,main="Walktrap")
lo<-cluster_louvain(g_social)
modularity(lo) #0.476
plot(lo,g_social,vertex.size=15,vertex.label.cex=0.6,main="Louvain")
fg<-cluster_fast_greedy(g_social)
modularity(fg) #0.467
plot(fg,g_social,vertex.size=15,vertex.label.cex=0.6,main="Fast Greedy")
sg<-cluster_spinglass(g_social)
modularity(sg) #0.505
plot(sg,g_social,vertex.size=15,vertex.label.cex=0.6,main="Spinglass")
列表 3-4:运行前面讨论的四种顶点聚类算法在 Farrelly 的社交网络上,绘制结果并计算每个算法的模块化得分
图 3-4 显示了生成的图形。

图 3-4:在 Farrelly 的社交网络上使用四种不同算法进行聚类
请注意,对于所有这些函数,用户并未像在 k-means 中那样指定聚类的数量。这些算法在寻找最优解的过程中会自动确定聚类的数量。在这个例子中,walktrap 和自旋玻璃算法都找到了相同的三个聚类,分别是医学院的个体(包括 Farrelly 的顶点 V7)以及将退伍军人群体个体分为两部分。这种三分聚类在这些算法找到的解决方案中产生了最高的模块化得分。
Louvain 找到了下一个最佳得分,结果与之前的类似,唯一不同的是它以略微不同的方式拆分了退伍军人群体(将两个顶点从一个聚类重新分配到另一个聚类)。具有稍微低于此得分的模块度,快速贪心算法最终得出了只有两个聚类的结果(一个是包含 Farrelly 的医学院社区,另一个是退伍军人群体社区)。显然,这个算法中的贪心性使得它无法发现通过拆分退伍军人群体社区可以获得更高的模块度。话虽如此,快速贪心算法找到的这个两聚类解决方案描述了数据的原始背景,在这个背景中,Farrelly 将她的两个独立社区合并在一起。
如果你感兴趣,可以探索在 igraph 中实现的其他一些顶点聚类算法。例如,函数cluster_edge_betweenness()使用介数度量,不是作为特征,而是以更直接的方式。具有高介数得分的顶点被认为是桥梁,这个函数发现的社区是那些被这些桥梁隔开的社区。另一个有趣的方法是由函数cluster_infomap()提供的,它利用信息理论来寻找信息流动顺畅的社区;这也可以通过网络中随机游走的行为来进行解释。
到目前为止,我们已经讨论了单一网络中顶点之间的监督学习和无监督学习。现在让我们考虑比较不同网络的情况。
比较网络
有时,网络并不是你的整个数据集。它只是一个数据集中的单个实例,数据集中包含多个网络。例如,检测社交媒体平台上的机器人账户通常涉及监督分类,其中将真实用户的好友或关注者网络与虚假用户的网络进行比较。在第二章中提到的宾夕法尼亚州选区划分案件中,区划图被转化为网络,且旧地图在网络分布中被显示为一个可疑的离群值。神经科学提供了另一个重要的例子,在该领域,通常需要比较网络。事实上,功能性磁共振成像(fMRI)和正电子发射断层扫描(PET)数据通常会被转化为网络结构,其中顶点表示大脑的不同区域,边则基于活动模式(例如,某一区域的连续激活,或在执行一个任务时多个区域的共同激活)。人们通常需要比较两组不同的患者——健康患者与患有特定神经或心理疾病的患者,或者两组不同的疾病群体。转化为网络数据科学,这意味着我们在查看一个两类数据集的网络,看看两类之间是否存在统计学上显著的差异(以理解结构差异)。我们还可能希望训练一个监督分类器,根据网络结构预测类别。
为了生成一些合成数据,让我们创建 100 个每种类型的网络,类型在第二章结尾有描述:Erdös–Renyi 网络、无尺度网络和 Watts–Strogatz 网络。在列表 3-5 中,我们进行这个操作,并绘制网络直径的直方图,查看它在不同类型的网络内部和跨类型的变化。
#initiate vectors/lists
n<-100
er<-list()
sf<-list()
ws<-list()
er_d<-rep(NA,n)
sf_d<-rep(NA,n)
ws_d<-rep(NA,n)
#loop to create and store random graphs and compute their diameters
for (i in 1:n){
er[[i]]<-sample_gnp(100,0.02)
sf[[i]]<-sample_pa(100,power=2.5,directed=F)
ws[[i]]<-sample_smallworld(1,100,1,0.1)
er_d[i]<-diameter(er[[i]])
sf_d[i]<-diameter(sf[[i]])
ws_d[i]<-diameter(ws[[i]])
}
#plot combined histogram
hist(er_d,col=rgb(0,0,1,0.2),xlim=c(0,max(max(ws_d),max(ws_d),max(ws_d))),ylim=c(0,40),xlab="Diameter",main="")
hist(sf_d, col=rgb(0,0,1,0.5), add=T)
hist(ws_d, col=rgb(0,0,1,0.8), add=T)
box()
列表 3-5:一个脚本,生成 300 个网络,三种类型均匀分配;计算它们的网络直径;然后绘制每种类型的直方图:Erdös–Renyi、无尺度网络和 Watts–Strogatz 网络。
这里选择的参数确保所有随机网络具有相同数量的顶点(任意选择为 100 个)和大致相同的边密度(约 2%);这样可以确保网络结构区分这三组,而不是像顶点或边的数量这样的简单因素。图 3-5 展示了生成的直方图。

图 3-5:三种不同类型的随机网络的网络直径直方图:Erdös–Renyi(浅灰色)、无尺度(中灰色)和 Watts–Strogatz(深灰色)。
我们看到三个直方图是分离的。厄尔多斯–雷尼网络具有适中的直径。无标度网络的直径值较小。瓦茨–斯特罗加茨网络的直径较大。如果有兴趣,你可以尝试修改清单 3-5,计算第二章中讨论的其他一些全局网络度量(如效率、传递性和谱半径),看看它们在不同类型的随机图结构中表现如何。
现在,你可以使用目前开发的工具在网络数据集上进行许多机器学习任务。对于分类任务(例如,基于社交媒体账户的朋友网络将其标记为机器人或真实账户)或回归任务(例如,根据引用网络预测学术出版物的期刊排名),你可以计算一系列全局网络度量,然后将它们作为特征输入传统的监督学习算法。同样,为了将一组网络聚类成不同类型(例如,根据个体的 fMRI 大脑网络结构对其进行分组),你可以计算全局网络度量,并将它们输入传统的聚类算法。你还可以进行统计分析,如异常值检测和置信区间估计。实际上,通过用全局网络度量值的向量来表示每个网络,你就“构建”了你的网络数据,并为所有我们在数据科学中传统上依赖的统计和机器学习方法打开了大门。
分析网络中的传播
网络分析中的另一个重要主题是各种实体在网络中的传播(或扩散)。现实世界中有许多这类实例,包括传染病在接触网络中的传播和社交媒体网络中的病毒内容。理解网络的几何结构有助于预测实体在网络中的传播方式,我们可以利用这一洞察力改变网络的几何结构,从而影响传播。
跟踪小镇之间的疾病传播
让我们回到上一章的四个小镇加权网络,参见图 2-3。我们将从清单 2-3 中获取其邻接矩阵,并使用它来创建一个加权网络,其边的权重为原始距离的倒数;这样就将距离转化为接近度得分,其中较短的道路具有比较长的道路更大的边权重。清单 3-6(需要先运行清单 2-3 中的脚本)实现了这一点,并绘制了结果。
#invert the nonzero entries in the towns adjacency matrix from last chapter
townprox<-apply(towns,MARGIN=c(1,2),function(x) 1/x)
townprox[which(townprox == Inf)]<-0
#create weighted network from this new adjacency matrix
g_townprox<-graph_from_adjacency_matrix(townprox,mode="undirected",weighted=T)
#plot network with edges labeled by weights
plot(g_townprox,edge.label=round(E(g_townprox)$weight,3),vertex.color=2,vertex.size=15,vertex.label.cex=0.8)
清单 3-6:一个脚本,它创建并绘制了来自第二章的四个小镇网络,但其边权重由道路长度的倒数给出
图 3-6 显示了结果图。

图 3-6:四个小镇及其之间道路的接近度得分(逆距离)
让我们考虑一个简单的传染病传播的流行病学模型,在这个网络中,感染的城镇向其邻近城镇传播疾病的概率由边的接近度评分给出。如果疾病从城镇 V1 开始传播,那么它有 25%的机会传播到 V4。如果传播到 V4,它就有 16.7%的机会继续从 V4 传播到 V3。但是,乘这两个概率(大约 4.2%)并不能给出疾病从 V1 传播到 V3 的概率;它只给出疾病沿着传播路径 V1→V4→V3 传播的概率。另一个可能的传播路径是 V1→V4→V2→V3,这种情况发生的概率是 1%。
对于一个较大的网络,计算所有基于网络中路径给出的潜在传播路径的条件概率显然太过繁琐,无法手动完成,因此我们需要自动化这些计算。此外,这个流行病学模型过于简单,难以实际应用;我们在这里讨论它只是为了让大家了解加权网络的结构如何影响各种实体(如疾病、信息等)在其顶点之间的传播,同时也为接下来我们将要讨论的更复杂的流行病学模型做铺垫。
SIR 模型,或者易感-感染-免疫模型(或者,易感-感染-康复模型),是一种通过假设每个人可以处于三种疾病状态之一来预测疾病在群体中传播的模型:易感(可能被感染)、感染(已感染且能传播疾病)或康复/免疫(对疾病具有免疫力)。该模型有许多变体,包括易感-感染-易感模型、易感-感染-康复-易感模型、包括疫苗部分免疫的模型、在流行期间个体会出生或死亡的模型,以及人口在不同速率下混合的分区或地理模型。所有这些模型的基础都是包含与人口混合(如接触率或时间)和疾病特性(如一个感染者可能引发的新感染数量)相关的参数的偏微分方程系统。由于这些偏微分方程通常难以显式求解,因此我们通常使用计算机模拟来量化不同可能结果的范围和可能性。
为了考虑个体在群体中的社会互动,SIR 模型已被适应到网络中。这可以提供更详细的疾病传播预测,也有助于人们找到减少传播的方法:我们可以运行模型,查看删除某个顶点或边,或以其他方式重构网络,对疾病传播的影响。
第二章中的许多网络几何概念在这里也发挥作用。中心节点是高传输区,可能需要关闭或缩小,具有高介数得分的桥梁和节点提示了切断疾病传播主路线的目标方法,而具有高中心性得分的节点可能表示那些需要尽快接种疫苗或隔离的关键个体。此外,SIR 模型和用于探索它们的计算机模拟技术具有远超流行病学的应用,因为它们为研究网络结构与传播之间复杂关系提供了一种强有力的实证方法。例如,社交媒体上错误信息的传播是一个最近引起广泛关注的问题,并推动了人们更好地理解网络结构如何影响社交媒体传播——SIR 类型的模型在这一领域已经证明了其价值。
跟踪风帆运动员之间的疾病传播
让我们从一个例子开始。列表 3-7 加载了一个流行的网络数据集——KONECT 风帆运动员网络。这个加权网络代表了 1986 年秋季,43 位南加州风帆运动员以及他们的互动水平。几乎所有邻接矩阵的非对角元素都非零——意味着这个网络中几乎每条可能的边都存在——所以实际上是边的权重才是关键。这使得可视化这个网络变得困难,因此我们将创建两个密度较低的网络版本——一个是移除所有权重不在前四分之一的边,另一个是移除低于中位数的边。(这是一种简单的加权网络过滤方法,这一概念我们将在第四章中详细讨论。)列表 3-7 实现了这一操作并绘制了结果。
#load dataset, compute quartiles, and convert to weighted network
wind<-as.matrix(read.csv("beachdata.csv",header=F))
q<-quantile(wind,prob=c(.25,.5,.75))
g_wind<-graph_from_adjacency_matrix(wind,mode="undirected",weighted=T)
#new networks, keeping only edges with weight in top one and two quartiles
wind_top<-wind
wind_top[which(wind < q[3])]<-0
g_wind_top<-graph_from_adjacency_matrix(wind_top,mode="undirected",weighted=T)
wind_mid<-wind
wind_mid[which(wind < q[2])]<-0
g_wind_mid<-graph_from_adjacency_matrix(wind_mid,mode="undirected",weighted=T)
#plot these two thinned-out networks with weights² as edge thickness
#(squaring the weights is just to increase the visual distinction) plot(g_wind_top,vertex.size=10,vertex.label.cex=0.4,vertex.color=2,edge.width=E(g_wind_top)$weight²)
plot(g_wind_mid,vertex.size=10,vertex.label.cex=0.4,vertex.color=2,edge.width=E(g_wind_mid)$weight²)
列表 3-7:一个脚本,加载 KONECT 风帆运动员网络数据集,并创建其两个较稀疏的版本,通过移除权重不在前四分之一或前两个四分之一的边,然后绘制结果
使用edge_density()函数,我们发现原始网络的密度为 99.3%,前四分之一的网络密度为 25.8%,而中位数以上的网络密度为 51.4%。图 3-7 中的图表展示了这两个稀疏版本的风帆运动员网络。边的粗细代表边的权重,但为了增加它们之间的视觉区分,我们将边的粗细设置为边权重的平方。

图 3-7:风帆运动员网络的两个稀疏版本,其中所有权重不在前四分之一(左)或前两个四分之一(右)的边已被移除
在 R 中运行 SIR 模拟非常简单。使用 igraph 的 sir() 函数,你只需指定网络、感染率(称为 beta)和恢复率(称为 gamma),然后(可选)指定要进行的模拟试验次数(默认值为 100)。感染率决定了每个时间步骤中,一个易感顶点被感染邻居感染的概率(传染性疾病的感染率较高);有两个感染邻居时,被感染的几率会翻倍。恢复率决定了感染持续时间的概率分布;较高的恢复率意味着每个时间步骤中,感染的顶点更有可能转到恢复状态。较高的恢复率意味着感染持续时间较短。
绘制 sir() 的结果时,你将看到网络中活跃感染者的数量,以及在不同试验中的中位数值和估计的置信区间,作为时间的函数。将 median() 函数应用于 sir() 的输出,提供了三条时间序列:易感个体的中位数、感染个体的中位数和恢复个体的中位数。让我们来试试这个。在清单 3-8 中,我们模拟了一个疾病,感染率为 3,恢复率为 2。
#SIR simulations on the original windsurfer network
sim<-sir(g_wind,beta=3,gamma=2)
#plot the result
plot(sim,main="Number of Infected Over Time, Including Confidence Intervals")
#display the median number of infected individuals for each time bucket
median(sim)$NI
清单 3-8:运行 100 次 SIR 模型模拟试验的脚本,使用 KONECT Windsurfer 网络数据集,感染率为 beta=3,恢复率为 gamma=2,然后绘制结果并显示随时间变化的感染个体中位数
图 3-8 显示了结果图表。

图 3-8:原始 KONECT Windsurfer 网络数据集上的 SIR 模拟结果图(100 次试验),展示了随着时间推移,感染个体数量的变化(包含均值和置信区间),疾病的感染率为 3,恢复率为 2
在其峰值时,中位数为 28 个活跃感染者——这占整个网络的 65%。这是一个通过高度连接的网络传播的高度传染性疾病。运行与清单 3-4 中相同的代码,但将感染率降低为 beta=1,并将恢复率提高到 gamma=10,产生了图 3-9 中的图表。

图 3-9:原始 KONECT Windsurfer 网络数据集上的 SIR 模拟(带置信度水平),现在的感染率为 1,恢复率为 10
正如预期的那样,这个新的疫情模拟显示,在较短的时间内,感染人数较少。现在,中位活跃感染人数达到 17,且该疫情的时间周期仅为之前参数的四分之一。当使用 SIR 模型研究现实世界中的疫情时,流行病学家会查阅科学文献中已知的感染率和恢复率参数,如果这些参数尚不清楚,则可以通过已有的传播数据来估算。通常,这些估算会涉及一定程度的不确定性,因此我们可以在不同参数范围内运行 SIR 模拟,以查看可能的结果范围。
中断通信和疾病传播
其中一个有趣的建议应用是利用顶点 Forman–Ricci 曲率对顶点进行排名,以便移除顶点,从而中断网络中的通信和疾病传播。在通信网络中,打断通信可能涉及针对特定的基站或孤立网络中的某个重要节点。2020 年,我们看到了如何通过社交距离和隔离 COVID 感染者或暴露者来帮助停止大城市中的 COVID 传播。回想一下,作者网络中的顶点 7 具有较大的 Forman–Ricci 曲率。我们来运行一个带有和不带顶点 7 的 SIR 模型,比较结果:
#run and plot SIR epidemic on full author's network
sim1<-sir(g_social,beta=3,gamma=2)
plot(sim1,main="Epidemic on Full Author's Network")
#remove vertex 7 from the author's network and rerun SIR epidemic
g2<-delete_vertices(g_social,v=7)
sim2<-sir(g2,beta=3,gamma=2)
plot(sim2,main="Epidemic on Author's Network with Vertex 7 Removed")
这个脚本在原始网络和修改后的网络(移除顶点 7 后)上运行疫情模拟,以比较模拟疫情的严重性。这将生成一个类似于 图 3-10 的初始图表,疫情通过整个网络传播。

图 3-10:作者完整网络上的 SIR 疫情
图 3-10 显示了一个 SIR 疫情,导致五个时间周期的感染传播,中位感染人数为 5。一些模拟结果建议在前两个时间周期内可能出现最多 12 例感染。这是一个相当严重的疫情,预计会影响超过 25% 的人口,直到整个易感人群都被感染。
让我们来看看当顶点 7 被移除时会发生什么,如 图 3-11 所示。

图 3-11:作者修改后的网络(移除顶点 7 后)的 SIR 疫情
图 3-11 显示了一个较轻的疫情,发生在较短的时间框架内。只有四个感染周期,疫情高峰期的中位感染人数仅为 2,最大估计为 8。虽然疫情仍然影响着人群,但它局限于较少的个体,并且迅速结束。在第二个时间周期结束时,大多数模型表明疫情已经结束。
存在许多可以让我们针对顶点来破坏网络的应用。我们不仅可以通过移除网络的某些部分来减轻潜在的流行病风险,还可以通过摧毁具有高度负的 Forman–Ricci 曲率的目标来干扰恐怖分子小组或敌对政府的通信,或者通过摧毁生物网络骨架中的蛋白质或基因来破坏疾病过程。随着网络的发展,Forman–Ricci 曲率的变化也有助于与网络相关的分析能力。
Forman–Ricci 流 是一种几何流(微分方程),与网络上曲率随时间变化相关,类似于热量从定义的起点在网络中扩散。跟踪曲率变化可以识别网络中的变化区域。Forman–Ricci 流为量化网络中连接的增长或收缩区域提供了一种方法,例如恐怖分子小组成员的快速扩展、癌症基因网络中突变的积累,或流行病中疾病传播风险的增加。例如,COVID 隔离期间一些地区的大型聚会或活动增加,导致该地区社会网络中的 COVID 传播加剧。Forman–Ricci 流在图像数据集上的应用也为将医学图像数据从原始源文件映射到标准表面(如平面、球面甚至煎锅)提供了一种方法,这样就可以在患者组内外汇总和比较结果。
总结
在本章中,我们首先看到了第二章中讨论的顶点度量如何作为网络中监督学习的预测因子(包括链接预测),并作为顶点聚类(即社区挖掘)的特征。这种机器学习方法将网络转化为结构化数据集,并应用欧几里得机器学习算法。接着,我们探讨了一些直接在网络中操作的社区挖掘算法。随后,我们将分析从网络内数据转向分析每个数据点本身就是一个网络的数据集。与我们在前述设置中使用顶点度量类似,这里我们使用全局网络度量作为预测因子或特征,对这种网络数据进行机器学习和统计分析。最后,在本章的最后一节中,我们探讨了流行病学中的 SIR 疾病传播模型在网络中的应用。这里的重点是网络几何和网络传播的交集;特别是,我们讨论了一些基于网络几何的、旨在破坏流行病传播的针对性策略。
第六章:网络滤波

我们已经探索了许多通过测量几何属性来分析网络数据的方法。在本章中,我们将介绍加权网络的网络滤波,它跟踪网络上的几何属性和网络度量随阈值的变化。接下来,我们将研究如何将网络数据转换为一个更高维的拓扑对象,称为单纯形复形,并探索我们之前考虑过的网络度量的高维版本。之后,我们将使用与滤波相关的拓扑工具回到图比较的讨论。
图滤波
在前面的章节中,我们回顾了不同的网络度量指标,包括不同的中心性度量、熵、谱半径、直径等许多内容。有一种有趣的方法可以理解加权网络的拓扑属性:图滤波,这是一种通过反复删除低于某一阈值的边(例如,所有权重低于 0.2、0.4 或 0.6 的边)来创建一系列加权网络的方法。通过创建一系列阈值图,我们可以识别持久的网络度量,或在广泛的滤波值范围内持续存在的局部和全局网络度量。这为我们提供了可以绘制或跟踪的特征。这个概念是拓扑数据分析(TDA)的核心思想之一。
为了进一步探索,假设我们正在基于青少年在社区中的友谊或非正式社交关系,研究青少年的纵向教育或风险行为结果。假设我们有加权社交网络,每个顶点都有高的度数度量,其中边的权重是根据青少年与朋友在正常一周中相处的时间来加权的。第一组朋友可能会在周末花几个小时一起踢足球。第二组朋友可能每周一起学习一两次,并在课堂上见面。第三组朋友可能经常一起运动、一起做饭后作业或早晨上学前做作业,并且经常住在彼此家里。当我们过滤相处的时间时,前两组朋友的度数度量将在网络中过滤掉。最后一组则会在滤波过程中保持较高的度数度量,因为他们在一起度过的时间更多。这种度数的持久性很可能会揭示出我们研究中的社交关系的强度。
让我们通过分解和探索两个小的示例社交网络,图 1 和图 2,来研究如何实现图滤波。首先,我们将把这两个网络加载到 R 中,并使用 Listing 4-1 中的脚本探索完整网络的结构。
#load both networks in R
mydata1<-as.matrix(read.csv("Graph1w.csv",header=F))
mydata2<-as.matrix(read.csv("Graph2w.csv",header=F))
#load igraph and convert to graph objects
library(igraph)
g1<-graph_from_adjacency_matrix(mydata1,mode="undirected",weighted=T)
g2<-graph_from_adjacency_matrix(mydata2,mode="undirected",weighted=T)
#plot the two graphs
plot(g1,edge.label=E(g1)$weight,main="Graph 1")
plot(g2,edge.label=E(g2)$weight,main="Graph 2")
Listing 4-1:加载两个不同网络结构以进行滤波的脚本
清单 4-1 中的脚本应该加载两个不同的网络,图 1 和图 2,这两个网络有不同的连接模式,但具有相同数量的顶点。它还应该绘制这两个网络,图中的边权已给出。让我们对比这两个网络,如图 4-1 所示。

图 4-1:两个示例网络的图示
图 4-1 表明,图 1 是一个稀疏连接的网络,边权大多数较大(可能是同一班级的学生在周末参加服务活动的一个样本),而图 2 是一个密集连接的网络,边权具有不同的混合(可能是一个运动队中的友谊网络)。我们预计图 2 中的枢纽得分和其他中心性指标较高,但过滤操作可能会比在图 1 中预期的更快速地改变这些指标。
让我们创建网络的过滤操作,这将使我们能够探索这些网络的一些中心性指标。我们可以通过向清单 4-1 中的脚本添加以下代码来实现:
#filter Graph 1
mydata1[mydata1<0.2]<-0
g12<-graph_from_adjacency_matrix(mydata1,mode="undirected",weighted=T)
mydata1[mydata1<0.4]<-0
g14<-graph_from_adjacency_matrix(mydata1,mode="undirected",weighted=T)
mydata1[mydata1<0.6]<-0
g16<-graph_from_adjacency_matrix(mydata1,mode="undirected",weighted=T)
mydata1[mydata1<0.8]<-0
g18<-graph_from_adjacency_matrix(mydata1,mode="undirected",weighted=T)
#filter Graph 2
mydata2[mydata2<0.2]<-0
g22<-graph_from_adjacency_matrix(mydata2,mode="undirected",weighted=T)
mydata2[mydata2<0.4]<-0
g24<-graph_from_adjacency_matrix(mydata2,mode="undirected",weighted=T)
mydata2[mydata2<0.6]<-0
g26<-graph_from_adjacency_matrix(mydata2,mode="undirected",weighted=T)
mydata2[mydata2<0.8]<-0
g28<-graph_from_adjacency_matrix(mydata2,mode="undirected",weighted=T)
之前的代码通过边权对图 1 和图 2 进行了过滤,使用了逐步增加的 0.2 的区间。这为每个图的过滤产生了五个网络序列,可以通过对每个过滤图应用网络度量来进一步检查这些网络。
让我们通过向脚本中添加以下内容,检查图 1 过滤后的每个顶点的度中心性:
#calculate degree centrality for Graph 1's filtration sequence
d1<-degree(g1)
d12<-degree(g12)
d14<-degree(g14)
d16<-degree(g16)
d18<-degree(g18)
#create a dataset tracking degree centrality across the filtration
g1deg<-cbind(d1,d12,d14,d16,d18)
这段代码计算图 1 过滤操作中的度中心性,应该会生成一个包含表 4-1 中信息的数据集。
表 4-1:图 1 过滤后的度中心性
| Column1 | d1 | d12 | d14 | d16 | d18 |
|---|---|---|---|---|---|
| V1 | 3 | 2 | 2 | 1 | 0 |
| V2 | 2 | 1 | 1 | 1 | 1 |
| V3 | 3 | 3 | 3 | 2 | 1 |
| V4 | 3 | 3 | 3 | 1 | 1 |
| V5 | 2 | 2 | 2 | 2 | 1 |
| V6 | 1 | 1 | 1 | 1 | 0 |
表 4-1 显示,顶点 1、3 和 4 具有较高的度中心性;然而,顶点 3 和 4 在更大范围的过滤操作中保持了这些较高的度中心性值,而顶点 1 则较少,表明它们对网络更为重要,尽管在未过滤网络(列 1)中的中心性指标相同。
现在,让我们添加一些代码来计算图 2 过滤后的度中心性:
#calculate degree centrality for Graph 2's filtration sequence
d2<-degree(g2)
d22<-degree(g22)
d24<-degree(g24)
d26<-degree(g26)
d28<-degree(g28)
#create a dataset tracking degree centrality across the filtration
g2deg<-cbind(d2,d22,d24,d26,d28)
这段代码计算图 2 过滤后的度中心性,产生一个类似于图 1 过滤和中心性计算结果的表格。表 4-2 总结了图 2 过滤和中心性计算的结果。
表 4-2:图 2 过滤后的度中心性
| Column1 | d2 | d22 | d24 | d26 | d28 |
|---|---|---|---|---|---|
| V1 | 4 | 3 | 3 | 3 | 3 |
| V2 | 4 | 4 | 3 | 2 | 1 |
| V3 | 4 | 4 | 3 | 2 | 1 |
| V4 | 5 | 4 | 3 | 0 | 0 |
| V5 | 3 | 3 | 1 | 1 | 0 |
| V6 | 4 | 4 | 3 | 2 | 1 |
如表 4-2 所示,未过滤的图 2 中存在较高的度中心性度量;然而,随着过滤过程的开始,顶点的模式发生了变化。某些顶点,如顶点 1,在整个过滤过程中保持较高的度中心性。其他顶点,如顶点 4,先保持较高的度中心性,然后降到 0。还有一些顶点,如顶点 6,在整个过滤过程中度中心性缓慢下降。这些信息可能对研究某个兴趣子群体中的社会关系有帮助。高程度的非正式社会关系,由较高的中心度表示,已被证明与年轻人在教育成就、职业成就以及应对生活困境方面的韧性有关。
度中心性只是我们可以在过滤过程中计算的一个指标;我们还可以计算其他局部指标,如介数中心性或三元闭合。此外,我们还可以计算全局指标,如谱半径或欧拉特征,通过过滤过程计算图的整体特征。让我们在清单 4-1 中添加以下内容,以计算图 1 每个过滤过程的直径:
#calculate graph diameter of Graph 1's filtration
di1<-diameter(g1)
di12<-diameter(g12)
di14<-diameter(g14)
di16<-diameter(g16)
di18<-diameter(g18)
通过此代码计算的图 1 过滤过程中直径的序列是 2.1、2.9、2.9、1.6 和 0.9。接下来,让我们计算图 2 的过滤过程中的直径:
#calculate graph diameter of Graph 2's filtration
di2<-diameter(g2)
di22<-diameter(g22)
di24<-diameter(g24)
di26<-diameter(g26)
di28<-diameter(g28)
通过此代码计算的图 2 过滤过程中的直径序列是 0.9、1.2、1.6、2.4 和 1.7。这与图 1 的直径序列不同,表明在过滤过程的早期,图 2 的直径通常较小,直到过滤序列后期才变大。这个指标的过滤过程可能有助于评估一个社区的整体水平和非正式社会关系的深度,这是衡量居民在需要时可用的社区资源的一个指标。图 4-2 展示了两者过滤过程中的直径变化图,以便比较这两个网络。

图 4-2:图 1 和图 2 的过滤过程中图直径指标的变化图
正如我们在图 4-2 中看到的,图 1 在过滤初期的图直径大于图 2,但这种关系在过滤值为 0.4 后发生了反转。这表明,图 1 在过滤初期具有更大的偏心性,而图 2 在过滤后期表现出更大的偏心性。请记住,偏心性是网络中从一个点到另一个点的最大距离。
如我们在图 4-2 中绘制的图过滤跟踪,可以帮助区分具有不同连接模式或权重的相似图。动态网络,其中权重可能随时间变化,可能是图过滤的一个应用场景。此外,图过滤在比较具有相同顶点但可能具有不同权重的网络(例如脑成像研究中的患者组)时非常有用;事实上,脑成像研究是图过滤方法发展的应用之一。较高的偏心值表示传递神经信号的路径较长;较强的边权表示大脑两个区域之间的连接更强。强边且偏心值较低表明在特定任务下,患者组的大脑中激活了一个功能模块。
尽管图过滤是一个相对较新的概念,但它主要局限于生物网络数据,包括基于脑成像研究的网络。然而,图过滤方法广泛适用于加权网络数据,其工具集也适合在其他领域进一步发展。如果你想更深入地探讨这个话题,可以查阅本书末尾的参考文献,并尝试在自己的数据上应用图过滤。目前,让我们将注意力转向图的拓扑视角,这使我们能够将图中捕捉到的关系扩展到人与人或物与物之间的其他类型互动。
从图到单纯复形
图可以被视为具有定义全局属性的拓扑对象,我们可以在分析中利用这些属性,通过考虑图中个体和顶点之间的三方、四方和n方互动,将图转化为一个更高维度的图,称为单纯复形。让我们考虑三位同事,他们经常合作撰写学术论文,但从未与所有三位同事的名字一起发表过论文。我们将为这三位同事创建一个简单的图,如图 4-3 所示。

图 4-3:展示三位同事之间双向互动的单纯复形
现在让我们想象一篇论文,所有三位同事都参与其中并且他们的名字出现在论文上。这是一个三方互动,而不是三组二方互动,我们最终会得到一个填充的三角形,而不是三组二向箭头,如图 4-4 所示。

图 4-4:展示三位同事之间三方互动的单纯复形
图 4-4 使用一个三角形来表示同事之间的三向连接,类似于之前用箭头表示同事之间的双向连接。这个概念可以推广到四面体用于四向交互,甚至更复杂的形状来表示更高的n向交互。n的数值没有上限,但当我们向n向交互的单纯形复形展开时,计算问题会逐渐显现。涉及电子邮件链、论文合著者或电话会议的分析是常见的应用,这些应用将社交网络分析和图形扩展到单纯形复形的分析中。根据网络的大小和n向交互的规模,个体和相互作用的单纯形复形表示可能会随着n的值变化变得非常复杂。分析这些结构可能需要大量的计算能力和扩展网络度量的工具。然而,由于图形是拓扑对象,拓扑学的许多定理和工具可以成功应用于它们,而无需进行转换或其他麻烦的操作。这反过来又使得包括偏微分方程和概率论在内的其他数学领域能够应用和发展于图形之上。
就像我们可以对加权图进行过滤一样,我们也可以对单纯形复形进行过滤。单纯形复形的过滤过程取决于单纯形复形的构建方式。在大多数拓扑数据分析算法中,我们从一个数据点云开始,该点云位于可以定义距离度量的空间中。当点之间共享互相的n向重叠集(Čech 复形)或成对重叠集(Vietoris–Rips 复形)时,这些点会被纳入单纯形复形。通过顺序地增大或减小距离度量的值,我们获得了单纯形复形的过滤。在实践中,Vietoris–Rips 复形更容易计算,并且是许多常见拓扑数据分析包的基础。这引领我们进入网络分析的一个全新且新兴的领域:将网络工具扩展到单纯形复形。
在前几章介绍的许多工具都有简单复形的类比,包括偏心度、最短路径算法、中心性指标(Katz 中心性、特征向量中心性、接近中心性等)、三元闭合等等。通常,网络数据的简单复形是通过计算网络中的最大团体构建的(尽管也可以定义距离度量并应用前述过程,从网络数据中构建简单复形)。网络的最大团体包括顶点群体中最高的n路互联边。这些最大团体对应于一个(n–1)简单复形。图的旗形复形涉及通过计算图的最大团体来构建图的简单复形。从这个复形中,我们可以定义每个简单复形层次的量,并将这些量合并成一个跨层次的总度量。这意味着我们可以在简单复形的各个层次上获得更多关于网络及其组成部分的整体结构信息。
让我们回到前几章介绍的 Farrelly 社交网络,看看度数中心性的扩展——所谓的拓扑维度。我们可以将拓扑维度定义为加权度数中心性,即通过该顶点所在团体的维度来加权每个顶点,这涉及到对一个顶点不同维度团体的求和。例如,网络中一个位于最大二团体和最大三团体中的顶点,其拓扑维度为 5。一个位于最大五团体而没有其他团体的顶点,其拓扑维度也为 5。然而,前者的度数可能是 3,分别连接到二团体中的一个顶点和三团体中的两个顶点;而后者的度数为 4,连接到五团体中的四个顶点。
在列表 4-2 中,我们有一个脚本,它计算 Farrelly 社交网络中顶点的最大团体和拓扑维度。
#load the author's network
g_social<-read.csv("SocialNetwork.csv")
#create the graph
library(igraph)
g1<-graph_from_adjacency_matrix(g_social,mode="undirected",weighted=F)
#compute the maximal cliques in the author's network data
cl<-maximal.cliques(g1)
#create array
cl<-as.array(cl)
#get clique size from maximal clique array
d<-dim(cl)
l<-rep(NA,d)
for (i in 1:d){
l[i]<-length(as.vector(cl[[i]]))
}
#create matrix of vertices in maximal cliques
av<-matrix(rep(NA,d*20),20)
for (i in 1:20){
for (j in 1:d){
av[i,j]<-i%in%cl[[j]]
}
}
#convert to binary indicators
avind<-ifelse(av==TRUE,1,0)
#multiply out to calculate each vertex's topological dimension
topmat<-t(avind)*l
topdim<-colSums(topmat)
列表 4-2:一个计算 Farrelly 社交网络中顶点拓扑维度的脚本
这个脚本基于图的旗形复形计算拓扑维度。它首先从最大团体计算旗形复形;然后存储每个团体的信息,以便我们可以循环遍历每个团体,查看哪些顶点属于每个团体。将这些信息转换为二进制指示矩阵后,我们可以将团体的维度与指示矩阵相乘,得到一个包含每个顶点拓扑维度的向量。表 4-3 展示了作者网络数据集中每个顶点的拓扑维度和度数。
表 4-3:Farrelly 社交网络中顶点的拓扑维度和度数总结
| 顶点 | 度数 | 拓扑维度 |
|---|---|---|
| 1 | 2 | 3 |
| 2 | 1 | 2 |
| 3 | 5 | 11 |
| 4 | 2 | 3 |
| 5 | 4 | 7 |
| 6 | 3 | 6 |
| 7 | 8 | 18 |
| 8 | 3 | 4 |
| 9 | 3 | 4 |
| 10 | 3 | 6 |
| 11 | 3 | 5 |
| 12 | 1 | 2 |
| 13 | 4 | 8 |
| 14 | 4 | 7 |
| 15 | 4 | 8 |
| 16 | 2 | 4 |
| 17 | 2 | 4 |
| 18 | 3 | 6 |
| 19 | 2 | 4 |
| 20 | 1 | 2 |
表 4-3 展示了度数与拓扑维度之间的显著区别,度数仅在计算中考虑了作者网络的顶点和边,而拓扑维度则包括了更高阶的交互作用。例如,顶点 9 和 10 的度数都是 3;然而,它们的拓扑维度不同,顶点 9 的得分为 4,顶点 10 的得分为 6。顶点 10 在整个网络结构中的重要性大于顶点 9。如果不考虑网络中的更高阶交互作用,我们将无法在这个度量上区分这两个顶点。
对于加权网络,可以将这些基于单纯形复形的度量与图滤波结合起来,产生基于网络的单纯形复形的度量序列。当我们在本章的下一部分讨论一个名为持久同源性的工具时,你将会看到这一点。你也可以用欧拉示性数、拓扑维度或尚未开发的单纯形复形扩展的网络度量来做同样的事。
网络度量的单纯形复形扩展是网络科学中的一个全新研究领域,目前几乎没有计算网络度量单纯形类比的包或开源函数。然而,希望这个例子以及一些相关论文能够激发在网络科学包中加入基于单纯形的度量。也许你会接受这个挑战,向 igraph 包或其他开源网络科学工具贡献函数。
接下来我们要介绍的工具涉及的拓扑学内容将比我们之前遇到的更多,所以首先让我们探索一个在图分析和理解单纯形复形中都非常有用的拓扑学概念。
同源性简介
我们下一个工具集的基本拓扑学前提是涉及计算对象或数据集中的不同维度的孔。想象一张纸的中间有个洞,或者一个篮球内部有一团空气。这些是不同维度的孔,每个孔将一个物体的连通部分与它的其他部分分开。当这些孔出现在流形或函数中时,我们可以系统地研究它们,并根据这些孔的数量和维度对物体或空间进行分类。
同调是对一个物体或空间中不同维度孔洞(连通成分、圆圈、球体、空洞等)进行计数,通常用于对该物体或空间进行分类。对于低维空间,这个过程相当直接;你实际上可以构建空间的物理模型并计数孔洞。然而,也有一些同调变体,允许拓扑学家区分不同类型的物体和空间,即使它们是高维或形状奇特的,也无需物理模型。
对应于每个维度中孔洞的数字形成了一组有用的数值,称为贝蒂数,它们组织了给定物体或空间中的孔洞数量和类型,以便可以将每个物体与其他具有相同贝蒂数的物体进行分类和研究。如果你熟悉代数拓扑学,这是一种标准的抽象数学结构分类程序。通常,这些数字存储在一个向量中。虽然这有点抽象,但我们将通过一些简单的示例来解释。
贝蒂数的示例
很多运动都涉及到使用球,但从拓扑学的角度来看,并不是所有的球都是相同的。篮球和棒球都是三维空间中的圆形球体。篮球通常比棒球大,但如果有一个大小和棒球相同的儿童玩具篮球,可能会觉得它们非常相似。

图 4-5:一个例子,展示了看起来相似但拓扑上不同的棒球和篮球
然而从拓扑学角度来看,它们是完全不同的。这两个球在第二贝蒂数上有所不同,第二贝蒂数用于计算物体中的三维空洞。贝蒂数向量是一个无限的数字序列,表示每个维度中的孔洞数,起始位置为零维的连通成分,接着是圆圈(第一维度位置)、空洞(第二维度位置)以及更高维度的空洞(从第三维度开始,直到无限维度)。实际上,大多数数据集在第一个贝蒂数之后没有太多孔洞,因此我们可以用零填充贝蒂数向量的其余部分。空心篮球在第一个贝蒂数之后有一个孔,因为它包含一个空洞,因此其贝蒂数向量为(1,0,1,0,...),而实心棒球在任何维度上都没有孔,对应的贝蒂数向量为(1,0,0,0,...)。
有些物体在给定维度上有多个孔。例如,假设在图 4-5 中将一个第二个篮球粘贴到篮球的外表面上。这个物体显然会有另一个空洞,产生一个贝蒂数向量(1,0,2,0,...)。一个甜甜圈,或称为环面,具有(1,2,1,0,...)的向量,因为它有两个开口的圆圈定义了管道的两端,这两个圆圈连接后形成了一个空洞。图 4-6 展示了从纸片构建环面的经典方法。

图 4-6:通过连接边缘的纸片构造一个环面
对于那些能够轻松在三维中可视化的对象和空间,分类相对容易。然而,许多行业中使用的数据集涉及的不止三维,比较和分类这些对象需要能够辨别与这些对象相关的 Betti 数字的算法;其中包括基因组数据集(可能涉及百万维空间)、视频序列和多元时间序列。
欧拉示性数
一种基于拓扑的度量出现在网络分析和其更高维单纯复形的类似体中,它与前面章节引入的曲率概念相关。欧拉示性数,通常用符号 χ 表示,提供了一个数字来概括拓扑空间,并且是一个拓扑不变量,意味着所计算的拓扑量在空间连续变形(拉伸、扭曲或以其他方式操作而不撕裂空间)时不会发生变化。欧拉示性数可以通过 Betti 数字定义;从技术上讲,通过这种方式计算欧拉示性数涉及 Betti 数字的交替求和(零次 Betti 数字 – 一次 Betti 数字 + 二次 Betti 数字 – 三次 Betti 数字 + 四次 Betti 数字……直到存在的最高 Betti 数字)。
欧拉示性数也可以通过单纯复形的维度来定义(顶点数量 – 边的数量 + 三角形的数量 – 互相四向互动的数量 + ……)。然而,包含在边中的顶点不计入顶点数量。作为互相四向互动一部分的三角形也不计算在内。
然而,有一种简单的方法可以使用与最大团体相关的 igraph 函数来获得网络或其更高维单纯复形的最大部分(如前所述)。最大 k 团体表示并计数从网络中派生的完整单纯复形的 k – 1 维单纯形。它们是构建完整单纯复形并跟踪每个 n 维互动中涉及的部分的方便方式。让我们在 Listing 4-2 的脚本中添加代码,来计算作者网络中的最大团体:
#create a table counting the number of k+1 simplices in the simplicial complex
summ<-as.numeric(summary(cl)[,1])
jjj<-table(summ)
这段代码创建了一个表,总结了我们之前计算的网络中的最大团体。结果应当产生 11 个二团体(一维单纯形或边),6 个三团体(二维单纯形或三角形),以及 1 个四团体(三维单纯形或四方互动)。我们可以将这些值代入欧拉示性数公式:
χ = 0 个顶点 – 11 条边 + 6 个三角形 – 1 个四面体
这给出了一个χ值为-6。最近的研究表明,大多数真实世界的网络具有负欧拉特征。网络数据趋向于负欧拉特征有一个非常有趣的原因,这与网络的曲率有关。图中的负曲率与网络的鲁棒性相关;具有高度负曲率的生物网络通常能够承受网络部分功能的丧失,而不会对有机体产生不利影响。高斯–博内定理将通过同调定义的欧拉特征与物体的曲率相关联,包括流形的曲率和流形边界的曲率。最近有一些尝试将网络分析工具如同调和福尔曼–里奇曲率结合起来,深入研究网络特性。这是数学中的一个深刻结果,属于微分几何分支,连接了物体的局部几何与其全局拓扑,它是网络科学中的一个较新的研究领域。现在我们知道,网络拓扑和几何是相互关联的,接下来让我们看看一个叫做持久同调的拓扑工具。
持久同调
今天数据分析中最常用的拓扑基础算法之一是持久同调,它已被应用于基因组学、医疗保健、经济学、能源、心理测量学以及许多其他领域。本质上,持久同调算法的思想是根据数据的不同阈值,从数据构建一个点云,将其过滤成一系列单纯复形(类似于 MRI),并追踪在每个切片中出现和消失的拓扑特征,如孔或空隙。例如,考虑图 4-7 中的三个奶酪切片,每个切片中都有圆形的孔;这些圆形影响数据集的第一个贝蒂数。

图 4-7:包含不同位置孔的三个奶酪切片
在图 4-7 中,所有三个切片中都有一个孔,另一个只出现在中间的切片中,还有一个出现在两个切片中。实际数据中的孔和空隙可以有不同的大小,当我们穿越切片时,孔的直径可能会增大或缩小。持久同调算法对特征的寿命和测量孔的最小大小有阈值。在我们的例子中,我们有一些可能是噪声的特征(要么是半径太小,要么只出现在一片奶酪中),还有一些可能是真实数据集中的特征(例如,出现在所有三个切片中的空隙)。让我们来解读一下这个直觉。
假设我们想比较两个数据集,以查看它们是否来自相同的分布或形状。这在匹配图像数据时很常见。虽然图像数据很少有奶酪孔,但圆形在图像数据中经常出现,通常表现为眼睛。
从技术上讲,通过改变用于构建单纯复形的距离(或过滤),可以在过滤过程中跟踪不同的贝蒂数,并为数据中的每个孔洞分配一个重要性分数,其中重要特征在较长的过滤距离下持续存在(在持久同调的术语中,这被称为持久性)。在图 4-7 中,出现在所有三个切片中的孔洞被视为最重要的特征,而仅出现在第二个切片中的孔洞可能是数据中的噪声。然后,这些特征可以绘制在条形码或持久性图上,以跟踪这些特征的生命周期(它们在过滤中存在的距离尺度)。我们将在接下来的示例分析中探讨条形码和持久性图。
实际上,由于计算问题,数据集通常仅检查低维的孔洞和特征,除非明确计算高维形状数据,否则最常使用零阶(连接成分)和一阶(圆形)贝蒂数。图 4-7 中的示例在所有三个切片中都是连接的,因此它在所有切片中的零阶贝蒂数为 1。然而,圆形在过滤过程中出现并消失,形成类似于图 4-8 的条形码。

图 4-8:绘制在图 4-7 框中的特征(孔洞)持久性的图示
条形码显示了特征出现和消失的时间。例如,在图 4-8 中,我们可以看到一个特征在时间 2 出现并在时间 3 消失(这是图 4-7 中的底部奶酪孔)。数据切片中连接成分的序列与另一种机器学习方法——单链接层次聚类——有着奇特的关系,其中每个高度层级的簇对应于该特定切片中的连接成分。当两种技术使用相同的距离度量时,结果实际上是相同的;然而,持久同调方法将提供比单链接层次聚类的树状图更多的关于数据结构的信息。这意味着机器学习从业者可以选择最适合问题的技术,因为这两种方法各自都有自己的图表和统计测试。例如,对于非技术受众,单链接层次聚类可能更为可取,因为树状图和热图对于生物学家或社会科学家来说更为熟悉。
持久同调下的网络比较
在网络分析领域,持久同调可以是比较网络结构的有用方法,以判断不同的网络是否具有相同的基本几何形状。让我们进一步探索这个问题,并应用于模拟网络。在神经科学中,通常将 fMRI 或 PET 数据转化为网络结构,其中大脑的不同区域转化为顶点,并根据活动模式(例如,某个区域的顺序激活,或在同一任务中多个区域的共同激活)将其连接到大脑的其他区域。研究中常见的目标是比较不同组的患者,无论是健康患者与患有特定神经或心理疾病的患者之间,还是两组患病群体之间,以了解在不同疾病间大脑激活模式的差异。
我们将探讨在比较这两种网络时,持久同调的应用。由于 fMRI 数据并不容易作为开源数据获取,我们将在 igraph 中模拟大约与脑成像网络相当规模的网络;这将演示如何将这种方法应用于已经转化为网络数据的成像数据。
igraph 包允许你模拟多种类型的网络数据,包括 Erdös–Renyi 图、无标度图和 Watts–Strogatz 图。我们将使用列表 4-3 中的脚本来创建这些类型的图。
#simulate three graphs using the igraph package for further comparison
library(igraph)
#create an Erdos-Renyi graph
g1<-erdos.renyi.game(30,0.3)
#create a scale-free graph
g2<-sample_pa(30,power=2.5,directed=F)
#create a Watts-Strogatz graph
g3<-sample_smallworld(2,5,3,0.3)
#plot the three graphs created
plot(g1,main="Erdos-Renyi Graph")
plot(g2,main="Scale-Free Graph")
plot(g3,main="Watts-Strogatz Graph")
列表 4-3:一个模拟三种不同类型网络结构的脚本,用于统计比较
列表 4-3 创建了三种不同类型的网络,这些网络可以通过持久同调进行比较;它还可视化这些网络,结果应与图 4-9 类似(但可能不完全相同)。

图 4-9:三种模拟网络类型的绘图
图 4-9 显示了非常不同类型的图。中间的无标度图包括一个包含许多与中心节点连接但不与其他节点连接的顶点的中心节点。左侧的 Erdös–Renyi 图和右侧的 Watts–Strogatz 图有更多的相互连接,但 Watts–Strogatz 模型似乎具有更多的结构,将顶点连接成团体,而不是随机连接顶点。
让我们将持久同调应用于这些网络,并通过添加以下内容到列表 4-3 来比较这些网络之间持久性图的距离;请注意,由于每种网络类型的模拟不同,您的结果可能会有所不同:
#load TDA package
library(TDAstats)
#get adjacency matrices
m1<-as.matrix(get.adjacency(g1))
m2<-as.matrix(get.adjacency(g2))
m3<-as.matrix(get.adjacency(g3))
#compute persistent homology
d1<-calculate_homology(m1,dim=2,format="cloud")
d2<-calculate_homology(m2,dim=2,format="cloud")
d3<-calculate_homology(m3,dim=2,format="cloud")
#plot persistence diagrams
plot_persist(d1)
plot_persist(d2)
plot_persist(d3)
#compute distances among graphs
w1<-phom.dist(d1,d2,limit.num=0)
w2<-phom.dist(d1,d3,limit.num=0)
w3<-phom.dist(d2,d3,limit.num=0)
该补充部分从每个模拟的图中推导出一个邻接矩阵,并从该邻接矩阵计算一个持久性图,然后通过零阶同调群之间的距离进行比较。这个脚本应该生成三个持久性图,看起来像图 4-10(注意它们不会完全相同,因为每次运行都会生成稍微不同的结果)。

图 4-10:三种模拟网络类型的持久性图(从上到下:Erdös–Renyi、无尺度图和 Watts–Strogatz)
图 4-10 展示了在每种网络类型中发现的不同拓扑特征。Watts–Strogatz 网络和 Erdös–Renyi 图都产生了许多大的零阶同调特征(即点),而无尺度图则有不同大小的零阶同调特征。无尺度图没有更高阶的同调特征,而其他两个图有第一阶同调特征(即三角形),尽管这些特征非常接近对角线(这表明它们可能是噪声)。直接位于对角线上的点是仅出现在数据一个切片中的特征;一个点离对角线越远,它在数据中存在的时间就越长。对于我们的三种模拟网络,仅从持久性图来看,很难判断无尺度图和 Watts–Strogatz 图是否与 Erdös–Renyi 图有显著差异。
我们可以在脚本中添加内容,以推导出 Erdös–Renyi 持久性图的零分布,并使用一种特殊的距离度量——Wasserstein 距离,来统计检验 Erdös–Renyi 持久性图与无尺度图和 Watts–Strogatz 持久性图之间的结构差异:
#get Wasserstein distance between random graphs with the same structure
ww<-rep(NA,100)
for (i in 1:100){
g1<-erdos.renyi.game(30,0.3)
g2<-erdos.renyi.game(30,0.3)
m1<-as.matrix(get.adjacency(g1))
m2<-as.matrix(get.adjacency(g2))
d1<-calculate_homology(m1,dim=2,format="cloud")
d2<-calculate_homology(m2,dim=2,format="cloud")
ww[i]<-phom.dist(d1,d2,limit.num=0)
}
#compute 95% confidence intervals from the simulated null distribution
quantile(ww,c(0.025,0.975))
该脚本从与原始持久性图构建相同的分布中创建 Erdös–Renyi 持久性图的零分布;由于模拟部分具有随机成分,您的结果可能会有所不同。我们的零分布的分位数给出了一个置信区间(0.91, 8.36),其中包括比 Erdös–Renyi 图与 Watts–Strogatz 图(23.59)之间持久性图计算出的距离和 Erdös–Renyi 图与无尺度图(39.78)之间的距离小得多的距离。因此,我们可以得出结论,Watts–Strogatz 图和无尺度图的结构不是随机的。这些图的每个结构都包含了显著的结构成分。
这种类型的模拟在测试来自 fMRI 和 PET 成像研究的脑网络持久性图之间的差异时非常有用,而且在 R 中实现起来也很简单。该方法也可以应用于其他具有假设性基础结构的网络,如社交网络或电力网。许多其他类型的网络分析工具也可以用于比较图形结构,例如局部和全局度量(包括图的半径和直径、度分布、聚类图系数等),而且这些比较目前还没有被深入探索。
总结
在本章中,我们过滤了加权网络,以了解在根据边权重移除边的过程中,网络度量如何变化。然后,我们从网络数据中构建了简单复形,以利用多个拓扑工具,包括度量的扩展、欧拉示性数以及一种基于过滤的算法——持久同调,这些工具可用于比较网络。 在下一章中,我们将从网络科学转向距离几何,探索不同的测量选择如何影响监督学习和无监督学习算法。
第七章:数据科学中的几何学

在本章中,我们将探索几何学中的几个工具:我们将研究距离度量及其在k-最近邻算法中的应用;我们将讨论将高维数据映射到潜在弯曲的低维流形的流形学习算法;并且我们将看到如何将分形几何应用于股票市场数据。本章的动机来源于流形假设,该假设认为现实世界中的数据通常具有比收集到的数据集维度更低的自然维度。换句话说,一个具有 20 个变量(即 20 维度)的数据集,可能在 12 维空间或 8 维空间中有更好的表示。鉴于维度的诅咒,在低维空间中表示数据是理想的(尤其是当数据集的原始维度很大时,如基因组学或蛋白质组学数据)。选择合适的距离度量来创建这些表示对于解决方案的质量具有重要意义。
数据中的距离度量简介
许多机器学习算法依赖于距离度量,它们提供了空间或流形中点或对象之间的度量。选择距离度量的变化可以显著影响机器学习的表现,正如我们将在本章后面看到的那样。距离度量提供了空间或流形中点或对象之间的度量。这可以像使用尺子测量平面纸上两点之间的距离那样简单,正如图 5-1 中所演示的。

图 5-1:纸面上两个点的图示及连接它们的直线
然而,使用尺子来测量球面上两点之间的距离肯定会更为复杂。
如果你用一根绳子标出连接球面上两点的最短路径,如图 5-2 所示,你可以在绳子上标记距离,然后用尺子测量拉直后的绳子上的距离。这类似于在流形上度量距离时所做的事情,其中测地线(相对于弯曲流形的两点之间的最短路径)被提升到切空间(由切线、切平面和更高维切线定义的零曲率空间)来测量距离。

图 5-2:球面上两个点的图示,以及连接它们的测地线
我们将在第六章中更深入地探讨切空间及其在机器学习中的应用,但目前你可以将其想象为将弦提升到一张大纸上,并用尺子测量其长度,以便在曲面外部测量距离,因为在这里更难建立标准的测量方式。虽然测地线和切空间看起来违反直觉,但它们源自我们对欧几里得几何中切线和微积分中导数的理解。
然而,还有其他情况下,两点之间的距离会更加复杂。考虑从一个房屋走到另一个房屋,正如在图 5-3 中所示。

图 5-3:一个社区的房屋图,其中一个人在两栋房屋之间走动
除非有人能够在邻近的房屋之间穿行,而不碰到外墙和内墙(更不用说遇到不满的邻居了!),否则无法画出一条在两栋房屋之间的直线或测地线来提供一条直接路径,正如在图 5-4 中所看到的。

图 5-4:一个社区的房屋图,其中一个人尝试在房屋之间画一条直线
相反,走人行道要实际得多(见图 5-5)。

图 5-5:一个社区的房屋图,其中一个人在房屋之间的人行道上走动
距离通常是离散的,而非连续的,或者位于具有曲率的流形上。理解数据空间的几何形状,可以很好地指示出适合数据的距离度量。在接下来的部分中,我们将介绍一些机器学习中常见的距离度量,之后的章节中,我们会将这些距离应用于k-NN 算法和降维算法。
常见的距离度量
由于度量距离的复杂性,理解一些机器学习中常用的距离度量非常重要,包括我们在第四章中简要接触到的一个(Wasserstein 距离,用于比较持久同调结果)。距离度量有无限多种,有些距离度量还具有可以引起无限种变体的参数。因此,我们无法涵盖所有可能在机器学习中遇到的距离度量。我们已经排除了在推荐系统中有用的某些度量,如余弦距离,因为它们在拓扑数据分析或网络分析应用中并不常见。我们将探讨一些常见的度量;如果你有兴趣深入了解,我们建议你探索度量几何这一领域。
模拟一个小数据集
在我们开始探索常见的距离度量之前,让我们通过清单 5-1 来模拟一些数据。
#create data
a<-rbinom(5,4,0.2)
b<-rbinom(5,1,0.5)
c<-rbinom(5,2,0.1)
mydata<-as.data.frame(cbind(a,b,c))
#create plot
library(scatterplot3d)
scatterplot3d(a,b,c,main="Scatterplot of 3-Dimensional Data")
清单 5-1:模拟并绘制小数据集的脚本
这个脚本创建了一个包含三个变量的数据集,并在三维空间中绘制点。这将生成一个绘制在三个坐标轴上的点图(图 5-6)。

图 5-6:五个点的图,所有点都位于由变量a、b和c定义的坐标轴上
这个数据集包括清单 5-2 中显示的点,我们将用它来计算点之间的距离。
> **mydata**
a b c
1 2 1 0
2 0 0 1
3 1 0 0
4 0 0 0
5 3 0 0
清单 5-2:包含模拟数据集中五个点的矩阵,这些点有随机变量a、b和c
现在我们已经生成了一个数据集,让我们看看一些可以用来衡量数据集中点对之间距离的标准距离度量。R 自带了一个非常方便的包,叫做stats包(它是 R 基本安装的一部分),可以通过dist()函数计算一些常见的距离度量。
使用基于范数的距离度量
我们首先考虑的距离是相关的。范数是一个函数或向量的“长度”度量。范数涉及将距离差异的幂次求和,然后对结果应用该幂次的根。例如,对于点之间的欧几里得距离,会先求出差异的平方和,然后对结果取平方根。对于单个向量(即单个数据点),范数将是从原点到该点的加权距离,其中坐标轴互相交叉。你可以把它想象成从原点到被测点的直线长度。回到我们点的散点图,可能像图 5-7 所示那样绘制。

图 5-7:一个包含五个点的图,图中有一条直线指向集合中的某个点
用于度量点之间度量距离的最常见范数可能是前面提到的欧几里得距离,由 L²-范数给出,定义为点之间的平方距离的平方根,其中 L 是向量(或向量组)的占位符,指数是范数的幂次(这里是 2)。这是高中的几何学课程中通常教授的距离,也被称为毕达哥拉斯距离。我们在图 5-4 中看到了它,图中显示了房屋之间最短距离的直线(按鸟飞的路径从空中看)。统计学家在计算回归算法中的平方误差时通常使用欧几里得距离的平方;由于一些原因,我们在这里不再深入探讨,使用欧几里得距离的平方是非常自然的。
与 L²范数相关的是 L¹范数,或称曼哈顿距离。曼哈顿距离计算类似于图 5-5 中给出的邻域示例。曼哈顿距离定义为沿每个轴的点差的总和,轴的点差被求和到一个最终的轴距离总计中。假设我们有两个点(0, 1)和(1, 0),它们可能表示患者是否在疾病模型中某个感兴趣基因中存在基因突变。曼哈顿距离是(0 + 1) + (1 + 0),即沿所有向量轴的点差之和。在这个例子中,我们发现曼哈顿距离为 2。
该度量在处理计数数据或其他离散数据格式时非常有用,例如本节前面生成的示例数据集。图 5-5 演示了这种类型的距离计算,其中人物需要沿着南北轴和东西轴在人行道上行走。曼哈顿距离和 L¹范数在 Lasso 回归和弹性网回归的应用中经常出现,用于将β系数设置为 0,如果它们距离原点在某个范围内,从而执行变量选择并创建稀疏模型。这在自变量集维度较高(如基因组数据)的情况下非常有用。
L¹范数和 L²范数的推广是闵可夫斯基距离,它将范数从 L³范数推广到 L∞范数。L∞范数是基于范数的距离的另一种特殊实例,称为切比雪夫距离。从数学角度来看,切比雪夫距离是沿任一轴之间的最大距离。它常用于涉及机械或自主系统(如无人机)计划运动的问题中。
随着范数维度的增加,闵可夫斯基距离值通常会减少并趋于稳定。因此,具有高维范数的闵可夫斯基距离可以充当距离平滑器,抑制曼哈顿或欧几里得距离计算中发现的奇异或异常大的距离。闵可夫斯基距离确实有一些条件,包括零向量的长度为零,应用正标量倍数于向量时不会改变向量的方向,并且两点之间的最短距离是直线(称为三角不等式条件)。在 R 的dist()函数中,范数的维度由参数p给出,其中p=1对应曼哈顿距离,p=2对应欧几里得距离,依此类推。
曼哈顿距离的一个特殊扩展是堪培拉距离,它是 L¹范数的加权和。从技术上讲,堪培拉距离是通过找到一对点之间的距离的绝对值,并将其除以这对点的绝对值之和,然后对点对求和来计算的。当处理离群值、入侵检测或混合类型预测变量(连续和离散测量)时,堪培拉距离可以是一个有用的度量。在图 5-7 中的示例点可能不是统计学上的离群值,但它确实位于与其他模拟点不同的数据空间中。
让我们运行这些距离并将结果与本节前面模拟的数据集进行比较;将以下内容添加到列表 5-1 中的代码:
#run distance metrics on example dataset
d1<-dist(mydata,"euclidean",upper=T,diag=T)
d2<-dist(mydata,"manhattan",upper=T,diag=T)
d3<-dist(mydata,"canberra",upper=T,diag=T)
d4<-dist(mydata,"minkowski",p=1,upper=T,diag=T)
d5<-dist(mydata,"minkowski",p=2,upper=T,diag=T)
d6<-dist(mydata,"minkowski",p=10,upper=T,diag=T)
这段代码计算了应用于我们示例数据集的欧几里得距离、曼哈顿距离、堪培拉距离和闵可夫斯基距离的度量。通过查看模拟数据集中点对之间的欧几里得距离,如表格 5-1 所示,我们可以看到许多点对之间的值有很多小数位数,这是由于计算欧几里得距离时涉及的平方根。
表格 5-1:在列表 5-2 的矩阵中,点对之间的欧几里得距离计算
| 欧几里得 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 0 | 2.44949 | 1.414214 | 2.236068 | 1.414214 |
| 2 | 2.44949 | 0 | 1.414214 | 1 | 3.162278 |
| 3 | 1.414214 | 1.414214 | 0 | 1 | 2 |
| 4 | 2.236068 | 1 | 1 | 0 | 3 |
| 5 | 1.414214 | 3.162278 | 2 | 3 | 0 |
继续查看曼哈顿距离(表格 5-2),点对之间的距离变为整数,因为计算过程中涉及沿每个轴的离散步长来分隔点。
表格 5-2:在列表 5-2 的矩阵中,点对之间的曼哈顿距离计算
| 曼哈顿 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 0 | 4 | 2 | 3 | 2 |
| 2 | 4 | 0 | 2 | 1 | 4 |
| 3 | 2 | 2 | 0 | 1 | 2 |
| 4 | 3 | 1 | 1 | 0 | 3 |
| 5 | 2 | 4 | 2 | 3 | 0 |
正如预期的那样,闵可夫斯基距离计算结果与p=1时的曼哈顿距离和p=2时的欧几里得距离一致。在表格 5-3 中,你可以看到p=1时的闵可夫斯基距离。
表格 5-3:在列表 5-2 的矩阵中,点对之间的闵可夫斯基距离计算
闵可夫斯基 p=1 |
1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 0 | 4 | 2 | 3 | 2 |
| 2 | 4 | 0 | 2 | 1 | 4 |
| 3 | 2 | 2 | 0 | 1 | 2 |
| 4 | 3 | 1 | 1 | 0 | 3 |
| 5 | 2 | 4 | 2 | 3 | 0 |
堪培拉距离与曼哈顿距离给出了一些相似和重叠的值。然而,由于距离计算中的加权部分,某些距离是不同的(特别是涉及点 2 或 3 的对),如表 5-4 所示。
表 5-4:在清单 5-2 矩阵中的点对之间的堪培拉距离计算
| 堪培拉 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 0 | 3 | 2 | 3 | 1.8 |
| 2 | 3 | 0 | 3 | 3 | 3 |
| 3 | 2 | 3 | 0 | 3 | 1.5 |
| 4 | 3 | 3 | 3 | 0 | 3 |
| 5 | 1.8 | 3 | 1.5 | 3 | 0 |
在清单 5-2 的距离矩阵计算中,对于某些点,这三种距离为一对点(例如点 4 和 5)提供相同的距离评分。然而,当我们增加p值时,某些距离会发生显著变化(例如点 1 和 2)。如果我们在支持向量机分类器中使用这些距离度量,我们可能会得到一个非常不同的线来划分数据,或者产生非常不同的错误率。
还有其他修改或扩展基于范数的距离的方法。一种常见的修改方式类似于堪培拉距离:马哈拉诺比斯距离在计算欧几里得距离之前,应用加权方案,然后再对结果取平方根,使得欧几里得距离通过协方差矩阵加权。如果协方差矩阵只是单位矩阵,马哈拉诺比斯距离将退化为欧几里得距离。如果协方差矩阵是对角矩阵,则结果是标准化的欧几里得距离。因此,马哈拉诺比斯距离提供了一种“中心化”的距离度量,可以识别数据样本中的杠杆点和异常值。它通常用于聚类和判别分析,因为异常值和杠杆点可能会扭曲结果。
在 R 中计算马哈拉诺比斯距离有一个简单的方法:mahalanobis()函数。让我们再次添加到我们的脚本中:
#run Mahalanobis distance metrics
#first use the covariance to center the data
d7<-mahalanobis(mydata,center=F,cov=cov(mydata))
#then center to one of the points of the data, in this case point 1
d8<-mahalanobis(mydata,center=c(2,1,0),cov=cov(mydata))
#then use the column means to center the data
d9<-mahalanobis(mydata,center=colMeans(mydata),cov=cov(mydata))
这段代码将计算使用不同中心化策略的马哈拉诺比斯距离,产生三个不同的杠杆/加权标准距离度量,参考表 5-5 中的详细内容。
表 5-5:来自图 5-7 矩阵的个体点的马哈拉诺比斯距离结果
| 马哈拉诺比斯 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 仅协方差 | 6.857143 | 6.857143 | 0.857143 | 0 | 7.714286 |
| 点 1 | 0 | 8 | 5.428571 | 6.857143 | 7.714286 |
| 列的含义 | 3.2 | 3.2 | 0.628571 | 2.057143 | 2.914286 |
通过将每个点作为中心,你可以完成一个类似于dist()函数创建的距离矩阵。你只需遍历各个点并将行附加到数据框中。
从马哈拉诺比斯距离计算中可以得出一些有趣的观察结果。当只使用协方差时,原点成为计算距离的参考点,而位于原点的点 4 的马哈拉诺比斯距离为 0。然而,当使用列均值来居中数据时,这个点的值跳跃到了一个更远的值。这表明,尽管点 4 在原点上完全居中,但它距离列均值相当远。另一个有趣的趋势是点 3,它既靠近原点,也靠近居中的列均值,在这个数据集中居中的列均值为(1.2, 0.2, 0.2)。点 3 位于(1, 0, 0),既靠近原点,又靠近这个居中的列均值。其他点相对较远,无论是从原点还是从居中的列均值。
我们可以将这些列均值添加到数据的图中,并通过再次修改脚本来可视化马哈拉诺比斯距离是如何工作的:
#add point to dataset created earlier in this section
colmean<-c(1.2,0.2,0.2)
mydata<-rbind(mydata,colmean)
#create plot
library(scatterplot3d)
scatterplot3d(mydata[,1],mydata[,2],mydata[,3],
main="Scatterplot of 3-Dimensional Data")
这段代码将列均值点添加到原始数据集中,以检查数据在三维空间中应该位于哪里;该代码应生成一个类似于图 5-8 的图形。
检查图 5-8 并与图 5-6 进行比较,我们可以看到一个点被放置在轴外,似乎在五个点中占据了一个中心位置。找到数据集的中心位置有助于进行几个数据科学任务,包括发现隐性异常值(即没有任何一个变量极端值但在多变量数据集中远离大多数点的异常值)和计算多变量统计量。正如我们的马哈拉诺比斯结果所示,某些点离这个中心位置更近;这些点是我们数据集中的点 3 和点 4,它们相对靠近原点。

图 5-8:对于 Listing 5-2 中矩阵中的各个点,通过列均值居中计算的马哈拉诺比斯距离图,其中列均值点显示在轴外
这些距离差异在许多机器学习应用中都会出现,我们将在本章稍后应用这些距离于k-最近邻问题时,看到距离如何影响机器学习的表现和结果。不同的度量选择会导致性能的剧烈变化,使用错误的度量可能会误导模型结果和解释。
比较图形、形状和概率分布
基于范数的距离度量并不是机器学习中唯一可能的度量类。如我们在第四章中所看到的,除了点之间的距离外,还可以计算其他对象之间的距离,如持久性图。粗略来说,这些度量衡量的是概率分布之间的差异。我们已经简要使用过其中的一种,即 Wasserstein 距离,用于比较持久性图分布。现在让我们更仔细地看看。
Wasserstein 距离
粗略来说,Wasserstein 距离比较了两种分布中堆积的概率权重堆。它通常被称为“地球搬运工距离”,因为 Wasserstein 距离衡量的是将一种分布的概率堆移到另一个分布所需的成本和努力。对于那些数学上更为精通的读者,p阶 Wasserstein 距离可以通过将联合分布的边际期望值提升到p次方,求出所有这些随机变量的联合概率分布的下确界,然后再对结果取p次方根来计算。然而,这些细节超出了本书的预期范围,我们将在探索这个度量时坚持“地球搬运工距离”的直观理解。让我们通过可视化两种泥土堆的分布来帮助理解这个度量(图 5-9)。

图 5-9:两种泥土堆积物的分布,类似于可以使用 Wasserstein 距离度量进行比较的概率密度函数类型
图 5-9 中的堆积物 1 在左侧有一大堆泥土,如果我们要将堆积物 1 的泥土分布转化为堆积物 2 的分布,那么这些泥土需要铲到右侧的堆积物中。我们的泥土搬运工将需要移动相当多的泥土才能将堆积物 1 变成堆积物 2。然而,如果堆积物 2 的泥土分布更接近堆积物 1,如图 5-10 所示,那么我们的泥土搬运工所需的工作量就会减少。

图 5-10:两种泥土堆积物的分布,类似于可以使用 Wasserstein 距离度量进行比较的概率密度函数类型,该度量衡量的是泥土搬运工将堆积物 1 转化为堆积物 2 所需的工作量
要从分布 1 到达分布 2,你可以想象有人正在铲泥土。铲掉的泥土量对应着 Wasserstein 距离。非常相似的概率密度函数会有较小的 Wasserstein 距离;而那些非常不相似的概率密度函数则会有较大的 Wasserstein 距离。
因此,Wasserstein 距离是比较概率分布的一个很好的度量工具——可以用来比较理论分布与样本分布,看看它们是否匹配;也可以用来比较来自相同或不同群体的多个样本分布,看看它们是否匹配;甚至可以用来理解在机器学习函数中是否可能使用更简单的概率分布来近似底层数据,以便机器学习算法中的计算更容易进行。
虽然我们在这里不会深入探讨,但有些分布——包括计数数据、是/否数据,甚至是机器学习输出结构(如树状图)——可以通过其他度量进行比较。现在,让我们看看另一种比较概率分布的方法,这一次是对于离散分布。
熵
一类常见的距离度量涉及一个被称为 熵 的属性。信息熵由概率密度函数的负对数定义,衡量概率密度函数中每个点的非随机性程度。通过理解每个值中分布所包含的信息量,就可以比较不同分布之间的信息差异。这对于比较复杂的概率函数或机器学习算法的输出,以及推导非参数统计检验,可以是一个非常有用的工具。
二项分布在数据科学中经常出现。我们可能认为一个随机顾客在两种新界面设计之间没有偏好(在 A/B 测试中,50% 的顾客偏好 A,50% 的顾客偏好 B)。我们可以估计 10 个、20 个或 10,000 个顾客偏好 A 而非 B 的机会,并将其与提供反馈的实际顾客样本进行比较。一个假设可能是我们有不同的顾客群体,其中一个群体非常小。当然,在实际中,我们不知道顾客群体的实际偏好分布,并且可能没有足够的数据通过比例检验来数学地比较这些分布。利用某种度量可以帮助我们推导出检验。
为了更直观地理解这一点,让我们通过 清单 5-3 中的代码来模拟两个二项概率分布。
#create samples from two different binomial probability distributions
a<-rbinom(1000,5,0.1)
b<-rbinom(1000,5,0.4)
#create plot of probability density
plot(density(b),ylim=c(0,2),main="Comparison of Probability Distributions")
lines(density(a),col="blue")
清单 5-3:模拟不同二项概率分布的脚本
图 5-11 显示了这两个二项分布具有非常不同的密度函数,信息存储在分布的不同部分。

图 5-11:为比较绘制的两个二项分布的密度函数
黑色曲线分布,分布 b,**在比分布 a(灰色曲线)覆盖更多值的范围内包含了更广泛的信息。基于熵的度量可以用来量化分布 a 和 b 之间在信息存储上的差异。R 提供了许多工具和包,用于量化和比较信息熵。让我们进一步探索。
R 中的 philentropy 包包含 46 种不同的度量方法,用于比较概率分布,其中包括许多基于熵的度量方法。比较流行的熵度量之一是Kullback–Leibler 散度,它度量两个概率分布的相对熵。从技术上讲,Kullback–Leibler 散度度量的是两个概率分布之间对数差异的期望(离散分布为求和,连续分布为积分)。因此,它是信息增益或损失的度量。这使我们能够将信息熵转换为一种分布比较工具,当我们试图比较那些可能不适合常规统计工具的未知或复杂的概率分布时,这个工具非常有用。
让我们通过回到我们的两个二项分布a和b,来培养直觉。我们将通过在列表 5-3 中添加以下内容来计算这两个分布之间的 Kullback–Leibler 散度:
#load package
library(philentropy)
#calculate Kullback-Leibler divergence
kullback_leibler_distance(P=a,Q=b,testNA=T,unit="log2",epsilon=1e-05)
这段代码计算了在列表 5-3 中生成的两个二项分布样本的 Kullback–Leibler 散度。在这组模拟数据中,Kullback–Leibler 散度为 398.5428;另一组这些分布的模拟可能会得出不同的散度值。然而,通过使用非参数检验,我们可以将这个散度值与我们分布之一的随机误差成分进行比较,从而判断分布a和b之间的熵是否存在统计学上的显著差异。我们可以在脚本中添加内容,利用熵差异创建非参数统计检验:
#create a nonparametric test
#create a vector to hold results from the simulation loop
test<-rep(NA,1000)
#loop to draw from one of the binomial distributions to generate
#a null distribution for one of our samples
for (i in 1:1000){
new<-rbinom(1000,5,0.1)
test[i]<-kullback_leibler_distance(P=a,Q=new,testNA=T,unit="log10",epsilon=1e-05)
}
#obtain the cut-off score for 95% confidence intervals, corresponding
#to values above/below which a sample would be considered statistically
#different than the null distribution
quantile(test,c(0.025,0.0975))
本次测试的置信区间表明置信区间为 1,427–1,475,这意味着我们的分布存在显著差异。这是可以预期的,因为分布a和b的值和范围非常不同。绘制最后一个模拟的分布(图 5-12)表明,新分布与a的匹配度远高于与b的匹配度。

图 5-12:三个二项分布的密度函数图,用于比较,其中两个来自相同分布样本的样本
使用 Kullback–Leibler 散度,我们已经确定a和b是统计学上不同的种群。如果我们看到包含 104.2 的置信区间,我们会得出结论:a和b可能来自同一个总体分布。实际中,像比例检验这样的统计检验存在用于比较二项分布,但有些离散分布或样本大小并没有容易的统计比较方法(例如,来自两个卷积神经网络分类器的预测类别分布的比较)。
形状比较
正如我们在第四章中看到的,点集和形状(例如持久性图)可以是重要的数据结构,这些对象也可以被衡量和比较。接下来的三个度量将更深入地讨论这种情况。我们从两个半径不同的圆的例子开始,如图 5-13 所示。

图 5-13:两个半径不同的圆
现在,假设这两个圆是公园中的小径,有人正在遛狗,狗沿外环行走,主人沿内环行走。图 5-14 显示了这一视觉效果。

图 5-14:一只狗和主人通过牵引绳连接,在公园的不同小径上行走
在某些时刻,主人和她的狗靠得很近,短牵引绳就足够将它们连接起来。然而,随着它们逆时针移动,主人和狗之间的距离增加,需要更长的牵引绳才能将它们连接起来;你可以在图 5-15 中看到这一点。

图 5-15:一只狗和主人通过更长的牵引绳连接,在公园的不同小径上行走
一个历史上重要的度量是弗雷歇距离,它用于比较不同形状上点之间的距离。我们在这里考虑的弗雷歇距离版本适用于离散测量(通常被认为是多边形)。从多边形构建网格图,并计算最小最大路径,找到两个路径之间可能的最大距离。可以对路径本身及其沿路径的同步性做出许多假设;最严格的要求产生了所谓的同伦弗雷歇距离,这在许多机器人学问题中有应用。我们将在第八章中回到同伦应用的问题。
目前,用更通俗的说法,弗雷歇距离被称为“遛狗距离”,它在分析中有许多用途。它不仅可以用于测量曲线或形状上点之间的最大距离,还可以测量形状或曲线上点之间的总距离。许多 R 包包括计算现有版本的弗雷歇距离的函数,包括以下示例中使用的 TSdist 时间序列包。在此包中,两个时间序列是从 ARMA(3, 2) 分布生成的,Series 3 包含 100 个时间点,Series 4 包含 120 个时间点。时间序列在跟踪病人群体中的疾病进展、股市变化以及买方行为等方面非常重要。
让我们加载这些包生成的时间序列并绘制它们,使用列表 5-4 中的代码来可视化潜在的差异。
#load package and time series contained in the TSdist package
library(TSdist)
data(example.series4)
data(example.series3)
my1<-example.series4
my2<-example.series3
#plot both time series
plot(my1,main="Time Series Plots of Series 4")
plot(my2,main="Time Series Plots of Series 3")
列表 5-4:加载并检查两个时间序列数据集的脚本
图 5-16 显示了两条具有明显高低起伏的时间序列。

图 5-16:两个示例时间序列的绘图
请注意,时间序列之间的重叠并不完全,我们预期我们的比较会显示这些时间序列之间的一些差异。使用 Fréchet 距离,我们可以衡量时间序列之间的最大/最小偏差(最大/最小链条长度)以及整个比较集的偏差总和。我们将通过向脚本中添加以下代码来检查第 3 序列和第 4 序列的这两个值:
#calculate Frechet distance
dis1<-FrechetDistance(my1,my2,FrechetSumOrMax="sum")
dis2<-FrechetDistance(my1,my2,FrechetSumOrMax="min")
dis3<-FrechetDistance(my1,my2,FrechetSumOrMax="max")
这段代码计算了时间序列之间 Fréchet 距离的最小值、最大值和总和,应该会得出时间序列曲线之间距离总和为 402.0,时间序列曲线之间点的最大距离为 13.7,时间序列曲线之间点的最小距离为 0.03。这表明,时间序列在某些比较点的值大致相同,而在其他点的值则有很大差异。时间序列曲线之间的距离总和将趋近于对时间序列进行连续时间积分的结果;这一计算可以成为计算函数之间面积的良好工具,使用离散且相对快速的近似方法。
然而,除了 Fréchet 距离,还有其他方法可以用来比较形状,这些方法有时是更可取的。让我们再次回到我们的两个圆,并将它们移动使它们相交,如图 5-17 所示。

图 5-17:两个相交圆的绘图
我们可以将每个圆上的点想象成我们测量 Fréchet 距离时所做的那样。我们考虑圆 B 上的一个点以及它在圆 A 上的最近点(如图 5-17 所示)。圆 B 上的每个点都会有一个在圆 A 上的最近点,这些点构成了一个最近点的集合。图 5-17 中选择的点是一个特殊的点集。它们是我们最近点集合中最远的两个点。这意味着,从一个圆跳到另一个圆所需的最大距离就出现在这两个点之间。这个距离被称为Hausdorff 距离,在早期的计算机视觉和图像匹配任务中有着广泛的应用。如今,它主要用于序列匹配、图形匹配以及其他离散对象匹配任务。
然而,Hausdorff 距离的一个局限性是,所比较的集合必须存在于相同的度量空间中。因此,虽然我们可以比较圆上的点,但不能直接用 Hausdorff 距离比较圆上的点和球面上的点,或者欧几里得平面上的点和正曲率球面上的点。被比较的两个对象必须处于相同的度量空间中。
幸运的是,这个难题有一个解决方案。我们可以简单地在将这两个度量空间映射到单一度量空间时,测量它们之间最远的最短距离,同时保持每个空间内点之间的原始距离(称为等距嵌入)。因此,我们可以将球体及其点投影到切平面上,以与其他欧几里得空间进行比较。或者,我们可以将两个物体嵌入到一个更高维的空间中,类似于内核应用中所做的那样。这种 Hausdorff 距离的扩展被称为Gromov–Hausdorff 距离。
让我们围绕这个度量建立一些直觉。假设我们有一个三角形和一个四面体,如图 5-18 所示。

图 5-18:一个三角形和四面体,它们存在于不同维度的欧几里得空间中
图 5-18 中描述的这个问题的一个解决方案是将三角形简单地带入三维欧几里得空间,并计算三维欧几里得空间中物体之间的距离。也许三角形的一部分在嵌入三维空间时与四面体重叠,如图 5-19 所示。

图 5-19:一个三角形和四面体,它们都被映射到三维欧几里得空间中
现在我们可以计算这两个物体最远点集合与最近点集合的距离,这些点可能出现在三角形或四面体的某个尖端。
R 有一个很好的包用于计算 Gromov–Hausdorff 距离(gromovlab),因此我们可以轻松地在 R 中实现这个距离度量。首先,让我们使用清单 5-5 中的代码模拟一个来自二维圆盘的小样本。
#create two-dimensional disc sample
a<-runif(100,min=-1,max=1)
b<-runif(100,min=-1,max=1)
#create circle from uniform distribution and restrict to points within the
#circle
d<-a²+b²
w<-which(d>1)
mydata<-cbind(a,b)
mydata<-mydata[-w,-w]
#plot sample
plot(mydata,main="2-Dimensional Disc Sample",ylab="y",xlab="x")
清单 5-5:从二维圆盘中采样的脚本,用于检查 Gromov–Hausdorff 距离
绘制时,这应该会呈现出一个大致的圆盘形状;请查看图 5-20。

图 5-20:从二维圆盘中采样的样本
现在,让我们在清单 5-5 的基础上添加代码,从同样的均匀分布中模拟一个相同大小的样本,该分布用于生成我们的二维圆盘样本:
#create a uniform sample from a line segment
x<-sort(runif(dim(as.data.frame(mydata))[[1]],min=-1,max=1))
我们添加的代码从其中一个线段采样,以给出一个一维空间。这为我们提供了两个维度不同的欧几里得空间。现在,我们可以计算每个样本的原生空间中的点之间的距离(对于圆盘是二维欧几里得空间,对于线段是一维欧几里得空间)。从这里,我们可以通过添加以下代码来计算我们的样本之间的 Gromov–Hausdorff 距离:
#load the package and calculate the distance matrices for use in calculations
library(gromovlab)
m1<-dist(as.matrix(mydata))
m2<-dist(as.matrix(x))
#calculate distance metric and compare distances with Gromov-Hausdorff
gromovdist(m1,m2,"lp",p=2)
这段代码让我们可以比较样本中各点之间的距离矩阵。对于这个随机样本,Gromov–Hausdorff 距离为 5.8。我们可以像在清单 5-3 中那样,基于我们的度量模拟一个非参数检验,以帮助我们判断圆盘和直线的嵌入是否在统计上相同。更改度量参数可能会改变嵌入之间的显著差异或嵌入的质量,正如我们在本章前面比较堪培拉、曼哈顿和欧几里得距离时所看到的那样。感兴趣的读者可以尝试调整嵌入参数,设置自己的非参数检验,看看对于圆盘和直线样本,Gromov–Hausdorff 距离的结果如何变化。
lp 参数允许使用本章前面讨论的基于范数的度量。对于这个特定的比较,我们使用了欧几里得范数,因为这两个样本都位于欧几里得空间中,而且所使用的距离矩阵是由欧几里得范数定义的。其他范数,如曼哈顿范数或切比雪夫范数,也可以使用,甚至可能在其他问题中更为合适,并且该软件包支持处理图形和树结构以及距离矩阵。需要注意的是,这个特定的软件包会遍历所有可能的等距嵌入,因此,对于某些问题,所需的计算时间和内存可能会很大。
K-最近邻与度量几何
度量几何在许多算法中都有应用,包括k-最近邻(k-NN)分析,它根据周围对象的分类来对观察进行分类。理解这种方法的一种方式是考虑一个有不同学生小圈子的高中食堂,如图 5-21 所示。

图 5-21:一个有三个不同学生小圈子的高中食堂
在图 5-21 所示的食堂中,存在三个学生小圈子:一个深灰色圈子、一个灰色圈子和一个浅灰色圈子。学生们倾向于待在自己的朋友群体附近,正如学生 A、B 和 C 所展示的那样。这些学生被他们的朋友包围,如果根据一个距离度量(比如欧几里得距离或学生间地砖的数量)分类他们,依据离他们最近的任意数量的学生,就能给出相当准确的小圈子分类。
然而,也有一些学生,比如 D 和 E,位于其他群体附近,或者位于所有三个群体之间。学生 E 可能是流行群体的一员(位于底部中央),同时也是大学运动员群体的一员(位于顶部左侧);而学生 D 可能是流行的学生、大学运动员以及数学队成员(位于顶部右侧)。根据在对学生 D 和 E 进行分类时,考虑的离他们最近的学生数量,他们可能会被分配到他们的主群体,也可能会被错误地重新分配到一个新的群体,尽管他们可能适合该群体,但并不认为这是他们的主群体。例如,最近的 10 个学生可能会正确地将学生 E 分配到流行群体,而最近的 2 个学生则无法做到这一点。
因此,k-NN 方法依赖于邻域大小(在本例中是距离目标学生最近的学生数量)和定义哪些学生最接近目标学生的距离度量方法。让我们更仔细地看看距离度量方法如何影响 k-NN 分类准确性。在一个模拟数据集中,假设有三个变量影响分类,另外还有三个噪声变量,数据来自 清单 5-6,并使用了 knnGarden 包(该包包括了前面章节中使用基于规范的距离度量分析的许多距离)。你首先需要下载该包(cran.r-project.org/web/packages/knnGarden/index.html)并在本地安装。
#install package (and devtools if not installed)
#your local computer might save the .tar file in a different path than ours
library(devtools)
install_local("~/Downloads/knnGarden.tar")
#create data
a<-rbinom(500,4,0.2)
b<-rbinom(500,1,0.5)
c<-rbinom(500,2,0.1)
d<-rbinom(500,2,0.2)
e<-rbinom(500,1,0.3)
f<-rbinom(500,1,0.8)
class<-a+e-d-rbinom(500,2,0.3)
class[class>=0]<-1
class[class<0]<-0
mydata<-as.data.frame(cbind(a,b,c,d,e,f,class))
#partition data into training and test sets (60% train, 40% test)
s<-sample(1:500,300)
train<-mydata[s,]
test<-mydata[-s,]
#create KNN models with different distances and five nearest neighbors
library(knnGarden)
#Euclidean
ke<-knnVCN(TrnX=train[,-7],OrigTrnG=train[,7],TstX=test[,-7],
K=5,method="euclidean")
accke<-length(which(ke==test[,7]))/length(test[,7])
#Canberra
kc<-knnVCN(TrnX=train[,-7],OrigTrnG=train[,7],TstX=test[,-7],
K=5,method="canberra")
acckc<-length(which(kc==test[,7]))/length(test[,7])
#Manhattan
km<-knnVCN(TrnX=train[,-7],OrigTrnG=train[,7],TstX=test[,-7],
K=5,method="manhattan")
acckm<-length(which(km==test[,7]))/length(test[,7])
清单 5-6:一个生成并通过 k-NN 分类进行分类的脚本,使用不同的距离度量方法和五个邻居
清单 5-6 创建一个示例,并运行 k-NN 算法,基于不同的距离度量方法(包括曼哈顿距离、欧几里得距离和堪培拉距离)对数据点进行分类。在这个特定的模拟中,所有的距离方法得到了相似的准确度(欧几里得距离 81%、曼哈顿距离 81% 和堪培拉距离 82%)。我们可以通过修改 清单 5-6,将最近邻数量增加到 20,从而考虑更大的邻域。
#create KNN models with different distance metrics and 20 nearest neighbors
#Euclidean
ke<-knnVCN(TrnX=train[,-7],OrigTrnG=train[,7],TstX=test[,-7],
**K=20**,method="euclidean")
accke<-length(which(ke==test[,7]))/length(test[,7])
#Canberra
kc<-knnVCN(TrnX=train[,-7],OrigTrnG=train[,7],TstX=test[,-7],
**K=20**,method="canberra")
acckc<-length(which(kc==test[,7]))/length(test[,7])
#Manhattan
km<-knnVCN(TrnX=train[,-7],OrigTrnG=train[,7],TstX=test[,-7],
**K=20**,method="manhattan")
acckm<-length(which(km==test[,7]))/length(test[,7])
该脚本修改了计算 k-NN 模型的函数,修改部分已用粗体标出;我们将参数更改为 K=20。对于这个特定的模拟数据集,当考虑 20 个最近邻时,分类准确率存在显著差异。欧几里得距离和曼哈顿距离的准确率略低,为 78.5%,而堪培拉距离则给出了更差的准确率,只有 57%。邻域大小对堪培拉距离的准确率有较大影响,但对欧几里得距离和曼哈顿距离的影响较小。一般来说,使用更多的最近邻有助于平滑数据,类似于加权平均的效果。结果表明,对于我们的堪培拉距离,增加更多的最近邻可能会使数据过度平滑。然而,曼哈顿距离和欧几里得距离的运行结果并没有表现出这种平滑效应,仍然保持其原有的高性能。正如我们的例子所示,距离度量的选择在算法性能中可能起着至关重要的作用,也可能几乎没有影响。因此,距离度量在算法设计中起着与其他参数选择类似的作用。
k-NN 模型是与度量几何和邻域关系最为紧密的模型之一,尽管许多其他方法也依赖于距离度量或邻域大小。近期有许多论文提出,采用多尺度方法来定义算法邻域能够提升算法性能,包括在 k-NN 回归、深度学习图像分类、持久图和单纯形算法(包括持久同调)中的应用,且这一新兴领域近年来不断发展壮大。
在许多机器学习领域中,距离度量的选择尤为重要,尤其是在降维任务中,我们将一个高维数据集映射到低维空间。例如,假设我们有一个基因组数据集,包含一组患者的 300 个感兴趣的基因位点。这对于在 PowerPoint 幻灯片中展示给相关人员来说,显得有些过于复杂。然而,如果我们能够找到一种好的映射到二维空间的方式,就可以在幻灯片中加入一个数据的散点图,使得人们更容易理解。
流形学习
许多降维算法也涉及距离度量和 k-NN 计算。最常见的降维算法之一是 主成分分析(PCA),它通过在原始高维空间和低维目标空间之间的线性映射,将高维数据整合到低维空间中。本质上,PCA 寻找一组理想的线性基底,以便在保持最多方差的同时使用尽可能少的线性基底(将与数据相关的大部分信息压缩进来);这样我们就能丢弃那些包含较少相关信息的数据空间基底。这有助于我们可视化存在三维以上的数据,也有助于去相关化输入到模型中的预测因子。
然而,如前所述,PCA 假设数据位于几何平坦的空间中,并映射到一个低维的平坦空间。正如我们所看到的,这并不总是如此,欧几里得度量可能会给出与其他距离度量不同的距离结果。近年来,许多放宽不同假设并将降维推广到流形的尝试提供了一类新的降维技术,称为流形学习。流形学习允许映射到可能弯曲的低维空间,并且将 PCA 推广到包括非欧几里得距离的度量。流形是一个局部欧几里得空间,欧几里得空间就是流形的一种示例,因此有些人将流形学习视为这个更一般框架的总称。
使用多维尺度法
其中一种较老的流形学习算法是多维尺度法(MDS)。MDS 将点嵌入欧几里得空间,旨在尽可能保持点之间的距离(可以是欧几里得距离)。这是通过最小化用户定义的代价函数来实现的。通过欧几里得距离定义距离和代价函数,得到的结果与 PCA 相同。然而,MDS 不必局限于欧几里得距离,许多其他度量可能更适合特定问题。让我们通过一个小数据集和不同的距离矩阵作为 MDS 算法的输入,进一步探讨这个问题;请查看清单 5-7 中的代码。
#create data
a<-rbinom(100,4,0.2)
b<-rbinom(100,1,0.5)
c<-rbinom(100,2,0.1)
d<-rbinom(100,2,0.2)
e<-rbinom(100,1,0.3)
f<-rbinom(100,1,0.8)
mydata<-as.data.frame(cbind(a,b,c,d,e,f))
#create distance matrices using different distance metrics
m1<-dist(mydata,upper=T,diag=T)
m2<-dist(mydata,"minkowski",p=10,upper=T,diag=T)
m3<-dist(mydata,"manhattan",upper=T,diag=T)
清单 5-7:生成示例数据集并从数据集中计算距离矩阵的脚本
现在我们已经生成了一些数据,并计算了三种不同的距离度量,让我们看看距离度量的选择如何影响 MDS 嵌入。我们来计算 MDS 嵌入并通过添加到清单 5-7 来绘制结果。
#reduce dimensionality with MDS to two dimensions
c1<-cmdscale(m1,k=2)
c2<-cmdscale(m2,k=2)
c3<-cmdscale(m3,k=2)
#plot results
plot(c1,xlab="Coordinate 1",ylab="Coordinate 2",
main="Euclidean Distance MDS Results")
plot(c2,xlab="Coordinate 1",ylab="Coordinate 2",
main="Minkowski p=10 Distance MDS Results")
plot(c3,xlab="Coordinate 1",ylab="Coordinate 2",
main="Manhattan Distance MDS Results")
我们对清单 5-7 的补充应会产生不同的绘图结果。在这个例子中,绘图(如图 5-22 所示)确实会根据使用的度量产生显著不同的结果,这表明不同的距离度量会导致嵌入到不同的空间。

图 5-22:MDS 结果并排显示,结果随选择的距离度量而变化
图 5-22 中的绘图结果表明,闵可夫斯基距离与欧几里得距离或曼哈顿距离的结果有很大不同;在闵可夫斯基类型的 MDS 结果中,许多点聚集在一起,这表明它可能无法像其他度量那样区分点对。然而,欧几里得和曼哈顿距离 MDS 结果之间的差异较小,点分布比在闵可夫斯基距离情况下要广泛得多。
扩展多维尺度法与 Isomap
一些流形学习算法将 MDS 扩展到其他类型的空间和距离计算。Isomap通过用从邻域图计算出的地理距离矩阵替换距离矩阵来扩展 MDS。这种通过地理距离替换距离计算的方法允许在非平坦空间(例如球面,地理信息系统数据,或通过 MRI 检查的人体器官)上使用自然存在的距离。通常,通过检查点的最近邻来估算距离。这赋予了 Isomap 一个邻域的特征,并提供了一种通过最近邻参数的方差来研究缩放作用的方法。
让我们通过在清单 5-7 中添加内容来探索这一修改,该内容模拟了一个数据集并探索了 MDS。我们将使用欧几里得距离作为相异度度量,尽管其他距离度量也可以像 MDS 中一样使用。为了理解邻域大小的作用,我们将创建 5、10 和 20 个最近邻的邻域:
#create Isomap projections of the data generated in Listing 5-6
library(vegan)
i1<-scores(isomap(dist(mydata),ndim=2,k=5))
i2<-scores(isomap(dist(mydata),ndim=2,k=10))
i3<-scores(isomap(dist(mydata),ndim=2,k=20))
#plot results
plot(i1,xlab="Coordinate 1",ylab="Coordinate 2",main="K=5 Isomap Results")
plot(i2,xlab="Coordinate 1",ylab="Coordinate 2",main="K=10 Isomap Results")
plot(i3,xlab="Coordinate 1",ylab="Coordinate 2",main="K=20 Isomap Results")
这段代码将 Isomap 应用于清单 5-7 中生成的数据集,并使用欧几里得距离。可以使用其他距离度量,这可能会给出不同的结果,正如 MDS 分析中所示。Isomap 分析的结果表明,对于这个数据集,邻域大小在确定结果中的作用不大,正如图 5-23 中的每个坐标的比例所示。

图 5-23:Isomap 结果的并排视图,结果随最近邻数量变化
MDS 和 Isomap 的目标是保留点之间的距离,无论这些点在数据流形上的距离有多远,从而实现距离的全局保留。还有其他全局流形学习算法,能够保留不在同一邻域中的点之间的距离。如果你有兴趣,可以探索一些全局算法,如核 PCA、自编码器和扩散映射。
使用局部线性嵌入捕捉局部性质
有时候,流形的全局性质不像局部性质那么重要。实际上,从流形的经典定义来看,局部性质有时可能更有趣。例如,当我们寻找一个点的最近邻时,从几何上非常远的点可能不会是该点的最近邻,但附近的点可能是最近邻,并且这些信息需要在高维空间和低维空间之间的映射中被保留。局部流形学习算法旨在保留局部性质,而在空间映射中较少关注保留全局性质。
局部线性嵌入(LLE)就是这样一种局部流形学习算法,它是使用较为频繁的流形学习算法之一。粗略来说,LLE 从一个最近邻图开始,然后为每个点根据其最近邻生成一组权重。接着,算法根据一个代价函数计算映射,并保持每个点的最近邻权重集。这使得它能够保持流形上相邻点之间的几何信息。
回到我们在列表 5-7 中的代码,接下来我们将对代码进行扩展,并探索将 LLE 映射到一个二维空间中,使用不同数量的邻居。对于这个包,你需要下载该包(mran.microsoft.com/snapshot/2016-08-05/web/packages/TDAmapper/README.html)并本地安装它:
#install package
library(devtools)
install_local("~/Downloads/lle.tar")
#create LLE projections of the data generated in Listing 5-6
library(lle)
l1<-lle(mydata,m=2,k=5)
l2<-lle(mydata,m=2,k=10)
l3<-lle(mydata,m=2,k=20)
#plot results
plot(l1$Y,xlab="Coordinate 1",ylab="Coordinate 2",main="K=5 LLE Results")
plot(l2$Y,xlab="Coordinate 1",ylab="Coordinate 2",main="K=10 LLE Results")
plot(l3$Y,xlab="Coordinate 1",ylab="Coordinate 2",main="K=20 LLE Results")
这段代码将 LLE 算法应用于我们的数据集,变更算法计算中考虑的最近邻数量。让我们通过观察这个数据集的图表,来理解最近邻在这个局部算法中的作用(见图 5-24)。

图 5-24:LLE 结果的并排视图,结果随最近邻数量的变化而变化
如图 5-24 所示,邻域大小对 LLE 结果以及新二维空间中点的分布有很大影响。由于最近邻的数量会影响保存的邻域大小,较大的值会导致 LLE 变得更为全局,将该算法转化为更具全局性质的流形学习算法。在K=20时似乎能够获得较好的分离,这比K=5的局部性要差一些,但对于一个包含 100 个点的数据集来说,仍然是一个相对较小的邻域。如果我们将 K 设置为 100,就会得到一个全局性的算法,生成一个二维图,点在新空间中具有良好的分离和扩展;你可以在图 5-25 中看到这一点。

图 5-25:使用整个样本作为最近邻的 LLE 结果图
还有其他局部流形学习算法,其中一些允许像 LLE 的邻域大小那样调整缩放参数。如果你感兴趣,可以探索拉普拉斯特征映射、Hessian LLE 和局部切空间分析。
使用 t-分布随机邻居嵌入进行可视化
我们现在已经看到局部算法是如何通过邻域大小定义来捕捉全局特性的。有些流形学习算法明确地捕捉局部和全局特性。一个更著名的算法是一个名为t-分布随机邻域嵌入(t-SNE)的可视化工具。该算法有两个主要阶段:在高维空间中创建点的概率分布,然后通过最小化 Kullback–Leibler 散度将这些分布与低维空间中的分布进行匹配。因此,该算法并不是从点之间的距离计算开始,而是聚焦于匹配分布之间的距离,以找到最优空间。
t-SNE 并不是通过点的k-最近邻来定义邻域,而是通过数据中核函数的带宽来定义邻域;这会产生一个名为困惑度的参数,该参数也可以变化,以理解邻域大小的作用。让我们回到在清单 5-7 中生成的数据,看看这在实际中是如何工作的。请添加以下代码:
#create t-SNE projections of the data generated in Listing 5-7
library(Rtsne)
library(dimRed)
t1<-getDimRedData(embed(mydata,"tSNE",ndim=2,perplexity=5))
t2<-getDimRedData(embed(mydata,"tSNE",ndim=2,perplexity=15))
t3<-getDimRedData(embed(mydata,"tSNE",ndim=2,perplexity=25))
#plot results
plot(as.data.frame(t1),xlab="Coordinate 1",ylab="Coordinate2",
main="Perplexity=5 t-SNE Results")
plot(as.data.frame(t2),xlab="Coordinate 1",ylab="Coordinate2",
main="Perplexity=15 t-SNE Results")
plot(as.data.frame(t3),xlab="Coordinate 1",ylab="Coordinate2",
main="Perplexity=25 t-SNE Results")
这段代码在使用清单 5-7 生成的数据集上运行 t-SNE,改变了困惑度参数。绘图应该会生成类似于图 5-26 的内容,显示低困惑度试验中的聚类比高困惑度试验中的聚类更多。

图 5-26:困惑度设置不同的 t-SNE 结果并排绘图
困惑度为 15 和 25 的绘图看起来相当相似,并且随着困惑度的增加,低维空间中坐标的范围减小。某些项目可能在后续分析或可视化可能的趋势时,需要数据的分布更广;而其他项目则可能通过更紧密的数据得到更好的结果。
总结来说,本章中的距离度量在机器学习应用中经常出现。流形学习尤其涉及度量、邻域大小和数据空间映射到的空间类型的不同选择。有许多优秀的教材和论文更详细地介绍了这些算法和类似的算法。然而,我们希望你已经获得了关于降维方法的概览——特别是那些与度量几何紧密相关的方法。
在继续之前,让我们考虑度量几何的最后一个用途。
分形
另一个与度量几何相关的工具涉及一种几何对象中的自相似性,称为分形。本质上,分形具有同样模式中的同样模式中的同样模式,依此类推。图 5-27 提供了一个示例。

图 5-27:一个分形的示例。注意不同尺度下的图案具有自相似性。
分形在自然和人为系统中经常出现。例如,海岸线、血管、音乐音阶、封闭空间内的疫情传播、股市行为以及单词频率和排名等都在不同尺度下具有自相似性特征。能够测量分形维度使我们能够更好地理解这些现象的自相似性程度。如今有很多分形维度估计器,但大多数都依赖通过某种迭代方法,比较相邻点集的面积变化,从而测量分形曲线下的面积。
回到图 5-27 中的分形,我们可以考虑加入盒子,计算每个迭代曲线下的面积,并将不同尺度下的相对值进行比较,如同在图 5-28 中展示的那样。

图 5-28:在尺度上测量一系列分形曲线下的面积示例
现在我们对分形有了一些直观理解,让我们来考虑分形维度度量的一个应用。股市在一段时间内常常表现出某种程度的自相似行为。理解市场波动性是明智投资的重要方面,而预测即将到来的市场反转点(如股市崩盘)的一种方法是分析自相似性的变化。道琼斯工业平均指数(DJIA),即美国股市的一个指数,其收盘价数据可以免费下载。这里,我们将考虑模拟的 2019 年 6 月至 2020 年 5 月期间的每日收盘价数据,该时期正值 COVID 自由落体阶段。图 5-29 展示了该时间段内收盘价的图表。

图 5-29:2019 年 6 月到 2020 年 5 月期间模拟的道琼斯工业平均指数(DJIA)收盘价图。请注意,自 2020 年 2 月下旬开始的大幅下跌,正值 COVID 成为全球问题之时。
如果我们预测未来的市场行为,我们将希望结合时间序列数据分析中的工具进行分形分析,而这些内容超出了本书的范围。然而,我们可以通过将数据解析为按月划分的系列并计算每个月系列的分形维度,轻松感知自相似性的变化。从那里,我们可以检查分形维度与其他波动性度量(如一个月内收盘价的波动范围)之间的相关性;我们应该能看到正相关。清单 5-8 加载数据,解析数据,计算分形维度,计算收盘价范围,并运行分形维度与范围之间的相关性测试。
#load and parse stock market data
stocks<-read.csv("Example_Stock_Data.csv")
June2019<-stocks[stocks$Month=="June",]
July2019<-stocks[stocks$Month=="July",]
August2019<-stocks[stocks$Month=="August",]
September2019<-stocks[stocks$Month=="September",]
October2019<-stocks[stocks$Month=="October",]
November2019<-stocks[stocks$Month=="November",]
December2019<-stocks[stocks$Month=="December",]
January2020<-stocks[stocks$Month=="January",]
February2020<-stocks[stocks$Month=="February",]
March2020<-stocks[stocks$Month=="March",]
April2020<-stocks[stocks$Month=="April",]
May2020<-stocks[stocks$Month=="May",]
#calculate fractal dimension for each series
library(fractaldim)
junedim<-fd.estimate(June2019[,2],methods="hallwood")$fd
julydim<-fd.estimate(July2019[,2],methods="hallwood")$fd
augustdim<-fd.estimate(August2019[,2],methods="hallwood")$fd
septemberdim<-fd.estimate(September2019[,2],methods="hallwood")$fd
octoberdim<-fd.estimate(October2019[,2],methods="hallwood")$fd
novemberdim<-fd.estimate(November2019[,2],methods="hallwood")$fd
decemberdim<-fd.estimate(December2019[,2],methods="hallwood")$fd
januarydim<-fd.estimate(January2020[,2],methods="hallwood")$fd
februarydim<-fd.estimate(February2020[,2],methods="hallwood")$fd
marchdim<-fd.estimate(March2020[,2],methods="hallwood")$fd
aprildim<-fd.estimate(April2020[,2],methods="hallwood")$fd
maydim<-fd.estimate(May2020[,2],methods="hallwood")$fd
#combine fractal dimension results into a vector
monthlyfd<-c(junedim,julydim,augustdim,septemberdim,octoberdim,novemberdim,
decemberdim,januarydim,februarydim,marchdim,aprildim,maydim)
#examine monthly stock price range
monthlymax<-c(max(June2019[,2]),max(July2019[,2]),max(August2019[,2]),
max(September2019[,2]),max(October2019[,2]),max(November2019[,2]),
max(December2019[,2]),max(January2020[,2]),max(February2020[,2]),
max(March2020[,2]),max(April2020[,2]),max(May2020[,2]))
monthlymin<-c(min(June2019[,2]),min(July2019[,2]),min(August2019[,2]),
min(September2019[,2]),min(October2019[,2]),min(November2019[,2]),
min(December2019[,2]),min(January2020[,2]),min(February2020[,2]),
min(March2020[,2]),min(April2020[,2]),min(May2020[,2]))
monthlyrange<-monthlymax-monthlymin
#examine relationship between monthly fractal dimension and monthly range
cor.test(monthlyfd,monthlyrange,"greater")
清单 5-8:一个脚本,加载模拟的 DJIA 收盘数据,计算分形维度和收盘价范围,并进行相关性测试,以确定分形维度与收盘价范围之间的关系。
你应该找到一个约为 0.55 的相关性,或者说是收盘价分形维度与收盘价区间之间的中等关系,这个相关性大约在 0.05 的显著性水平上。自相似性似乎与市场波动性的一个衡量指标有正相关关系。分形维度随着月份变化,有些月份的维度接近 1,而其他月份的维度则较高。令人印象深刻的是,2020 年 3 月的分形维度飙升至 2。
鉴于我们仅有 12 个月的数据用于测试,值得注意的是,我们仍然发现分形维度与收盘价区间之间存在正相关关系。对股市数据感兴趣的读者可以自行优化计算分形维度序列时所选的时间框架窗口和潜在的窗口重叠,并进一步探讨与股市变动点检测中使用的其他几何工具(如 Forman–Ricci 曲率和持久同源性)的相关性。
概要
在本章中,我们研究了度量几何及其在几个重要机器学习算法中的应用,包括k-NN 算法和几个流形学习算法。我们见证了距离度量(以及其他算法参数)的选择如何显著影响性能。我们还考察了分形及其与股市波动性的关系。计算点和分布之间的距离在许多机器学习领域中都有应用,并且影响着机器学习结果的质量。第五章仅仅触及了度量几何现有工具的表面。你可能想参考本章使用的 R 包中的相关文献,以及当前在距离度量领域的机器学习出版物。
第八章:几何在机器学习中的新应用

在第五章中,我们探讨了度量几何对机器学习的贡献及其在模型测量和输入中的众多应用。然而,几何学还为机器学习提供了许多其他贡献;在本章中,我们将探讨基于切空间的模型估计方法、外部微积分、与曲线交点相关的工具(可以用来替代算法中的线性代数),以及涉及向量场作用于数据集切空间的基于秩的模型。我们将看到这些工具如何在小数据集的监督学习中发挥作用,帮助社区规划灾难应对,并辨别客户的选择偏好。
处理非线性空间
我们的第一个工具帮助数学家和机器学习工程师处理诸如流形之类的非线性空间;它是定义一个点的切空间。回想一下微积分课程,我们记得切线是与曲线上的一点接触而不穿越曲线的线——在该点上,曲线的斜率等于切线的斜率(即曲线的导数)。考虑图 6-1 中的正弦波示例和该波上的一个点,以及它的切线。

图 6-1:一个正弦波示例,在局部最大值之一处画出的切线
这种切线在二维空间中效果很好。然而,尝试定义一个曲面上某点的切线会变得更加复杂,因为许多(无穷多个)切线都可以与给定点相切(见图 6-2,A 点)。

图 6-2:一个椭圆,包含多个通过 A 点的可能切线
事实上,图 6-2 中的线条构成了一个与 A 点相切的二维平面,类似于一张在 A 点与椭圆相切的纸片。你可以将这个切平面粘贴到 A 点,如图 6-3 所示。

图 6-3:一个椭圆,包含 A 点和与 A 点相关的切平面,切平面延伸出切线和切空间
对于高维对象,切空间可能涉及更多的维度(可以是三维、100 维,甚至是无限维的盒子)。这些切空间与线性代数有着紧密的联系。请记住,向量空间可以通过一组独立的向量组成一个矩阵来定义,这组向量被称为该空间的基,在技术上称为哈梅尔基。实际上,某个点上对象的切空间的基是该点的偏导数集合。如前所述,在一维空间中,这恰好是切线的斜率。这为流形上每个点提供了一个优美的欧几里得空间,可用于推导点与点之间的单位距离,提供从流形到欧几里得空间的映射,并理解多重共线性。多重共线性发生在变量之间高度相关时,这会导致矩阵的列或行完全相同或几乎相同(从而导致奇异矩阵)。多重共线性是回归算法中的一个问题,因为它会导致冗余的预测变量和奇异矩阵。具有完美方差重叠(高度共线的预测变量)的变量将具有相同的切空间,或者至少共享一些重叠的切空间。
引入 dgLARS
基于切空间的一个有用的机器学习算法是dgLARS算法(dgLARS 代表“微分几何最小角回归”)。dgLARS 将传统的最小角回归(LARS)扩展为一个适应给定模型误差切空间的算法。LARS 算法通常从回归模型中每个系数设为 0 开始,根据与结果最相关的预测变量逐步添加预测变量;通过最小二乘法计算调整系数,直到一个更高相关性的变量进入模型。当多个预测变量进入模型时,系数将沿联合最小二乘方向增大。
dgLARS 考虑了模型的切空间,调整用于优化系数的评分函数。每次模型更新都使用一个工具的平方根,该工具被称为条件 Fisher 信息。条件 Fisher 信息大致衡量给定变量相对于目标(如结果变量)所包含的信息量。对于技术背景的读者来说,参数的 Fisher 信息是该参数评分的方差,评分是该参数对似然函数的自然对数的偏导数。
让我们通过一个实例来具体化这个问题。假设我们正在创建一个模型,以了解影响青少年冒险行为的因素,如吸毒或小偷小摸。我们可能已经测量了许多已知因素(如家庭社会经济状况、中学成绩以及之前的学校或法律事件)。然而,我们希望将我们设计的衡量青少年风险倾向的调查(索引 1)与一个衡量成人风险行为的已知调查(索引 2)进行比较。这两份调查可能会捕获不同类型的信息,并且在与我们的风险结果相关的信息量方面有所不同(图 6-4)。

图 6-4:加载到风险指数上的问题数量比较
在图 6-5 示例中,调查问卷 1 的索引包含了更多的信息量。然而,调查问卷 2 的索引中可能存在一些变量的重叠或无关信息,如果能有一个能够捕获此类信息的测量方法那就更好了。也许每个调查中的问题之间存在信息重叠,或者包含了一些无关的信息。让我们考虑每个风险倾向调查中包含的独特且相关的信息(图 6-5)。

图 6-5:在索引问题中捕获的相关信息的两种调整测量方法
从图 6-5 可以看出,索引 1 和索引 2 包含了一些无关信息和一些重叠信息。索引 1 确实似乎包含比索引 2 更多的信息,如果我们必须选择一个调查问卷来对更多处于风险中的青少年进行调查,我们最好从索引 1 开始。
这有点像 Fisher 信息和 dgLARS 中的变量选择。技术上,得分是通过模型的对数似然函数的偏导数计算出来的,这个得分的方差就是 Fisher 信息,可以将其输入到矩阵中以捕获模型的偏导数中的信息。有趣的是,这个矩阵也可以通过相对熵(Kullback-Leibler 散度)的 Hessian 导出,而 Fisher 信息在这种情况下给出了相对熵的曲率。从一个较低技术层面的角度来看,用于选择变量的 Fisher 信息既与统计度量(对数似然函数)有关,又与所考虑的自变量的信息几何结构有关。
对于广义线性模型,可以使用费舍尔信息矩阵推导出一个称为 条件 Rao 分数 的得分,用于检验给定变量的系数是否与 0 在统计学上存在显著差异。如果该得分在统计学上与 0 没有显著差异,则该变量将从模型中剔除。在 dgLARS 算法中,这些计算通过在模型误差的切空间中搜索系数向量来完成,从空模型开始。然后,迭代地将该空间的几何形状划分为三个集合:选择的预测变量,它们在误差切空间中具有良好的拟合分数;冗余预测变量,它们与选择的预测变量共享误差切空间;以及未选择的预测变量,它们在误差切空间中的拟合分数较差。因此,dgLARS 利用模型几何形状的信息来找到最适合的模型。
dgLARS 在涉及数据集中预测变量多于观测值的问题上取得了成功,许多关于该算法的出版物专注于基因组学应用,其中患者数量可能为 300 人,基因序列数量可能达到 1,000,000 个。R 提供了一个名为 dglars 的包,用于实现广义线性模型算法,包括逻辑回归、泊松回归、线性回归和伽马回归的连接函数。对于不熟悉广义线性回归的人来说,连接函数 本质上是一种特殊类型的依赖变量变换,它使得回归在计数变量、二元变量和其他类型非正态分布的依赖变量(具有一定的几何分布限制)上可以正常工作。
现在我们已经介绍了一些理论,接下来我们将其付诸实践。
使用 dgLARS 预测抑郁症
我们希望根据学校问题和智商预测自报的抑郁症。我们将使用的数据是来自 Quora 平台的自选样本中的自报学校问题数据(智商高于 155),包括七个主要的学校问题(欺凌、教师敌意、无聊、抑郁、缺乏动力、外部学习、被安排进入补救课程)。该数据由 22 位个体提供,他们在智商极高范围内提供了分数,并讨论了至少一个学校系统中的问题,且倾向于来自美国的用户。该数据集是从平台上收集并手动处理的,以获得符合智商标准的海报所报告的学校问题类别。你可以在本书的文件中找到该数据集。首先让我们用 清单 6-1 中的代码加载数据。
#load data
mydata<-read.csv("QuoraSample.csv")
set.seed(1)
清单 6-1:加载 Quora 数据集的脚本
列表 6-1 中的代码加载了一个数据集,研究了教育干预和自尊心的心理学度量。现在,让我们修改脚本,使用 dgLARS 算法在该数据集上运行。R 包提供了交叉验证或不使用交叉验证运行算法的选项。让我们修改列表 6-1 来运行这两种模型选项:
#run analysis
library(dglars)
dg<-dglars(factor(Depression)~.,data=mydata,family="binomial")
dg1<-cvdglars(factor(Depression)~.,data=mydata,
family="binomial",control=list(nfold=2))
这段代码在完整的学生数据集上运行交叉验证和非交叉验证的 dgLARS 算法。交叉验证版本在具有稀疏预测变量的小数据集上效果不好,因此如果遇到错误,请继续尝试运行交叉验证版本,因为某些分区可能会出现与拆分和拟合模型相关的错误。两个 dgLARS 算法的输出应该在许多预测变量上达成一致,尽管交叉验证拆分版本的算法可能会有所不同,因为数据是随机分区的。接下来,让我们添加脚本来查看第一个模型的总结:
#examine results of non-cross-validated model
**>summary(dg)**
Summary of the Selected Model
Formula: factor(Depression) ~ 1
Family: 'binomial'
Link: 'logit'
Coefficients:
Estimate
Int. -1.5041
---
g: 1.265
Null deviance: 20.86
Residual deviance: 20.86
AIC: 22.86
Algorithm 'pc' (method='dgLASSO')
在这个模型中,没有任何因素被选为重要的预测变量。没有因素被选择的主要原因有几个,包括存在具有相反效应的亚群体,这些效应会“平均”掉亚群体的角度,存在扭曲几何形状的异常值,或者预测变量的真实零效应。模型拟合合理,Akaike 信息准则(AIC)为 20.86,残差偏差比没有加入任何项的零偏差要小得多。离散度参数告诉我们数据很好地拟合了二项分布(见g接近 1),没有出现现实数据中有时会遇到的分布问题。
现在让我们在脚本中添加代码,查看交叉验证试验的结果:
#examine cross-validated model
**>summary(dg1)**
Call: cvdglars(formula=factor(Depression) ~ ., family="binomial",
data=mydata, control=list(nfold=2))
Coefficients:
Estimate
Int. -1.6768
Bullying 0.3066
Put.in.Remedial.Course 0.2292
dispersion parameter for binomial family taken to be 1
Details:
number of non-zero estimates: 3
cross-validation deviance: 12.33
g: 0.9838
n. fold: 2
Algorithm 'pc' (method='dgLASSO')
交叉验证模型的结果应该会与非交叉验证模型略有不同,表明模型在不同的折叠中找到了一些一致性,但并不完全重叠。在交叉验证模型中,被安排在补救课程中的天才儿童往往有更高的抑郁率,而像本样本中那些被安排进入补救课程并开始出现抑郁迹象的儿童可能从这种干预中受益。正如你所看到的,欺凌也是导致抑郁的潜在问题,这暗示了我们可能已经知道的事情:一般来说,学校里应该不容忍欺凌,以促进最佳的心理健康结果。
鉴于样本量较小,广义线性回归模型可能难以估计系数。基于拓扑和几何的线性模型所需的样本量似乎比线性回归模型要小,而在这个问题上得到的一致结果表明,这些模型可以在非常非常小的数据集上工作。然而,交叉验证可能仍然需要最小的样本量,因此如果样本量少于 10,最好避免进行这些分析。
使用 dgLARS 预测信用违约
为了理解 dgLARS 在具有二元结果(逻辑回归)和更多观察值及变量的大型数据集上的表现,让我们考虑另一个数据集。UCI 信用违约数据集包括 30,000 个台湾信用案例(2005 年底),并有 23 个违约预测因子,包括人口统计学特征(年龄、婚姻状况、教育状况和性别)、信用额度以及前期使用和支付信息。我们分析的目标是弄清楚哪些预测因子与账户是否会违约相关,并评估我们的 dgLARS 模型的拟合度。
让我们通过列表 6-2 中的代码开始。
#load data
mydata<-read.csv("UCIDefaultData.csv")
#load library
library(dglars)
#run analysis, scaling the predictors such that big numbers don't
#result in large differences in coefficient values
#scale the predictor data
mydata1<-scale(mydata[,-c(1,25)])
mydata1<-cbind(mydata1,mydata$default.payment.next.month)
colnames(mydata1)[24]<-"default.payment.next.month"
#run the dglars function with and without cross-validation
dg<-dglars(factor(default.payment.next.month)~.,
data=as.data.frame(mydata1),family="binomial")
dg1<-cvdglars(factor(default.payment.next.month)~.,
data=as.data.frame(mydata1),family="binomial")
summary(dg)
summary(dg1)
列表 6-2:一个加载、处理和分析 UCI 信用违约数据集的脚本,使用 dgLARS 和交叉验证的 dgLARS 算法
这应该会生成两个包含大多数预测因子系数的模型。第一个模型是非交叉验证版本(DG),第二个模型是交叉验证版本(DG1)。表 6-1 展示了我们运行代码后的结果。
表 6-1:UCI 信用违约 dgLARS 模型中的各项系数
| Column1 | DG 估计 | DG1 估计 |
|---|---|---|
| Int. | –1.47 | –1.45 |
| LIMIT_BAL | –0.10 | –0.09 |
| SEX | –0.05 | –0.04 |
| EDUCATION | –0.08 | –0.07 |
| MARRIAGE | –0.08 | –0.07 |
| AGE | 0.07 | 0.06 |
| PAY_0 | 0.65 | 0.65 |
| PAY_2 | 0.10 | 0.09 |
| PAY_3 | 0.09 | 0.09 |
| PAY_4 | 0.03 | 0.03 |
| PAY_5 | 0.04 | 0.04 |
| PAY_6 | 0.01 | 0.01 |
| BILL_AMT1 | –0.39 | –0.15 |
| BILL_AMT2 | 0.16 | 0.02 |
| BILL_AMT3 | 0.09 | 0.02 |
| BILL_AMT5 | 0.03 | 0.00 |
| BILL_AMT6 | 0.02 | 0.00 |
| PAY_AMT1 | –0.22 | –0.17 |
| PAY_AMT2 | –0.22 | –0.19 |
| PAY_AMT3 | –0.05 | –0.05 |
| PAY_AMT4 | –0.06 | –0.06 |
| PAY_AMT5 | –0.05 | –0.05 |
| PAY_AMT6 | –0.04 | –0.03 |
一些最大的违约预测因素包括前一个月的账单和支付历史。使用较少(BILL_AMT1)、较低支付(PAY_AMT1)和按时支付(PAY_0)的人更不容易在下个月违约。这非常有道理,因为大多数贷款指标优先考虑向那些债务负担较轻且有按时支付记录的人提供最佳利率的贷款。
交叉验证的 dgLARS 模型对前一个月的使用和支付总额的惩罚较小,表明前一个月的按时支付比具体的数值更为重要。第一个模型的 AIC 值相当大(27,924),但比零模型的 AIC 值(31,705)小得多,表明即使包含了多个预测变量,第一个模型的拟合度也优于零模型。
现在让我们将此模型与逻辑回归进行比较,并比较 AIC 拟合统计量,将以下内容添加到我们的脚本中:
#run logistic regression
gl<-glm(factor(default.payment.next.month)~.,
data=as.data.frame(mydata1),family="binomial"(link="logit"))
#calculate AIC of the model
AIC(gl)
这段代码在数据集上运行逻辑回归并计算模型的 AIC。在这个例子中,AIC 应该大约为 27,925,几乎与 dgLARS 模型的 AIC 完全相同。这表明逻辑回归和 dgLARS 算法在收敛性上的一致性;在如此大的样本量下,这一结果是可以预期的。逻辑回归是处理大样本量的典型工具,而在这种情况下,使用 dgLARS 似乎没有带来额外的收益。然而,考虑到在大样本量下的收敛性,dgLARS 很可能在较小的样本量下能够提供质量较高的结果,而逻辑回归在这种情况下无法工作。
应用离散外微分
另一个来自微分几何的有用工具是离散外微分。离散外微分涉及从低维离散形状构建离散形状。在前几章中,我们研究了同调的概念,它用于计算给定对象中的孔洞;从技术上讲,这是通过找到对象在特定维度下的边界来实现的。例如,考虑三角形的边界(见图 6-6)。

图 6-6:三角形的边界
我们可以更进一步,将线段分解为线段连接的每一个点,如图 6-7 所示。

图 6-7:线段的边界
就像我们可以通过识别并分离出边界来拆解形状一样,我们也可以通过组合边界来从低维边界构建形状。从技术上讲,这被称为上同调,是离散外微积分的领域。我们可能从两个在某种方式上相关的点(例如在一定距离内,或共享某个特征)开始,并用一条线将它们连接起来(见图 6-8)。

图 6-8:构建成一条线的两个点
对于更具技术背景的读者,我们正在查看微分形式的离散版本,这些形式是单纯形复形上的同调链。这些微分形式有与之相关的向量场。我们可以定义运算符,改变这些场或对象,结合它们,或计算某个场或同调链内存在的内容。这使我们能够处理某些类型的数据,理解诸如电网资源容量、社会网络中的疾病负担(甚至是在计算机屏幕内的像素组间渲染图形)等问题。
这个过程可以扩展到任意多的维度,线段构成三角形,三角形构成四面体,以此类推。我们也可以通过离散外微分跳跃维度,从点跳跃到三角形或四面体,而不是通过线段。因此,离散数据,如渲染像素数据或工程数据,可以被分组并连接起来以供进一步研究。
离散外微分(和同调)的最新应用之一是社交网络分析。如我们在前几章提到的,图是零维和一维的离散对象(点和线);然而,个体之间的连接可以从双向相互作用(连接点的线)扩展到三方(三角形)或四方(四面体)或 100 方的相互作用(非常大维度的对象),正如图 6-9 中三位同事相互连接所示。

图 6-9:通过三方互动表示的三位同事共同工作项目的图形
在图 6-9 的左侧,我们看到三位同事(Colleen、Jodelle 和 Yaé)成对协作,但并未共同参与过三人合作的项目。在图 6-9 的右侧,我们看到一个涉及三位同事共同合作的项目的表示。如果他们合作了许多论文,我们可以总结他们的双向合作和三方合作,从而得到每个n方合作的总和。这对于理解这个协作网络的各个部分的强度可能很有用。
让我们探索这些概念如何帮助灾难物流规划。假设在一个地区有四个城镇,每个城镇通过道路与至少一个其他城镇相连接。假设每个城镇都有自己的物资储备(可能是每个居民的水量),以防飓风袭击该地区并限制交通数天或数周。我们可以通过在 R 中使用清单 6-3 中的代码来建模这一情况。
#create matrix of town connections and miles between each town
towns<-matrix(c(0,0,0,4,0,0,12,2,0,12,0,6,4,2,6,0),nrow=4)
#create a graph from the matrix with connections between modes
#going in both directions (undirected graph) with weights
library(igraph)
g1<-graph_from_adjacency_matrix(towns,mode="undirected",weighted=T)
#plot town graph with edges labeled by weights
plot(g1,edge.label=E(g1)$weight,main="Plot of Connected Towns by Road Miles")
#add resource (perhaps liters of water per resident)
V(g1)$number<-c(10,500,80,200)
plot(g1,edge.label=E(g1)$weight,vertex.label=V(g1)$number,vertex.size=40,
main="Situation 1")
#find maximal cliques, representing connected resources
mc1<-max_cliques(g1)
mc1
#add resources that are mutually connected between towns
c1<-V(g1)$number[mc1[[1]][1]]+V(g1)$number[mc1[[1]][2]]
c2<-V(g1)$number[mc1[[2]][1]]+V(g1)$number[mc1[[2]][2]]+
V(g1)$number[mc1[[2]][3]]
#examine time needed to transport using shortest paths
dis1<-distances(g1,v=V(g1),mode=c("all"),weights=E(g1)$weight,
algorithm="dijkstra")
清单 6-3:一个脚本,生成连接城镇的示例图,绘制该图,向每个城镇添加资源,可视化这些资源,并分析相互连接的城镇资源。
清单 6-3 创建一个由道路连接的城镇矩阵,然后将其转换为加权图。一旦转换为图形,我们可以添加每个城镇中可用资源的信息,并绘制包含这些信息的图像,以及通过道路连接的城镇之间的距离。然后,我们可以计算城镇之间的相互资源以及从某一城镇到另一城镇的最短旅行距离。这将帮助我们评估灾难中可用的资源以及最佳的物资运输路线。
清单 6-3 的第一个图形应输出一个图,显示哪些城镇是连接的,以及城镇之间的英里数,如图 6-10 所示。

图 6-10:城镇连接性图和连接城镇之间的道路英里数
Figure 6-10 显示,城镇 2、3 和 4 通过多条道路连接,因此即使一条道路被封锁,仍可通过绕行其他城镇到达该城镇。然而,尽管城镇 1 距离最近的城镇只有 4 英里,但它相对孤立。连接城镇 2 和城镇 3 的道路相当长(也许这是一条穿过密林或绕过几个运河的背路)。
Listing 6-3 中的第二个plot应输出一个图表,显示每个城镇的总资源,如 Figure 6-11 所示。

Figure 6-11:城镇连接图,连接城镇之间的道路里程及各城镇内的资源
Figure 6-11 让我们更深入地理解了四个城镇之间的连接性及潜在共享资源。注意,城镇 1 为灾难储备的水量相对较少(每位居民 10 升)。然而,如果城镇 1 和城镇 4 之间的道路在灾难中保持畅通,就可以将城镇 4(每位居民 200 升)的水转移到城镇 1,使得城镇 1 有足够的水源。只要城镇 4 与城镇 2 之间直接连接的道路在灾难中保持畅通,水资源也可以在这两个城镇之间轻松转移(城镇 2 储备了每位居民 500 升水)。
最大团计算得出的是互相连接的城镇(具有互相的n路连接的城镇)。这给出了城镇 1 和城镇 4 之间(通过单一道路)以及城镇 2、3 和 4 之间相互连接的关系。通过这些信息,我们可以计算出每个城镇在道路保持畅通的情况下可支配的资源。城镇 1 和城镇 4 之间共有 210 居民升水资源;三方团(城镇 2、3 和 4)共有 780 居民升水资源。
使用最短路径算法,我们可以计算任意两城镇之间的最短路线,以了解如果某个城镇的物资短缺且道路没有受到灾难破坏,物资如何迅速在城镇间调配。Table 6-2 列出了在这种情形下需要行驶的各城镇之间的里程。
Table 6-2:城镇之间的最短距离
| 城镇 1 | 城镇 2 | 城镇 3 | 城镇 4 | |
|---|---|---|---|---|
| 城镇 1 | 0 | 6 | 10 | 4 |
| 城镇 2 | 6 | 0 | 8 | 2 |
| 城镇 3 | 10 | 8 | 0 | 6 |
| 城镇 4 | 4 | 2 | 6 | 0 |
在此情境下最远的路线(10 英里)是当城镇 1 缺水时,从城镇 3 到城镇 1 的物资运输。需要注意的是,绕过最长的道路(8 英里而非 12 英里)从城镇 2 到城镇 3 会更短。
我们可以通过在 Listing 6-3 中添加内容来检视灾难中一条或多条道路受损的情形,从而移除连接各城镇的道路,并重新审视相互供应和最短路径:
#remove the link between vertices 2 and 4, providing an efficient supply
#route
g2<-delete_edges(g1,edges="2|4")
V(g2)$number<-c(10,500,80,200)
plot(g2,edge.label=E(g2)$weight,vertex.label=V(g2)$number,vertex.size=40,
main="Situation 2")
#find maximal cliques
mc2<-max_cliques(g2)
mc2
#find resources between sites
c1<-V(g2)$number[mc2[[1]][1]]+V(g2)$number[mc2[[1]][2]]
c2<-V(g2)$number[mc2[[2]][1]]+V(g2)$number[mc2[[2]][2]]
c3<-V(g2)$number[mc2[[3]][1]]+V(g2)$number[mc2[[3]][2]]
#examine time needed to transport using shortest paths
dis2<-distances(g2,v=V(g2),mode=c("all"),weights=E(g2)$weight,
algorithm="dijkstra")
这个脚本移除了镇 2 和镇 4 之间的链接,并重新计算了度量,以帮助我们评估由于镇 2 和镇 4 之间道路的阻断,情境发生了哪些变化。这些修改应产生一个类似于图 6-12 的情境 2 图。

图 6-12:情境 1 的修改版图,其中一条道路在灾难中被摧毁
如图 6-12 所示,这种情境打破了情境 1 中的三角形,孤立了镇 2。如果镇 1 的水源短缺,水必须在镇 1 和镇 2 之间共享,并且预计从镇 2 向镇 1 输送水源可能会很困难。
如果我们查看这些团体,可以看到城镇之间的双向连接,且城镇间的相互供应比情境 1 中的三向连接更为分散。镇 2 和镇 3 之间有一个不错的相互供应,但其他镇可能会在所需水源的传输上产生延迟。此外,如在最短路径表中所示(表 6-3),需要行驶的里程也增加了。
表 6-3:城镇对之间的最短距离
| 镇 1 | 镇 2 | 镇 3 | 镇 4 | |
|---|---|---|---|---|
| 镇 1 | 0 | 22 | 10 | 4 |
| 镇 2 | 22 | 0 | 12 | 18 |
| 镇 3 | 10 | 12 | 0 | 6 |
| 镇 4 | 4 | 18 | 6 | 0 |
从水源最多的城镇(镇 2)调度水变得更加困难,预计的行驶时间大幅增加。如果情境 2 有可能发生,最好在灾难发生前重新分配水源,以避免传输延迟。
离散外微分算子有其他应用。图形渲染和工程问题是离散外微分算子(以及离散外微积分)特别感兴趣的领域。工程中的一些常见应用包括对离散对象的通量和流量计算,或对过程的计算机建模。在图形渲染中,图通常被更一般的网格所替代。
在某些情况下,使用上同调(及其工具:离散外微分算子)来研究对象或点云比使用持久同调要容易,因为最终结果会找到相同的边界和对象。然而,关于如何将离散外微分算子应用于数据的 R 包开发很少,因此代码必须像在清单 6-3 中一样手动解析。自动化和对象操作代码将有助于推动离散外微分算子在数据科学和其他领域的采用。
机器学习算法中的非线性代数
关于机器学习中几何学的另一个有趣且最近的发展是非线性代数在机器学习算法中的应用。许多机器学习算法在计算梯度、最小二乘估计量等时,严重依赖线性代数。然而,在那些不是平坦的或涉及直线的关系和空间中,线性代数仅能提供计算结果的近似。看一下图 6-13,它展示了一条直线(由线性代数工具假设,如回归中使用的工具)和一条曲线(可能会给线性代数工具带来估算问题)。

图 6-13:一条直线和一条曲线
非线性在使用线性工具估算曲线和非线性空间时,会引入误差到算法的计算和最终结果中。试想使用直尺来测量图 6-13 中的下部曲线。相对于上方的直线,很难准确地测量该曲线的长度。如果该曲线的长度是需要通过算法最小化或最大化的量,这种测量可能会导致非全局解,或足以扭曲该量,进而影响预测精度或模型拟合统计量,如平方和误差或贝叶斯信息准则。
一种被提议作为机器算法中线性代数计算替代的方法是使用数值代数几何学,这是一门处理曲线交点的非线性代数分支。例如,考虑一个二维椭圆与一条一维曲线的交点,如图 6-14 所示。

图 6-14:一条曲线与椭圆的交点图
可以使用不同类型的矩阵和矩阵运算来解决非线性系统,类似于线性代数解决线性系统的方式;矩阵中的数字仅仅被多项式方程所替代。这些交点曲线问题中的一些是非凸问题,这通常给机器学习算法及其背后的线性代数带来问题。
凸优化问题是那些优化函数创建一个区域,在该区域中通过该区域的直线会连续地位于该区域内(而不是穿越物体中的多个区域和非区域),如图 6-15 所示。

图 6-15:一个凸物体
然而,如果该区域包含孔或凹陷情况,那么情况就不再如此,区域被称为非凸,例如在图 6-16 中,区域内的孔将内部集拆分为区域内的集合和孔内的集合。

图 6-16:一个非凸物体
优化算法常常在非凸函数和优化函数中的区域中遇到困难,因为常用来解决这些问题的线性规划并不适合非凸优化问题,且逐步方法可能会陷入局部最优解,无法跳出洞或凹陷区域。不幸的是,许多现实世界的数据集及其所用的优化函数涉及非凸区域。数值代数几何为非凸优化问题提供了精确的解决方案,这些问题在现实数据处理中经常出现。一旦将多项式系统以矩阵形式建立,许多软件平台和程序就可以进行计算,包括 Bertini 和 Macauley 软件,它们都可以连接到 R 和 Python。这为非凸优化问题提供了有效的求解器。
最近在数值代数几何领域的几篇出版物和研讨会表明,非线性代数是解决其他类型问题(这些问题可能是凸的)的算法中的一种可行替代方案,它放宽了数学假设并提高了准确性。一篇近期的论文(Evans, 2018)发现,许多统计模型的多个可能解的局部几何重叠(包括 Lasso、时间序列数据的 ARIMA 模型以及贝叶斯网络)。这意味着算法在模型空间中难以有效区分潜在的预测变量集或参数值,特别是在常用且建议的样本量下。可以通过在切空间中拟合模型(如前一节所示)或使用数值代数几何而非线性代数进行优化来解决此问题。这表明数值代数几何和其他非线性方法可以立即应用于机器学习算法,以提高算法性能和模型拟合效果。
不幸的是,目前在 R 中没有实现这些算法的包,因此我们在示例中不再深入探讨。
将选择排名与 HodgeRank 进行比较
在一群客户中辨别选择偏好是一个常见的机器学习任务。例如,一家公司可能希望客户比较软件新特性列表中的项目,以便优先安排工程团队在接下来一年的时间。比较选择排名还帮助公司将新产品和服务推销给现有用户,并为可能在现有客户中热销的商品设计新的营销活动。
让我们看一个简单的例子,来排名在海滩上的活动偏好。或许我们正在查看一家酒店从最近的客人那里收集的数据,关于他们在入住期间更喜欢哪些活动;这将使酒店能够优先安排海滩使用和员工招聘,以满足客人未来对主要活动的需求。在这里,我们有三项活动选择(躺在海滩上、游泳或冲浪),其中有一个明显的最爱(冲浪)。图 6-17 总结了这个简单的情况。

图 6-17:一个相对其他选项排名三项选择的图
我们可以通过添加一个可能的新第四项活动来使问题更加复杂,这项活动比其他三项活动更受欢迎:风筝冲浪。排名仍然相对容易计算,因为所有活动都比躺在海滩上更受欢迎,其中一项活动仅比躺在海滩上更受欢迎(游泳),一项活动比除风筝冲浪外的所有活动更受欢迎(冲浪),而一项活动比其他三项活动更受欢迎(风筝冲浪),如图 6-18 所示。

图 6-18:一个添加了另一项活动到偏好数据的图
所有信息都在图中给出,这个特定的人填写了所有选项的相对关系。在现实世界的数据中,这种情况很少见,如图 6-19 所示。

图 6-19:四项活动的不完整偏好图
然而,这些信息仍然显示出对风筝冲浪的强烈偏好,所有的配对排名都指向风筝冲浪,并且所有的配对排名都表明风筝冲浪是最受欢迎的活动。在现实数据中,缺失信息很常见,数据中也常常存在偏好循环,例如在图 6-20 中,冲浪比游泳更受欢迎,而风筝冲浪比冲浪更受欢迎,但却不比游泳更受欢迎。

图 6-20:一个不完整且不一致的排名偏好数据示例
这给出了风筝冲浪和游泳相对排名时可能出现的局部不一致性。然而,冲浪和风筝冲浪比另外两项活动更受欢迎,表明它们在可能的选项中排名较高,并且风筝冲浪比冲浪更受欢迎(提供了一种打破平局的方式)。
当没有全局一致的偏好时,情况变得有些模糊,每项活动都比另一项活动更受欢迎,如图 6-21 所示。

图 6-21:一个不完整的偏好数据图,缺乏一致的偏好
在图 6-21 的例子中,无法确定哪项活动比其他活动更受偏好,分析结果也将得出不确定的结论。当客户被要求对金融应用程序中的功能进行排名,或客人被要求对偏好的活动进行排名时,这种情况很常见。大多数客户会分成若干子群体,每个子群体都有自己独特的需求,这些需求可能与另一个重要子群体的需求相反。如何优先考虑功能开发,或者如何提供选择以取悦最多的客户,是一项挑战。
存在许多算法用于进行成对排名比较,以获得相对彼此的偏好排名列表(如 SVMRank、PageRank 等);然而,通常它们并不提供关于排名中的局部和全局不一致性的信息,这些不一致性可能影响一个项目或选择相对于其他项目的排序位置。代数几何最近为成对排名算法集合中增加了一种工具,可以分解排名结果,包含关于项目的局部和全局不一致性的信息;这就是HodgeRank,它通过利用工程问题中常见的基于代数几何的定理——Hodge-Helmholtz 分解来推导这些信息。
Hodge–Helmholtz 分解将一个向量流(或图上的流)分解为三个不同的组成部分,如图 6-22 所示:梯度流,其在局部和全局上都是一致的;旋度流,其在局部上是一致的,但在全局上是不一致的;以及谐波流,其在局部上是不一致的,但在全局上是一致的。

图 6-22:展示 Hodge–Helmholtz 分解分解后的流图
在海滩的示例中,图 6-20 展示了一个旋度流,涉及游泳、冲浪和风筝冲浪(如果没有其他活动被排名在那里,它也可以是谐波流)。图 6-21 是一个全局谐波流(以及局部旋度流)的示例。
HodgeRank算法本质上是为成对排名问题扩展了 PageRank;其数学模型归结为一个图数据上的最小二乘问题,从而能够评估全局排名和局部排名的一致性。因此,可疑的排名可以被标记出来,供人工分析师进行审查。该算法还允许在原始成对排名集中存在大量缺失数据,使其在现实世界中经常不完整的排名数据问题中具有广泛的应用性(用户不可能点击三百万个视频选项来对每个视频进行相互排名!)。尽管在 R 中没有现成的软件包,因此我们不会详细讲解一个例子,但在 Matlab 中已有相关的实现,熟悉 Matlab 的读者如果对该算法感兴趣,建议使用列出的 HodgeRank 资源。
总结
在本章中,我们学习了来源于微分几何和代数几何的较新算法,并探索了 dgLARS 和离散外微分法在数据分析问题中的应用,包括 Quora 天才样本、信用借贷样本以及灾难规划场景。许多新的算法正在不断开发,我们概述了近年来非线性代数和 Hodge 理论如何为机器学习做出贡献,并影响了许多行业中的重要问题(例如偏好排序和参数模型估计)。
在下一章,我们将回到持久同调,并探讨另一种代数拓扑工具——Mapper 算法。这两者将在本章介绍的学生样本上应用。
第九章:拓扑数据分析工具

在本章中,我们将探讨直接基于拓扑的算法,并利用它们来理解在第六章中遇到的自我报告教育数据集。包括拓扑基础算法的机器学习分支被称为拓扑数据分析 (TDA)。你在第四章中已经见过一些 TDA,我们使用持久同调来探索网络差异。持久同调近年来在机器学习领域引起了广泛关注,并已被应用于心理测量数据验证、图像比较分析、卷积神经网络的池化步骤以及小样本数据的比较。在本章中,我们将重新审视持久同调,并研究 Mapper 算法(现在由 Ayasdi 公司商业化)。
寻找具有独特行为的显著群体
之前,我们使用持久同调来区分不同类型的图。回顾一下第四章,持久同调通过点云数据创建单纯复形,对这些单纯复形应用一系列阈值,并计算与每个阈值化单纯复形中存在的拓扑特征相关的一系列数字。为了比较对象,我们可以使用 Wasserstein 距离来衡量不同切片之间的拓扑特征差异。
持久同调今天在工业界有很多应用。子群挖掘是其中一个显著应用,我们通过它来寻找数据中具有独特行为的显著群体。特别是,我们经常寻找与零次同调群相关的连通分量,或者几何上相互连接的群体(例如层次聚类中的簇)。例如,在心理测量调查验证中,子群挖掘帮助我们在调查中找到不同的群体,比如在衡量抑郁症的调查中发现不同的抑郁亚型群体。
让我们通过一个实际示例来演示与自我报告教育数据相关的持久同调子群挖掘,这些数据来自一个社交网络网站。我们将模拟数据,并使用 R 中的 TDAstats 包和 R 中的hclust()函数进行单链接层次聚类来比较持久同调结果(参见示例 7-1)。我们将回到第六章中关于天才 Quora 用户自我报告他们学校经历的示例数据集(参见书中的文件获取该数据集)。在这个例子中,我们将样本拆分为 11 个个体的集合,以便我们能够通过统计方法比较持久同调结果,确保我们的测量在学生群体的样本间不会发生变化。这为我们的测量提供了一种验证,证明它在群体中的一致性。
#load data and set seed
mydata<-read.csv("QuoraSample.csv")
set.seed(1)
#sample data to split into two datasets; remove the IQ scores
s<-sample(1:22,11)
set1<-mydata[s,-1]
set2<-mydata[-s,-1]
示例 7-1:一个加载教育数据集并将其拆分为两个集合的脚本,这些集合将使用持久同调进行探索
现在我们已经有了数据集,可以应用持久同调来理解聚类。具体来说,我们关注的是零阶 Betti 数,这些数值对应于连接的群体,以及数据的其他拓扑特征——有关详细信息,请参考第四章。
首先,我们需要计算社交网络中每个学生之间的曼哈顿距离;我们将使用这些距离来定义过滤。曼哈顿距离通常是离散数据的常用距离度量。将以下代码添加到脚本中:
#calculate Manhattan distance between pairs of scores
mm1<-dist(set1,"manhattan",diag=T,upper=T)
接下来,我们希望将持久同调算法应用于基于距离的数据,以揭示持久特征。使用 TDAstats 包,我们可以添加代码来计算该数据集的零阶和一阶 Betti 数,使用相对较低的过滤设置作为近似的最大尺度(这将给我们更大的聚类)。最后,我们可以在持久性图和层次聚类图中绘制结果:
#create the Vietoris-Rips complex (turn data into a simplicial complex)
library(TDAstats)
d1<-calculate_homology(mm1,dim=1,format="cloud")
#plot persistence diagrams where circles=connected components, triangles=loops
plot_persist(d1)
#hierachical cluster
plot(hclust(mm1),main="Hierarchical Clustering Results, Distance Data")
calculate_homology()函数将距离数据集中的点云数据转换为单纯形复形;然后我们可以应用过滤来识别在过滤过程中出现和消失的拓扑特征。虽然还有其他方法可以从数据中创建单纯形复形,但该包中的 Rips 复形是最容易计算的方法之一。
使用之前的代码,我们绘制了两张图。调用plot_persist()应该输出类似于图 7-1 的结果。可以看到,图中似乎存在一个主要群体,可能还会在较低过滤级别处看到一个或两个子群体;然而,这个子群体是否是一个显著特征尚不可知,因为它接近对角线。

图 7-1:第一组教育经验数据的持久性图
使用层次聚类结果(图 7-2)时,很容易看到一个主要群体,然后在较小的距离阈值下出现多个分裂。

图 7-2:模拟数据的树状图
如果在高度为 5 的位置切割聚类,树状图结果表明存在两个主要子群体。让我们根据层次聚类中找到的两个主要聚类,将set1数据进行分割,首先检查较小的聚类,然后检查较大的聚类,方法是添加到清单 7-1 中:
#smaller cluster
mydata[c(1,9,10,17),]
这应该输出以下内容:
> **mydata[c(1,9,10,17),]**
IQ Bullying Teacher.Hostility Boredom Depression Lack.of.Motivation
1 187 0 1 0 0 1
9 182 1 1 0 0 1
10 161 0 0 1 0 1
17 170 1 0 0 0 0
Outside.Learning Put.in.Remedial.Course
1 0 0
9 0 1
10 0 0
17 0 0
在这个个体聚类中,没有报告抑郁症或外部学习情况。一些个体报告了欺凌、教师敌意、无聊、补救教学或缺乏动力的情况。我们可以将这个与树状图中发现的更大聚类进行对比:
#larger cluster
mydata[c(3,4,6,8,12,16,18),]
这应该输出如下内容:
> **mydata[c(3,4,6,8,12,16,18),]**
IQ Bullying Teacher.Hostility Boredom Depression Lack.of.Motivation
3 155 0 0 0 0 0
4 155 0 0 0 0 0
6 174 0 0 1 1 1
8 170 0 0 0 0 0
12 175 0 1 0 0 0
16 160 0 1 0 0 0
18 185 0 0 0 0 1
Outside.Learning Put.in.Remedial.Course
3 1 0
4 1 0
6 1 1
8 0 1
12 1 1
16 1 1
18 1 0
与第一个聚类相比,这些个体大多数报告了外部学习且没有欺凌现象。这似乎区分了在校学习经历与课外学习经历。课外学习和不面对欺凌问题可能与学生的学习成果和整体学校体验相关。
该分析中的一个有趣项目是个体 6,他似乎是图 7-2 树状图中的一个离群值。该个体没有处理欺凌或教师敌意问题,但在上学期间处理了其他所有问题。在分析中,离群值可能是重要且具有影响力的。像持久同调这样的基于拓扑的算法通常比其他算法和统计模型更能抵抗离群值:当我们使用 TDA 时,极端值或子群体对结果的影响不会像使用其他方法那样剧烈。例如,在我们的天才样本中,个体 6 可能比持久同调的结果更能影响 k-means 的结果。
子群体挖掘是持久同调的一个重要用途——既可以用于识别数据集中的群体,也可以用于识别可能影响传统聚类方法优化步骤的离群值。让我们继续探索另一个重要的用途:作为一个测量验证工具。
验证测量工具
存在许多方法可以比较树状图或持久性图;这仍然是一个活跃的研究领域。持久性图需要转换为度量空间,这使我们能够构建具有兼容距离度量的非参数检验,进而可以比较两个图并从零分布中模拟随机样本,最终我们可以用来比较检验距离。总的来说,这让我们能够验证测量工具。在我们的示例中,我们希望通过比较来自相同人群的样本(我们的 Quora 样本)来验证我们对学校问题的测量。如果持久同调的结果相同,那么我们的测量工具是一致的,这是心理测量学领域测量设计的一个关键特性。
对于持久性图,我们通常使用 Wasserstein 距离,因为它在比较分布和有限样本中的点集时表现良好。对于树状图,Hausdorff 和 Gromov–Hausdorff 距离是两个不错的选择,这两者都衡量形状上点之间最小距离中的最大距离。然而,Gromov–Hausdorff 距离更为复杂,并且包含更多的结构信息,这使得它在某些情况下不太理想。
为了将另一个持久性图的距离与当前图进行比较,我们可以使用我们自报教育数据集中的第二组个体,添加到清单 7-1:
#compute Manhattan distance for set 2
mm2<-dist(set2,"manhattan",diag=T,upper=T)
#create the Vietoris-Rips complex
d2<-calculate_homology(mm2,dim=1,format="cloud")
#plot persistence diagrams—circles=connected components, triangles=loops
plot_persist(d2)
请注意,我们已将分析的数据集更改为来自完整样本的第二组个体。这创建了一个比较集,应该属于同一人群;在这个示例中,分析中会出现更多潜在的子群体。图表应该看起来像图 7-3。

图 7-3:另一个持久性图,模拟数据,这次使用了不同的参数来模拟数据
在图 7-3 中,我们看到了几个与图 7-1 的样本相似的不同群体。我们还看到了对应于 Betti 数 1 的点;然而,考虑到它们离线很近,这些点很可能是噪声。一个点离对角线越远,它就越有可能是真实的特征。这些新的 Betti 数特征与我们之前的样本不同,但可能不是实际的特征。
使用 TDAstats 包计算图形之间的距离非常容易。将以下几行添加到您的脚本中:
#calculate distance between diagrams
w<-phom.dist(d1,d2,limit.num=0)
w
这计算了图 7-1 和图 7-3 中显示的零同源性组和第一同源性组的持久图形之间的距离,结果应该大约是 10.73(零同源性)和 0.44(第一同源性),尽管这些值可能根据您使用的 R 版本有所不同。现在可以计算从原始样本中随机抽取样本之间的距离。TDAstats 包提供了一种方便的方式来计算这个过程,无需我们自己编写整个检验函数。让我们将这些代码片段添加到我们的脚本中:
#compute permutation test and examine p-values from output
permutation_test(d1,d2,iterations=25)
该脚本现在将计算两个样本特征之间的置换检验,生成每个同源性层级的检验统计量和 p 值。如预期的那样,我们的零同源性差异在 95%的置信度下并不显著(p = 0.08)。考虑到我们在第一个样本中没有任何第一同源性特征,我们确实看到了样本之间的第一同源性差异显著;然而,统计量本身为 0,表明这是一个人为的发现。
虽然这个例子涉及一个便利样本,并没有实际进行调查,但它与通过持久同源性验证跨人口样本中实际使用的心理测量工具有关。我们还可以使用这种方法来比较不同人口之间的差异,探索一个测量工具在不同人口中的行为变化。也许一组学生已经加速(跳过了一年或更多年级),而另一组没有。我们可能会看到他们在学校中自我报告的经历有很大不同。在这种情况下,测量工具可能在加速组和非加速组之间显示出截然不同的行为。
使用 Mapper 算法进行子群体挖掘
在数据科学中,我们经常面临聚类问题,数据可能存在极端的变量尺度差异,包括稀疏或分散的数据,包含异常值,或有显著的群体重叠。这些情况可能会对常见的聚类算法造成问题,例如 k-means(特别是群体重叠问题)或 DBSCAN(稀疏或分散数据)。Mapper 算法通过基于分箱、聚类和将聚类拉回到图形或简单复形的多阶段过程来找到聚类,是另一个用于子群体挖掘的有效聚类工具。该算法将莫尔斯理论中的一些概念与持久同调中的过滤概念结合,为聚类算法提供了一个拓扑学基础。
逐步执行 Mapper 算法
Mapper 算法的基本步骤包括使用一个标量值函数(称为莫尔斯函数)来过滤点云;然后我们将数据分成重叠的箱子,在每个箱子内聚类数据,并根据聚类在不同箱子之间的重叠将这些聚类连接成图形或简单复形。为了可视化这一过程,让我们考虑一个定义了标量值函数的简单点云;我们将根据对点云应用该函数的结果对对象进行着色。请查看图 7-4 中的结果。

图 7-4:具有莫尔斯函数定义的多阴影对象,阴影按渐变变化
现在,这个形状可以被分成四个重叠的箱子。这使我们能够看到具有略微不同莫尔斯函数值的区域之间潜在的有趣关系,这在我们应用聚类算法时将变得非常重要,如图 7-5 所示。

图 7-5:通过阴影渐变分箱图 7-4 的结果
现在我们已经对函数进行了分箱处理(图 7-5),我们可以开始聚类。跨箱子的聚类可能比简单应用聚类算法要复杂一些。这个聚类是必要的,用来定义复形及聚类在箱子间的重叠。我们需要在每个箱子内进行聚类,并结合结果来理解跨箱子聚类的连通性,这样才会得到最终结果。Mapper 算法的一个优势是,结果可以轻松地可视化为图形或单纯形;我们示例的最终结果可能会像图 7-6 一样,其中两个不同的群体从一个连接它们的点开始演变。

图 7-6:通过分箱图 7-4 的结果定义的聚类
在实际应用中,通常会对原始数据应用一种距离度量——相关性、欧几里得距离、汉明距离等——作为处理点云数据并在聚类前创建更好的过滤函数的方法。距离度量数据集的聚类可以使用多种算法,尽管通常实践中使用单链接层次聚类。一般而言,坐标系统对 Mapper 的结果或其他 TDA 算法的结果影响不大。
Mapper 算法相对于其他聚类方法,以及拓扑数据分析(TDA)相对于其他方法的一些优势是显而易见的。数据在小扰动(噪声)下的不变性使得 Mapper 比 k-means 更具鲁棒性,后者对初始种子非常敏感,并且每次运行可能会得到完全不同的结果。(注意,Mapper 对参数变化敏感,但对于重复运行和增加噪声的数据相对较为鲁棒。)结果的压缩或可视化便于对高维数据的聚类结果进行直观展示。由于不依赖坐标系统,我们可以比较不同尺度上或不同平台上收集的数据。此外,Mapper 能够处理聚类重叠,这对 k-means 算法及其衍生算法来说是一个显著挑战。最后,Mapper 处理稀疏性和离群值的能力,使其相比 DBSCAN 具有优势。这使得它非常适合用于小型数据集、预测变量可能多于观察值的情况,或是可能包含大量噪声的杂乱数据。
使用 TDAmapper 在数据中寻找聚类结构
TDAmapper R 包提供了 Mapper 算法的实现,可以处理多种类型的处理过的数据。在这个例子中,我们将再次使用来自天才 Quora 用户样本的自我报告教育数据集,其中包括 22 名提供天才范围评分并讨论至少一个感兴趣问题的个体,报告了七个主要学校问题(欺凌、教师敌意、无聊、抑郁、缺乏动力、外部学习、被安排进入补救课程)。目标是了解该样本中各问题之间的关系(有点像在测量中创建子量表)。这是二进制数据,因此我们将使用逆汉明距离来获得距离矩阵。汉明距离通过逐位比较二进制字符串来测量差异,从而获得不相似度的度量。虽然也可以使用其他距离度量来处理二进制数据,但汉明距离在比较基于二进制变量评分的个体之间的整体差异时效果很好。
让我们加载数据并为在 Listing 7-2 中的分析做准备:
#load data and clean
mydata<-read.csv("QuoraSample.csv")
mydata<-mydata[,-1]
#load Mapper, igraph, and distance packages
library(TDAmapper)
library(igraph)
library(e1071)
#process data to turn it into a distance matrix
df<-data.frame()
for (j in 1:7){
for (i in 1:7){
df[i,j]<-1/(hamming.distance(mydata[,i],mydata[,j]))
}
}
df[df>1]<-1
Listing 7-2:加载并处理数据以获得距离矩阵的脚本
Listing 7-2 中的代码加载了我们的数据集和分析所需的包,然后处理数据以获得距离矩阵,供 Mapper 算法使用。对于二进制数据,可以使用其他距离度量,但 Hamming 距离对于比较基于二进制变量评分的个体之间的整体差异非常有效。
现在让我们应用 Mapper 算法。我们将设置 Mapper 处理距离矩阵,使用三个间隔并具有 70%的重叠,以及三个簇来进行聚类。在小数据集上,较高的重叠参数将鼓励跨簇之间的连接;实际上,30%到 70%之间的设置通常能得到较好的结果。此外,较小的间隔数和簇的数量大约对应于数据集中需要聚类的实例数的一半,这通常在实际中效果不错。通常,使用不同的参数设置是有益的,因为结果会根据初始参数的不同而变化;一些最近的论文建议,Mapper 算法在参数不变的情况下,对于结果的稳定性并不完全可靠。我们还将根据最小和最大 Hamming 距离设置过滤值。我们可以通过在 Listing 7-2 中添加这些代码行来实现:
#apply mapper
j<-mapper1D(as.matrix(df),num_intervals=3,percent_overlap=70, num_bins_when_clustering=3,
filter_values=c(0.025,0.05,0.075,0.1,0.125,0.15,0.2))
summary(j)
j$points_in_vertex
这段代码在之前设置的参数下运行 Mapper 算法。摘要提供了 Mapper 对象中关于结果的对象列表。顶点内点的摘要告诉我们这些变量如何分组为不同的簇。
探索 Mapper 对象可以为我们提供一些关于哪些问题聚集在一起的洞察。我们可以从 Mapper 对象中获得很多信息,但这次探索将仅限于了解数据集中哪些点最终出现在 Mapper 对象中的哪个簇(顶点)。让我们来看看我们在 Listing 7-2 中的最后一次修改的输出:
$points_in_vertex
$points_in_vertex [[1]]
[1] 1
$points_in_vertex [[2]]
[1] 2
$points_in_vertex [[3]]
[1] 3
$points_in_vertex [[4]]
[1] 4
$points_in_vertex [[5]]
[1] 5
$points_in_vertex [[6]]
[1] 3 4 5 6
$points_in_vertex [[7]]
[1] 4 5 6 7
从之前的结果中,我们可以看到哪些变量出现在了哪些簇中。我们发现变量 1 和 2(欺凌和教师敌意)倾向于孤立出现(点顶点 1 和 2),而其他问题则倾向于出现在簇中(其他顶点中的点)。考虑到这些是属于权威社会和同伴社会问题,而不是课程病因学问题,这有一定的合理性。教师如何互动以及学生如何表现通常与课程无关,而课堂上缺乏挑战性的问题则直接来源于课程。
在我们的脚本中添加以下内容,我们可以在 igraph 中绘制图形,以便更深入地了解簇的连接性:
#create graph from the mapper object's adjacency information
g1<-graph.adjacency(j$adjacency,mode="undirected")
plot(g1)
这段代码将 Mapper 的重叠簇结果转化为一个图形对象,可以绘制并分析簇之间是如何重叠的。
图 7-7 显示了教师敌意和同伴欺凌这两个社会性问题的隔离。基于课程的问题往往与缺乏动机和外部学习(项目 5 和 6)有所重叠,这些是这些群体之间的强连接。

图 7-7:在 Quora 样本分析中找到的聚类网络图
Mapper 的一个主要问题是它在重叠和滤波器 bin 划分上的不稳定性。例如,将 bin 重叠调整为 20% 会导致如 图 7-8 所示的未连接图。

图 7-8:定义不同参数的 bin 重叠后的 Quora 样本结果的网络图
一些最近的论文建议使用多尺度来稳定输出;然而,目前对这一概念的探索大多还停留在理论阶段。一般而言,使用不同的重叠比例可以帮助我们大致了解数据中的聚类结构。
总结
本章中,我们探讨了一些来自拓扑数据分析的工具。我们使用持久同调比较了教育群体样本的数据,并在自选的极度天才个体样本中探索了教育经验组。近年来,拓扑数据分析(TDA)发展迅速,许多问题可以通过 TDA 的一个或多个工具来解决。在下一章中,我们将探讨这个日益发展的领域中的另一种流行工具。
第十章:同伦算法

本章将探讨与同伦相关的算法,一种基于物体周围路径类型对拓扑物体进行分类的方法,包括基于同伦的回归参数计算。局部极小值和极大值经常困扰数据集:它们为局部探索解空间的算法提供了次优的停止点。在接下来的几页中,我们将看到同伦是如何解决这个问题的。
引入同伦
如果两条路径或函数可以在感兴趣的空间内连续变形为彼此,则它们是同伦的。想象一下一个高尔夫球场和一对高尔夫球手,其中一个比另一个更擅长推杆。球可以沿着许多不同的路径到达洞口。想象一下,用绳子标出每次击球的路径。一条路径可能相当直接,而另一条路径可能会曲折很远,特别是当果岭崎岖不平时。一个差劲的高尔夫球手可能需要打很多次,这样就会形成一条又长又曲折的路径。但无论果岭上有多少丘陵,或者球手的球需要多少次击打才能进洞,我们都可以通过变形绳子来缩短这些路径,正如在图 8-1 中所示。

图 8-1:高尔夫球场到洞口的长路径(左)变形为到洞口的短路径(右)
让我们稍微扩展一下这个类比,假设高尔夫球场上出现了一个天坑。具有孔洞的拓扑物体和空间可能会使变形过程变得复杂,并导致从一个点到另一个点的多条可能路径。路径可以连接物体上的两个点。根据物体的性质,这些路径有时可以“扭曲”到足以与另一条路径重叠,而不必将路径切割成片段来绕过障碍物(通常是孔洞)。绕过孔洞的曲折路径为路径的连续变形带来了问题。路径不可能绕着一个孔洞扭曲或弯曲,直到两点之间的路径必然与另一条路径重叠。随着孔洞和孔洞周围的路径的增加,开始出现不同类型的路径。一条路径可能仅绕一个孔做一次循环,然后连接两个点。另一条路径可能需要绕一个孔做几次循环,才能连接两个点。再想象一下打高尔夫。假设球场的果岭中央有一个障碍物(例如一块岩石或一个水障碍),形成一个环面(圆环形状),周围有复杂的丘陵,迫使一个糟糕的击球手绕过岩石才能回到洞口,正如你在图 8-2 中所看到的那样。

图 8-2:在环面(甜甜圈形状)球场上,两个起点和终点相同的路径,无法通过变形而不被切割或去除内部孔洞来变换成彼此
在这种情况下,我们不再能够将路径变形为彼此相同的形状,而不切断路径或移除孔洞。随着更多孔洞或更大维度的孔洞的添加,会出现更多等价路径的类别,这些等价路径在一个或多个孔洞周围有相同数量的回路。二维的赛道从起点到终点的可能路径少于三维赛道,因为赛道中的障碍物和孔洞的种类较少。一个包含多个维度的多个孔洞或障碍物的空间,会给路径带来更多可以绕过的障碍物。这意味着对于这个空间存在许多独特的路径。
考虑到数据集通常包含不同维度的孔洞,数据中可能存在许多不同类别的路径。常见于贝叶斯分析和机器人导航路径寻找任务中的随机游走,可能并不等价。这在导航问题中可以是一种优势,允许系统从一组不同的路径中选择,且这些路径有着与长度、资源分配和移动难易度相关的不同成本权重。例如,在图 8-3 中的路径寻找问题中,可能障碍物 2 有尖锐的边缘,如果系统太接近,可能会造成伤害,从而使得最左侧的路径成为系统的理想选择。

图 8-3:一个示例障碍赛道,包含从起点到终点的导航,且有多个可能的解决方案
图 8-3 展示了三条路径,其中没有一条可以变形为另一条路径,除非移动障碍物或切断路径。这些是在空间中的独特路径。通过计算独特路径的总数,我们可以从拓扑上对空间进行分类。
引入基于同伦的回归
如前所述,数据集常常包含局部最优解形式的障碍物,即局部最大值和最小值。梯度下降算法和其他逐步优化算法可能会陷入这些局部最优解。你可以把它看作是高维版的丘陵和山谷(鞍点,即更高维的拐点,也可能带来优化问题)。陷入局部最优解通常会给优化问题提供不理想的解。
基于同伦的算法可以帮助估计包含多个局部最优解的高维数据中的参数,在这些条件下,许多常见的算法如梯度下降可能会遇到困难。通过在一个局部最优解较少的空间中找到一个解,并将其持续变形到原始空间,可以提高模型中估计的准确性和所选变量的效果。
为了提供更多的见解,假设一个蒙眼的人试图穿越一个工业区(图 8-4)。没有任何连接,他们肯定会碰到障碍物,并可能误以为自己已经达到了目标,直到被其中一个更大的障碍物停住。

图 8-4:一个蒙眼的人在障碍课程中导航
然而,如果他们有一根绳子将起点和终点连接起来,他们就能更好地在这些点之间导航,并且知道他们遇到的任何障碍物可能都不是最终的终点。连接起点和终点的方式有很多种。图 8-5 展示了其中一种可能的绳子配置。

图 8-5:一个蒙眼的人在带有引导绳的障碍课程中导航
一个蒙眼的人努力避免物理障碍物,可以类比为一个机器学习算法避免局部最优解。例如,我们可以考虑一个具有全局最大值和最小值,但存在其他局部最优解的二元函数,如示例 8-1 中所推导的。
#load plot library and create the function
library(scatterplot3d)
x<-seq(-10,10,0.01)
y<-seq(-10,10,0.01)
z<-2*sin(y)-cos(x)
which(z==min(z))
which(z==max(z))
scatterplot3d(x,y,z,main="Scatterplot of 3-Dimensional Data")
示例 8-1:一个创建二元函数的脚本,该函数具有全局最小值和最大值,但有许多其他局部最优解
示例 8-1 中的代码生成了图 8-6 中的图表,从中我们可以看到许多极小值和极大值。其他的最优解是局部最优解,其中一些非常接近全局最小值或最大值。

图 8-6:三维数据的散点图,即一个具有多个局部最优解的函数
一个试图优化这个函数的算法很可能会陷入其中一个局部最优解,因为局部最优解附近的值会从该最优解的值上升或下降。一些已知在这种优化类型中表现不佳的算法包括梯度下降法和期望最大化(EM)算法等。像进化算法这样的优化策略也很可能需要很长时间才能找到全局解,这使得它们对于这种数据来说不太理想。
基于同伦的计算为这个局部最优解陷阱问题提供了有效的解决方案;使用基于同伦的计算的算法可以在局部最优解之间摆动,或者脱离局部最优解。实质上,这些算法从一个简单的优化问题开始,在这个问题中没有局部最优解,并根据数据集及其几何形状缓慢变形解,随着变形的进行,避免局部最优解。
目前在机器学习中常用的基于同伦的优化方法包括支持向量机、Lasso,甚至神经网络。R 的 lasso2 包是一个实现基于同伦模型的包;在这个案例中,lasso2 实现了一个基于同伦的 Lasso 算法模型。让我们首先探讨在示例 8-1 中生成的数据的模型拟合和解,其中结果有多个局部最优解,并且预测变量是共线性的,这对于许多机器学习算法来说是一个问题。将以下代码添加到示例 8-1 中的代码:
#partition into training and test samples
mydata<-as.data.frame(cbind(x,y,z))
set.seed(10)
s<-sample(1:2001,0.7*2001)
train<-mydata[s,]
test<-mydata[-s,]
现在,模型已经准备好构建和测试。我们关心的结果(我们的变量z)并不是正态分布的,但高斯分布是模型中最接近的可用分布。在以下脚本的补充部分 Listing 8-1 中,etastart 参数需要在开始模型迭代之前设置为 null,并且需要设置一个边界来引导基于同伦法的参数搜索。通常情况下,较低的设置效果最好:
#load package and create model
library(lasso2)
etastart<-NULL
las1<-gl1ce(z~.,train,family=gaussian(),bound=0.5,standardize=F)
lpred1<-predict(las1,test)
sum((lpred1-test$z)²)/601
这个脚本现在将基于同伦法的 Lasso 模型拟合到训练数据上,然后基于该模型预测测试数据的结果,允许我们评估模型拟合度。该样本的均方误差,计算在最后一行,应该接近 2.30\。(再说一遍,结果可能因 R 版本不同而有所变化,因为种子和采样算法发生了变化。)模型的结果表明,有一个项主导了函数的行为:
> **las1**
Call:
gl1ce(formula=z ~ .,data=train,family=gaussian(),standardize=F,
bound=0.5)
Coefficients:
(Intercept) x y
0.05068903 0.04355682 0.00000000
Family:
Family: gaussian
Link function: identity
The absolute L1 bound was : 0.5
The Lagrangian for the bound is : 1.305622e-13
这些结果可能会因不同 R 版本的读者而有所不同,显示出只有一个变量被选为模型的重要变量。根据我们的模型,x 对 z 的预测贡献大于 y 的贡献。考虑到 x 或 y 与 z 之间的非线性关系,线性回归并不是解决这个问题的好工具,但它确实发现了这种关系中的一些一致性。
为了与另一种方法进行比较,让我们创建一个线性回归模型,并将其添加到 Listing 8-1:
#create linear model
l<-lm(z~.,train)
summary(l)
lpred<-predict(l,test)
sum((lpred1-test$z)²)/601
这段代码在训练数据上训练一个线性模型,并预测测试集的结果,类似于之前的代码中如何拟合基于同伦法的模型。你可能会收到回归模型的警告,因为x和y存在共变行为(根据非共线性假设,这对线性回归模型是有问题的)。让我们来看一下这个模型的结果:
> **summary(l)**
Call:
lm(formula=z ~ .,data=train)
Residuals:
Min 1Q Median 3Q Max
-2.51261 -1.48663 0.07368 1.48680 2.37086
Coefficients: (1 not defined because of singularities)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.050689 0.041267 1.228 0.22
x 0.043557 0.007112 6.124 1.18e-09 ***
y NA NA
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.544 on 1398 degrees of freedom
Multiple R-squared: 0.02613, Adjusted R-squared: 0.02543
F-statistic: 37.51 on 1 and 1398 DF, p-value: 1.183e-09
该样本的均方误差(MSE)应该接近 2.30,与基于同伦法的模型相同。MSE 既考虑了方差,也考虑了估计器的偏差,提供了算法在回归任务中表现的平衡视角。然而,线性回归模型存在共线性问题。惩罚性模型可以避免这个问题,包括基于同伦法的 Lasso 模型。值得注意的是,线性回归和基于同伦法的 Lasso 模型找到的系数是相同的。通常,采用不同优化策略的模型在估计上会有些许不同。在这种情况下,样本量可能较大,预测变量较少,导致两种算法都收敛到全局最优解。
在样本数据集上比较结果
让我们回到自我报告的教育数据集,探索学校经历、IQ 和自我报告的抑郁症之间的关系。由于我们不知道这些预测变量与抑郁症之间的函数关系应该是什么,我们不确定是否存在局部最优解。然而,我们确实知道,包含 7 个预测变量和 16 个个体(占数据的 70%)的训练数据集会比较稀疏,并且局部最优解可能会是数据集中的一个问题。有证据表明,基于几何的线性回归模型在稀疏数据集上比其他算法表现得更好,因此我们的基于同伦的 Lasso 模型也可能会表现得更好。
我们来创建清单 8-2,并将数据划分为训练集和测试集。
#load data and set seed
mydata<-read.csv("QuoraSample.csv")
set.seed(1)
#sample data to split into two datasets with stratified sampling
#to ensure more balance in the training set with respect to depression
m1<-mydata[mydata$Depression==1,]
m2<-mydata[mydata$Depression==0,]
s1<-sample(1:4,3)
s2<-sample(1:18,6)
train<-rbind(m1[s1,],m2[s2,])
test<-rbind(m1[-s1,],m2[-s2,])
清单 8-2:加载并分析 Quora IQ 样本的脚本
现在,让我们运行基于同伦的 Lasso 模型和逻辑回归模型,并对这个小型真实世界数据集的结果进行比较:
#run the homotopy-based Lasso model
las1<-gl1ce(factor(Depression)~.,train,family=binomial(),bound=2,standardize=F)
lpred1<-round(predict(las1,test,type="response"))
length(which(lpred1==test$Depression))/length(test$Depression)
#run the logistic regression model
gl<-glm(factor(Depression)~.,train,family=binomial(link="logit"))
glpred<-round(predict(gl,test,type="response"))
length(which(glpred==test$Depression))/length(test$Depression)
从前面脚本中运行模型的结果来看,我们应该会发现基于同伦的 Lasso 模型的准确率(大约 85%)高于逻辑回归模型(大约 70%);此外,逻辑回归模型会输出一个关于拟合概率为 0 或 1 的警告信息。这意味着数据被明显分成了不同的组别,这种情况通常发生在小样本数据中,且数据与结果之间有较强的关系。根据你使用的 R 版本或图形用户界面(GUI),你可能会得到不同的样本,因此拟合统计和结果可能会略有不同。由于这个样本本身就相对较小,结果可能会与这里呈现的结果略有不同。某些样本中可能根本没有某些预测变量的实例。更大的样本会产生跨样本更稳定的模型。
让我们更仔细地查看基于同伦的 Lasso 模型及其系数:
> **las1**
Call:
gl1ce(formula=factor(Depression) ~ .,data=train,family=binomial(),
standardize=F,bound=2)
Coefficients:
(Intercept) IQ Bullying
-8.31322182 0.04551602 0.00000000
Teacher.Hostility Boredom Lack.of.Motivation
0.00000000 0.51213722 0.00000000
Outside.Learning Put.in.Remedial.Course
-1.01281345 0.42953330
Family:
Family: binomial
Link function: logit
The absolute L1 bound was : 2
The Lagrangian for the bound is : 0.4815216
从之前的输出结果中,我们可以看到,对于这个样本,较高的 IQ、无聊的认同以及被安排进入辅导班会增加自我报告的抑郁症的可能性。然而,外部学习具有强大的保护作用。事实上,外部学习能够完全抵消由于无聊和被安排进辅导班带来的风险。这表明,对于那些在学校遇到问题的天才儿童,家长可以通过提供外部学习机会,例如晚间大学课程、课外辅导或其他学习机会,来减轻一些潜在的不良后果,例如抑郁症。外部学习机会在天才儿童文献中已经在一定程度上得到了探讨,并得出了类似的结果,但这一话题仍需要进一步的研究。
现在,让我们将这些结果与逻辑回归模型的结果进行比较:
> **summary(gl)**
CALL:
glm(formula=factor(Depression) ~ .,family=binomial(link="logit"),
data=train)
Deviance Residuals:
20 21 6 16 18 4
3.971e-06 1.060e-05 -3.971e-06 -3.971e-06 -2.110e-08
11 2 19
-8.521e-06 -1.060e-05 -1.060e-05
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -7.297e+02 1.229e+06 -0.001 1
IQ 3.934e+00 6.742e+03 0.001 1
Bullying -1.421e+01 5.193e+05 0.000 1
Teacher.Hostility 2.798e+01 3.424e+05 0.000 1
Boredom -1.967e+01 8.765e+04 0.000 1
Lack.of.Motivation 4.174e+01 2.496e+05 0.000 1
Outside.Learning -6.535e+01 2.765e+05 0.000 1
Put.in.Remedial.Course 1.121e+02 2.712e+05 0.000 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1.1457e+01 on 8 degrees of freedom
Residual deviance: 5.6954e-10 on 1 degrees of freedom
AIC: 16
Number of Fisher Scoring iterations: 24
通过检查之前的输出,似乎逻辑回归模型无法处理该数据集,出现了错误并且输出了非常大的系数。这可能与数据的较小规模有关,其中线性系统是欠定的;然而,这并不是一个预测因子的数量超过样本中个体数量的情况,因此更可能是数据本身的特点,而不仅仅是样本量问题。
请注意,模型未能找到任何显著的自我报告抑郁症的预测因子。线性回归对这个数据集处理得不好,结果不可靠。对于某些样本,某些变量可能在线性回归模型中根本无法计算。同伦模型(以及其他类型的惩罚模型)通常在小型数据集上表现更好,并且有证据表明它们在具有多个局部极值的数据集上表现得更好。尽管这个数据集对于拟合模型来说有些小,但它确实展示了基于同伦的优化(以及一般的惩罚回归)在非常小的数据集上的强大能力,而且其结果比线性回归模型的结果更有意义。
摘要
在本章中,我们概述了同伦及其在机器学习中的应用,包括通过一个同伦作为回归算法扩展的示例,应用于一个模拟问题和一个真实数据集。同伦可以帮助回归算法避免局部极值,这些局部极值往往困住局部优化器。
同伦算法在人工智能领域的其他应用包括导航问题。例如,一个自主小车可能需要通过加权从当前位置到目的地的不同可能路径,来穿越医院的走廊和障碍物。同伦算法常被用来生成可能的路径,接着再根据时间成本或路线的危险成本对这些路径进行加权。还可以设置限制条件,以避免生成显然不可行的路径(例如通过小车无法物理通行的区域,或不希望进入的区域——如手术室)。这一拓扑数据分析的分支在未来几年可能会增长,我们鼓励你探索同伦在机器学习、机器人学、微分方程和工程学中的其他应用。
第十一章:期末项目:分析文本数据

在本章中,我们将通过一个与语言学和心理学相关的项目,将之前章节中开发的一些工具结合起来。如今,许多重要的数据项目都涉及文本数据,从文本匹配到聊天机器人,再到客户情感分析、作者身份辨识和语言学分析。我们将查看一个小型的语言学特征数据集,这些特征来自不同的创意写作样本,看看不同文体之间的语言使用如何变化;某些文体鼓励不同的写作过程,这反映出不同的作者思维方式,例如写个人散文和写即兴俳句的不同。
具体来说,我们将使用k-NN 和我们选择的距离度量来查看聚类重叠情况,然后通过降低数据集的维度来可视化特征空间,再使用 dgLARS 创建一个交叉验证模型,通过特征区分诗歌类型,最后基于语言嵌入检查一个预测模型。通过完成一个完整的项目,我们将看到这些工具如何结合在一起,从数据中得出洞察。
构建自然语言处理管道
在第一章中,我们简要讨论了文本数据的重要性以及自然语言处理(NLP)管道如何将文本数据转化为适合监督学习方法的模型特征。这就是我们即将进行的项目的方法。我们将使用 Python 将文本数据转化为特征,然后使用 R 来分析这些特征。
第一步是解析数据;我们需要将文本块拆分成更易处理的部分——可以是段落中的句子,也可以是句子中的单词和标点符号。这样我们就能分析小块文本,并将结果结合成一个句子、一个文档,甚至一组文档。例如,在本章中,你可能想要解析每个部分,然后是每个段落,最后是每个段落中的每个单词,以理解语言使用在引言材料和应用示例之间的变化。
有时,你可能需要去除标点符号、某些类型的填充词或词根的附加部分。词根排除了像ing这样的词尾,它会改变动词的时态或将某一词性转换为另一词性。考虑一下关于篮球练习中dribble、dribbled和dribbling的区别。如果控球后卫正在运球,动作正在发生。如果他们已经整个比赛都在运球,他们可能很累,并已经将球放回架子上。然而,控球后卫的动作,不论是过去还是现在,都是一样的。无论他们是现在做还是昨天做,都不重要。词干提取和词形还原是两种将词语分解为词根的方法:词干提取通过将词语简化为其词根来实现,不管词根是否仍然是一个有效的单词;词形还原则以确保词根仍然是一个单词的方式简化词语。
一旦文本解析达到你特定应用所需的程度,你就可以开始分析每一部分内容。情感分析旨在理解给定文本中的单词和短语背后的情感。例如,“糟糕的产品!!!永远不要买”与“有些用户可能不喜欢这款产品的味道”相比,语气明显更为负面。情感分析通过统计文本中每种情感的总数,量化文本中的情感,使每种情感得到一个分数,并可以将这些分数汇总为最终分数(如果需要的话)。
一旦解析完成,我们可以应用命名实体识别,该方法将单词与重要人物、地点或领域相关的术语列表进行匹配。例如,在处理与患者出院和结果相关的医学记录时,你可能希望将单词与诊断列表进行匹配。
在其他应用中,标注词性(包括代词、动词、介词、形容词等)可能非常重要。有些人可能使用某些词性比其他词性更多,理解这些模式可以揭示文本来源的个性、暂时的心态,甚至是诚实程度。对于某些 NLP 应用,可以将这些因素加载到给定的结果或一组结果中,从文本数据中创建全新的度量标准。
每种分析类型都可以作为附加特征集成到关系型数据库中,用于下游模型。例如,正如我们在本章后面将看到的,我们可以标注词性,按特定文档的长度进行标准化,然后将这些特征输入到模型中。你还可以将文档或一组文档中的单词向量化,以计算每个单词在给定文档的文档集中的频率。这通常是深度学习模型和可视化方法在 NLP 应用中之前的步骤。
同样,由于 R 相比于 Python 的 NLP 能力有限,我们已经在 Python 中完成了第一步——将文本数据解析成特征——并将结果文件提供给这本书。接下来,我们将使用 R 进行分析。我们使用了 Python 的 NLTK 工具包来解析文本数据,虽然这些步骤超出了本书的范畴,但我们已将脚本包含在我们的 Python 下载库中(nostarch.com/download/ShapeofData_PythonCode.zip),并鼓励你下载原始数据,看看你是否能够构建类似的 NLP 管道。
项目:诗歌语言分析
现代诗歌包含了许多不同结构、文学手法和主题的诗篇。例如,形式诗歌,如十四行诗或维拉内尔诗歌,在每行中有规定的重音音节数和总音节数,并且有明确的押韵模式。这些类型的诗歌通常广泛使用其他文学手法,如典故或寓言(通过对比其他作品的思想),头韵或元音韵(某种声音的重复),或韵律(诗句中重音音节的模式)。这是一个形式诗歌的例子(十四行诗):
从此以后
她的玻璃鞋变成了他的 M-16,
她那优雅的裙子变成了褪色的军装。
他已不再是当初那个卷入他们阴谋中的人,
他在远离王后的地方巡逻了五个月。
灰烬化作宫殿,她的梦如今成了废墟,
她看着她的马车变成了艾布拉姆斯坦克,
仿佛她的童话是一个残酷的恶作剧。
他喊道:“快点,伙计们!加速前进!”
她的时钟敲响十二点,他的坦克成了简易爆炸装置,
寡妇的女儿最终也成了寡妇。
现在她只剩下回忆,变成了阴影,
以安慰她那黑暗的痛苦日子。
她的“从此以后”没有明天,
留下灰姑娘的悲伤与忧愁。
相比之下,自由诗不要求每行的结尾有固定的押韵模式,行长可以不同(或者保持一致的长短),并且通常使用如韵律或押韵等文学手法来强调诗中的某些部分。这是一个行长较短的自由诗例子:
安雅
瘦削,
化妆过的,
在高跟鞋中晃动
太大了,穿不下她的小脚,
高跟鞋
那闪耀的光芒与撞击声
对着冰冷的混凝土
如同风
抽动她挑弄过的头发
像套索一样
驯牛的绳索
如雪花般飘落
紧紧束缚着牛仔裤
如同枷锁
她穿着它,走上了通往香格里拉的船
如街灯般
她眼中闪烁着光芒,
她凝视着
今晚
她的十五岁生日。
有些诗歌不太适合自由诗或形式诗,比如散文诗(其中不存在换行)或俳文(一种将散文诗与不同类型的俳句结合的日本形式)。现代俳句及其相关形式通过一个连接两个图像或思想的瞬间的破折号等转折来对比两个图像或思想。通常,现代俳句不符合日语的音节要求,但通常包含对季节和自然(或人性,对于相关形式 senryu)的某种参考。俳文通过诗歌标题、俳句和散文片段将一个故事编织在一起。以下是一个现代俳句的例子:
流星——
破折号之间
出生和死亡
从先前的研究中,我们知道不同的作者可以通过他们偏好的词汇选择和对不同词类的独特使用来识别(这是反抄袭软件的核心特征);我们也知道语言使用会因作者的心境而异。然而,目前尚不清楚同一作者是否会根据他们所写的诗歌类型而构建不同的诗歌。由于俳句和俳文起源于对想法进行对比的灵感,不同类型的诗歌可能会影响诗歌中语言和语法的使用。
在开始可视化之前,让我们先深入了解一下数据集。数据集中包含八首俳句、八首俳文、八首自由诗和八首形式诗。我们将它们分为基于俳句的诗歌和其他诗歌,以简化按照诗歌通常生成的方式进行分析(自由联想与精心创作)。我们将考虑的特征包括标点符号比例、名词比例、动词比例、人称代词比例、形容词比例、副词比例和介词/连词比例。考虑到每种诗歌类型的构造,这些因素中的一些可能会有所不同。有了更多的诗歌样本,您可以使用其他词类或将动词等类别分解为其各个组成部分。
我们将在 Python 中完成这些步骤,因此我们只会概述使用的步骤,而不会深入到代码中。您可以在本书的文件中找到处理过的数据。
标记化文本数据
对诗歌进行分析的第一步是标记化文本数据,这意味着我们需要将诗歌解析为单词和标点符号。 Treebank 标记器使用正则表达式来解析句子中的单词,处理缩略词和其他单词和标点的组合,并拼接引号。这些是解析诗歌文本数据的重要步骤,因为标点符号与单词和短语交错出现的频率相对较高。特别是俳句倾向于使用标点符号来在诗歌中创建一个切口,连接两个不同的图像或想法。
由于 Treebank 分词器经常将缩写和其他与标点连接的词拆分,因此使用正则表达式分词器来统计文本中实际存在的单词数量并将它们解析成包含标点的单词是很有用的。考虑到一些诗歌的篇幅较短,我们希望确保不会夸大单词的统计数量。正则表达式分词器的结果为我们提供了一个准确的单词计数,从而可以规范化词性或标点符号的比例。
在获得分词器结果的长度后,我们可以通过从令牌的数量中减去单词的数量来推导出文本中的标点符号长度。这使我们能够比较不同诗歌类型中单词和标点符号的比例,这可能会根据诗歌类型(以及根据先前关于不同作者文本片段语言差异的研究)而有所不同。
词性标注
为了标注相关的词性,我们将使用平均感知机标注器,这是一种监督学习算法,通常在各种文本类型中具有相当高的准确性,并且已经为 NLTK 包进行了预训练。虽然它在处理大量文本时稍显缓慢,但我们的文本样本相对较小,允许应用程序在不需要大量计算资源的情况下标注单词。通过使用大数据技术,接下来的章节中我们将讨论如何将 NLTK 的平均感知机标注器应用于非常大的数据集。
我们将解析名词、动词、个人代词、副词、形容词、介词和连词,并统计每个文本样本中每个类别的数量。
名词包括单数、复数、普通名词和专有名词的组合。动词包括所有类型和时态的组合。个人代词包括代词和所有格代词。副词和形容词包括副词和形容词的比较级和最高级形式。介词和并列连词也被标注和统计。
平均感知机标注器中还存在一些其他标注的词性,其他标注器可能会包括更细致的词性划分。如果你希望探索如何利用词性来区分文本类型、文本作者或作者的群体特征,你可能需要使用其他标注器,或将名词、动词等从它们的各个成分中分解出来。然而,这将导致数据集中出现更多的列,因此如果你进行这种细致的文本属性和词性分析,建议收集更多样本。
向量规范化
由于我们的文本样本中包含一些短诗和一些长诗,具体取决于诗歌类型,我们需要在处理数据之前对词性计数进行标准化。我们的方法包括通过词汇计数(标点符号和单词计数总和)来规范化标点符号,并通过单词计数来规范化词性计数,这些都在本章的文件中进行了总结。这应该提供足够的特征,既能展示诗歌类型差异,又能提供良好的降维效果,帮助可视化我们的数据集。
对于更细致的处理方法,可以解析动词、名词等词性的类型,或者通过词性类别的分数分解来提取更多详细特征,进而为分析工程化更多的特征。如果你熟悉 Python,我们鼓励你在 NLP 流程中进行实验,并自定义你的分析,以获得对诗歌类型语言差异的更多洞察。
现在,让我们继续进行 R 中的分析。
在 R 中分析诗歌数据集
我们将从加载处理后的诗歌数据集开始,并使用 Listing 9-1 中的代码来探索我们衍生的特征。
#load poem data and set session seed
mydata<-read.csv("PoemData.csv")
summary(mydata)
Listing 9-1:读取处理后的诗歌数据的脚本
副词往往是出现频率最低的特征,占每首诗中使用词汇的比例为 0 到 10.5%。名词则是最常出现的词汇,占一首诗中 12.5%到 53.5%的比例。人称代词比较少见,超过四分之一的诗歌没有人称代词(这可能与俳句有关,俳句通常不使用人称代词)。标点符号的使用差异较大,从俳句中没有标点符号,到自由诗中的标点符号几乎占到一半(例如医院的诊断名单诗)。考虑到这种差异,可能我们有很好的特征可以用于分析。
让我们为分析设置随机种子,并使用 t-SNE 可视化词性特征,使用每个可视化点的形状来表示诗歌类型;请在 Listing 9-1 中添加以下代码:
#grab relevant pieces of data
mydata1<-mydata[,-1]
haiku<-which(mydata1$Type=="haiku")
mydata1$Type[haiku]<-1
mydata1$Type[-haiku]<-2
set.seed(1)
#create and plot t-SNE projections of poem data
library(dimRed)
t1<-getDimRedData(embed(mydata1[,-1],"tSNE",ndim=2,perplexity=5))
plot(as.data.frame(t1),xlab="Coordinate 1",ylab="Coordinate 2",main="Perplexity=5 t-SNE Results",pch=ifelse(mydata1$Type==1,1,2))

图 9-1:按诗歌类型展示的 t-SNE 特征图,类型通过圆圈或三角形表示(perplexity=5)
从 Figure 9-1 中的图表可以看出,我们的诗歌趋向于分成几个簇,其中大部分点属于相同类型。这意味着基于核的模型或最近邻模型可能足以根据特征对诗歌类型进行分类。
由于特征之间有一定的分离,我们很可能可以应用算法来对数据进行聚类,并使用监督学习来了解俳句类型诗歌与其他诗歌之间的差异。
让我们将样本分为训练集和测试集,然后应用基于欧几里得距离的k-NN 算法,基于每首诗的五个最近邻居来分类诗歌类型,代码继续添加:
#create Canberra KNN models with different distances and five nearest neighbors
library(knnGarden)
s<-sample(1:32,24)
train<-mydata1[s,]
test<-mydata1[-s,]
kc<-knnVCN(TrnX=train[,-1],OrigTrnG=train[,1],TstX=test[,-1],
K=5,method="euclidean")
由于我们的 t-SNE 图(图 9-1)表明一些分离和通常靠近相似类型诗歌的点,这个模型很可能工作良好。让我们通过这个代码的补充来检查我们测试集的预测和真实标签在k-NN 模型下:
#examine performance
which(kc==test$Type)
> **1, 2, 3, 4, 5, 6, 7, 8**
看起来这个模型正确分类了所有的测试诗歌,表明这是一个能够根据特征区分诗歌类型的高质量模型。
我们将进一步使用一个 10 折交叉验证的 dgLARS 模型来检查这些潜在的类型差异,作为我们代码的一个额外步骤:
#create a cross-validated dgLARS model
library(dglars)
dg1<-cvdglars(factor(Type)~.,data=mydata1,
family="binomial",control=list(nfold=10))
dg1
由于我们使用的是一个小数据集,可能会出现一个或多个折叠存在问题,导致模型与这里显示的结果略有不同:
#examine the dgLARS model
> **dg1**
Call: cvdglars(formula=factor(Type) ~ .,family="binomial",data=mydata1,
control=list(nfold=10))
Coefficients:
Estimate
Int. -1.4782
Punctuation_Length 0.3113
Adverb_Count -0.2767
dispersion parameter for binomial family taken to be 1
Details:
number of non-zero estimates: 3
cross-validation deviance: 2.687
g: 0.4573
n. fold: 10
您的模型应该显示标点符号分数和副词分数的差异。自由诗和形式诗的标点使用率更高。鉴于这些类型的诗更有可能使用完整句子而不是连接短语,标点使用的差异与预期的差异一致。
副词分数的差异并不如预期。然而,副词的使用与许多不同的瞬时和固定人格特征相关联。可能是俳句涉及到不同的瞬时情绪或特质,从而在副词使用中反映出风格上的差异。主题内容也可能影响这种差异。
重要的是,这个分析显示了同一作者在相同类型的写作样本中,词性和标点模式会有所变化(诗歌)。鉴于先前的研究表明,一些这些输入特征可以用来识别文本的可能作者,因此重新考虑基于词性分析的作者预测可能是明智的。不同的主题、不同类型的写作以及作者的不同生活阶段可能会影响词汇选择、句子结构和标点符号的使用。
为了看到每种诗歌类型内的诗歌是如何分组的,让我们通过添加到我们的代码中来可视化每种诗歌类型的持久图:
#create the Vietoris-Rips complexes
library(TDAstats)
set1<-mydata1[mydata1$Type==1,-1]
set2<-mydata1[mydata1$Type==2,-1]
#compute Manhattan distance for set 1, compute Rips diagram, and plot
mm1<-dist(set1,"manhattan",diag=T,upper=T)
d1<-calculate_homology(as.matrix(mm1),dim=1,threshold=0,format="cloud")
plot_persist(d1)
#compute Manhattan distance for set 2, compute Rips diagram, and plot
mm2<-dist(set2,"manhattan",diag=T,upper=T)
d2<-calculate_homology(as.matrix(mm2),dim=1,threshold=0,format="cloud")
plot_persist(d2)
图 9-2 显示了俳句和非俳句样本的持久图,突出了类型内诗歌聚类中的一些差异:

图 9-2:按诗歌类型分类的持久图
正如我们在图 9-2 中看到的,非俳句诗歌的聚类更为一致,而俳句诗歌则呈现出分散的状态,多个诗歌组合在一起时没有太多分隔。这表明,俳句的特征在每首诗歌之间有所不同,而非俳句诗歌的特征则显示出更多的一致性。创作的自发性可能导致俳句诗歌的诗歌结构更加多样化。与诗歌创作的自发性和创作过程中所花费的时间相关的数据,可能会揭示出单次创作时产生的诗歌(例如俳句)与那些有更多创作意图的诗歌之间,在语言使用上的差异。
使用基于拓扑的自然语言处理工具
自然语言处理(NLP)作为一个领域,在过去几年中已经发展了很多,NLP 中一些常用工具通过拓扑来解决重要问题。早期的嵌入工具倾向于统计文档中或跨文档的词频,将文本数据解析为适用于机器学习算法的数值数据。然而,单词通常并不包含足够的语义信息来理解一个句子、段落或整篇文档。否定词,如no或not,会修饰句子中的动作或行为者。例如,“她确实让他进了房子”在语义上与“她确实没有让他进房子”是完全不同的。根据你试图预测或分类的内容,从单个单词到数字矩阵的简单映射并不适用。
此外,一份文档或文档集可能包含超过 30,000 个至少出现一次的单词。最常见的单词通常会频繁出现,但它们的存在并不会增加多少价值。重要的单词可能只会出现一两次。这又引出了维度问题,当我们试图从数据中筛选出重要的趋势时。
幸运的是,近年来通过拓扑映射和特殊类型的神经网络,在低维嵌入方面取得了一些重大进展。预训练的 transformer 模型是能够通过其隐藏层正向和反向传递信息,从而为文本数据获取最佳拓扑映射的神经网络。预训练的 transformer 模型通过大规模训练集学习文本数据的低维嵌入,这些训练集通常来自于目标语言或多种语言的文本数据。BERT(双向编码器表示模型)及其基于句子的嵌入版本 SBERT 是两种常见的开源预训练 transformer 模型,用于将文本数据嵌入到低维的密集矩阵中,以供机器学习任务使用。BERT 模型可以扩展到目前不支持的语言,如豪萨语、林加拉语或鲁沙尼语的文本嵌入;这有潜力加速语言翻译服务并保护濒危语言。GPT-3,基于与 BERT 类似的前提进行训练,已经创建了能够准确翻译和生成聊天机器人的模型,这些模型可以从输入文本中解析含义,而不是仅仅匹配关键字或在机器学习算法中处理高维矩阵时消耗大量计算资源。
我们使用 Python 在诗歌数据集上构建了一个基于其严肃或幽默语气的 BERT 模型,以展示 BERT 嵌入如何与本书中的监督学习工具相契合。(请注意,通过数据清洗将诗歌顺序更改后,我们获取了 BERT 嵌入并将其传回到 .csv 文件中。)你可以参考 Python 的 transformer 包,了解更多关于如何导入和利用 BERT 模型进行文本嵌入的信息,或者查看本章的 Python 脚本(nostarch.com/download/ShapeofData_PythonCode.zip)。不过,我们将继续将结果导入 R 并在较低维度中可视化数据,正如我们之前对诗歌语言特征的处理方式一样。让我们创建一个 t-SNE 嵌入并通过 清单 9-2 绘制图表。
#load poem data
#load data
mydata<-read.csv("BertSet.csv")
#create the embedding
library(dimRed)
t1<-getDimRedData(embed(mydata[,-1],"tSNE",ndim=2,perplexity=5))
#plot the results
plot(as.data.frame(t1),xlab="Coordinate 1",ylab="Coordinate 2",main="Perplexity=5 t-SNE Results",pch=ifelse(mydata$Type=="serious",1,2))
清单 9-2:一个加载 BERT 数据的脚本,用于处理严肃和幽默的诗歌,使用 t-SNE 嵌入数据并绘制结果
图 9-3 展示了嵌入结果,表明诗歌根据类型分成不同的簇。这与我们在图 9-1 中看到的“俳句与非俳句诗歌”结果相呼应,那里我们看到了特征在 t-SNE 嵌入中按类型分离。这再次表明,机器学习分类器应该能很好地处理我们的数据集。

图 9-3:t-SNE 嵌入结果的图表,严肃或幽默类型的诗歌分别用圆圈和三角形表示(perplexity=5)
现在我们知道机器学习模型可能在分类此数据方面表现良好,让我们通过添加 Listing 9-3 来拟合一个带有同伦延续的 Lasso 模型,以处理小样本问题:
#get training data split
set.seed(1)
s<-sample(1:25,0.85*25)
train<-mydata[s,]
test<-mydata[-s,]
#build Lasso model
library(lasso2)
etastart<-NULL
las1<-gl1ce(factor(Type)~.,train,family=binomial(link=probit),bound=5,standardize=F)
lpred1<-round(predict(las1,test,type="response"))
#examine results
lpred1
**>** **1 1 1 0 1**
test$Type
**>** **[1] serious serious humor serious**
Listing 9-3:一个脚本,加载用于严肃和幽默诗歌的 BERT 数据,将数据拆分为训练集和测试集,构建带有同伦延续拟合的 Lasso 模型,并显示测试数据的预测值和实际值。
数据集包含 384 个来自嵌入 BERT 模型的组件和 25 首诗。你使用的 R 版本可能会不同地拆分数据并拟合模型,但在我们使用的 R 版本中,测试数据包含三首严肃的诗歌,接着是一首幽默的诗,再接着是一首严肃的诗。模型预测为一首严肃诗、一首严肃诗、一首严肃诗、一首幽默诗和一首严肃诗(模型准确率为 100%)。考虑到训练集相比于输入到模型中的 384 个预测变量来说是如此之小,这是一个非常出色的表现。请注意,所选特征在语义上意义不大,因为它们只是嵌入。将基于拓扑的方法结合到管道中以处理和建模小数据集,可以在其他模型完全失败的情况下提供不错的预测。
总结
本章中,我们应用了本书中概述的几种方法,处理了一个涉及从 NLP 处理的诗歌中提取特征的数据集的语言学问题;我们还对数据进行了嵌入,并创建了一个模型来预测诗歌集中的语气差异。
对于第一个问题,我们通过降低数据集的维度来可视化群体差异,应用了两个监督学习模型来理解分类准确性以及区分诗歌类型的重要特征,并可视化了两组诗歌中存在的拓扑特征。这让我们发现,语言使用,特别是标点符号,在不同的诗歌类型中有所不同。
接着,我们研究了上下文感知嵌入,并使用基于拓扑的嵌入方法和基于拓扑的分类模型来预测我们的诗歌集的语气,这表明我们可以通过构建一个包含 384 个嵌入组件和 21 首诗的训练集来获得相当准确的预测。
在下一章中,我们将通过探讨如何通过分布式计算和量子计算方法来扩展拓扑数据分析算法,来为本书做一个总结。
第十二章:多核与量子计算

在前几章中,我们概述了许多来自几何和拓扑学领域的工具。我们看到了这些算法如何影响网络分析、自然语言处理、监督学习、时间序列分析、可视化以及无监督学习。还有许多更多根植于拓扑学的算法,包括改进现有模型(如卷积神经网络或递归神经网络)的混合算法,这一领域有潜力为机器学习领域贡献成千上万的算法。
然而,拓扑学和几何学机器学习算法开发和应用中的一个主要问题是计算成本。虽然大多数情况下不会出现问题,但计算某些网络度量可以扩展到一百万或十亿(甚至更多!)的网络规模。其他类算法,如持久同调或流形学习,则扩展性较差;有些算法在标准笔记本电脑上大约 20,000 行数据时就会遇到问题。对于大规模数据集,计算距离矩阵也需要大量的时间和计算资源。
然而,对于希望扩展这些方法的实践者来说,有几个潜在的选择。在本章中,我们将回顾多核方法和量子计算解决方案。本章中提出的解决方案仍处于初期阶段,随着本书中的算法被采纳为大数据算法,可能会开发出标准的软件包用于量子拓扑数据分析(TDA)算法和分布式 TDA 算法。
多核方法在拓扑数据分析中的应用
一种算法扩展方法是将数据的不同部分映射到不同的计算核心或系统,在每个核心的数据上同时计算所需的量,并将每个核心的数据量计算结果重新组合成一个单一的数据集。例如,假设我们想计算一个百万顶点网络中每个顶点的介数中心性。即使这是一个稀疏网络,边缘不多,每次计算介数中心性仍然需要很长时间。然而,如果我们有百万个核心,我们可以将网络映射到每个核心,并用每个核心计算网络中一个顶点的介数中心性。虽然计算时间可能依然很长,但计算所有一百万个顶点的介数中心性所需的总时间会远少于依次计算每个介数中心性(如我们在前几章对较小网络所做的那样)。虽然对于大多数组织来说,百万个核心是不可能的,但 10 个核心或 30 个核心所带来的时间节省可以显著加速计算。
也可以将数据集的部分内容映射到每个核心,来计算某种度量。例如,假设我们有一个包含 30 万人完成的在线客户调查的数据集。计算这 30 万人回答之间的距离会消耗大量计算资源。然而,距离矩阵在许多流形学习和拓扑数据分析算法中是必要的;因此,找到一种更快的方法来计算这些矩阵是很有意义的。我们可以将数据的不同部分映射到不同的核心,来计算更小的距离矩阵,这些矩阵在每个核心计算完之后可以组合成完整的 30 万乘 30 万的距离矩阵。同样,我们将看到显著的时间节省。
一般来说,这些多核方法属于分布式计算的范畴,在这种方式下,多个核心被用来计算问题的各个部分,当所有核心计算出它们的解决方案时,这些部分会被组合起来。大多数云计算资源都支持分布式计算,一些可以在云上运行的 R 和 Python 包也支持分布式计算选项。然而,通常是由机器学习或数据工程师来定义算法中的分布式计算步骤。图 10-1 展示了数据如何被解析并发送到不同核心的一个简单示例。

图 10-1:数据的三个部分映射到三个核心,这些核心将在机器学习流程中执行数学或算法步骤
在图 10-1 中,我们将数据集划分为三部分,分别映射到三个核心,以计算我们需要的量。在一个简单的大数据案例中,这可能涉及到计算数据集每一列中的最小值和最大值。然后,我们会计算跨核心的最小值和最大值,保存该值,并输出完整数据集中每一列的最小值和最大值。如果数据集只有几百万行,这可能帮助不大,但如果我们处理的是万亿行数据,这将大大加速计算过程。
多核方法在网络算法中效果很好,例如在第二章到第四章中遇到的那些算法,它们在持久同调和离散外微积分方面也取得了一些成功。只要问题是局部性质的,或者可以在某些步骤中将问题分解为更小的部分,多核方法都是可行的。例如,在机器人路径规划的同伦算法中,我们可以将绕过障碍物的潜在路径分开,并计算每条路径的某些最优值。
不幸的是,目前在 R 或 Python 中很少存在此书中算法的多核版本。然而,这是一个正在积极探索的领域,如果你熟悉大数据平台上的多核框架,鼓励你尝试将这种方法应用于持久同调、流形学习或其他基于几何的算法。
量子计算方法
扩展基于几何的算法的另一种方法是将它们实现到一种可以本地利用分布式计算的不同类型的计算机上。量子计算是一个最近的流行词,尽管即使在数据科学和软件工程领域,围绕这一领域仍然充满神秘和误解。尽管进展比预期的要快,但该技术仍处于早期阶段,当前系统存在显著的限制,许多公司正投入资金进行硬件研究和开发。然而,一些网络算法已经存在,网络科学是机器学习中最有可能从量子计算中受益的领域之一。在本节中,我们将介绍一些量子计算的基础知识,并列出截至 2023 年与图论和网络科学相关的一些量子算法。
首先,量子计算硬件可以采用几种不同的形式,每种形式都有其优缺点。计算机中的电路类型决定了可以在机器上开发何种算法,而某些类型的电路更适合进行网络分析。目前,两个硬件类型似乎是大多数研究和开发的重点,它们也将是本讨论的重点。
当前的系统有许多限制,包括需要冷却电路、由于量子尺度的效应(穿越能量障碍、相互作用粒子产生的场等),以及量子比特固有的随机误差。尽管如此,研究人员已经能够通过现有的量子计算机和 Python 中的模拟包,探索潜在的新算法和现有算法的量子版本。特别是图论和网络算法似乎非常适合量子计算,而同时通过量子比特搜索组合学解法的能力表明,当量子计算扩展到更大电路时,网络科学将迎来一次飞跃。
使用基于量子比特的模型
我们将从最类似经典计算机的量子硬件版本开始:基于量子比特的模型,它用量子版本的比特——量子比特——替代经典比特,量子比特是经典电路中 0 和 1 比特的量子版本。量子比特与经典比特不同,它们在某一时刻不仅能取 0 或 1 的值,而是可以同时处于 1 和 0 状态,直到量子比特被观察(此时它会塌缩为 0 或 1 状态)。此外,量子比特还可以通过计算门进行旋转,从而取到分数值。这意味着量子比特可以存在于多种不同的状态,并且可以通过量子门演化成最终的优化状态。这样,它们非常灵活。图 10-2 显示了比特和量子比特之间的差异。

图 10-2:比较经典比特与量子比特的图表
让我们快速浏览一下两种主要使用量子比特的硬件类型。如果你不理解这里的每个术语也不用担心,只要记住整体思路即可。两种芯片组使用量子比特。它们都依赖量子比特的量子原理(如叠加)来加速计算和提高精度。第一种是基于门电路,它类似于经典硬件,其中门操作作用于量子比特的状态(例如旋转门)。基于门的电路是最常见的,IBM 和 Rigetti 的机器就是例子;通常,基于门的算法能加速算法并提供便于基准测试的算法。另一种选择是目前 D-Wave 机器上使用的量子退火(通过磁场变化作用于量子比特状态,而不是通过门操作量子比特)。这种方法依赖物理加热和冷却过程。通常,与基于门的量子硬件相比,这种系统的性能和精度保证较少。
使用基于 Qumodes 的模型
除了量子比特模型,另一个主流模型是基于量子模式的电路模型,它是由加拿大公司 Xanadu 开发的基于光子的电路。当前,基于光子计算的软件和算法——它用光子代替量子比特——仅是机器的模拟,但这种模拟使得一些有趣的应用得以开发。这种电路使用波函数作为替代量子比特(量子比特在被测量时会塌缩为 1 或 0),波函数是连续分布的。波函数可以被压缩、映射,或通过其他几何变换进行操作,而不会塌缩成 1 或 0。这个计算机尚不存在,但已有相似的 Python 模拟程序(截至 2023 年),与量子比特电路的模拟程序类似。
使用量子网络算法
存在几种与图的性质相关的量子网络科学算法。团体查找算法在网络科学中尤为有用,量子团体查找算法已经存在。最大团算法似乎在它们被测试的非常小的 problém 中享受加速。
量子算法的一个重要警告是它们的概率性质。与其说得到一个输出中的团体列表,不如说量子算法会多次运行,创建团体列表的数组,这些数组可以合并为网络中团体存在的概率分数。这对于优先考虑项目的后续部分中的团体,或在一个非常大的网络中聚焦于最感兴趣的团体是有帮助的,尽管后者将需要比现有技术更大的电路。
量子最大流和最小割算法也存在;这些算法旨在将图划分为具有尽可能少割的社区,从而最大化图上的信息流。到目前为止,应用主要探索了重要性评分的用途,以根据对图结构和通信潜力的影响对边和顶点进行排名。它们在稀疏图中显示出一些潜力,并为推导重要性评分提供了一个概率框架。
确实存在使用 R 包 QuantumOps 的基本量子最大流和最小割算法,但该能力仅限于小型稀疏图。采用量子比特方法时,问题首先被转换为量子近似优化算法,或 QAOA。QAOA 公式是一种组合算法,依赖于量子比特状态的叠加和称为单位算符的东西来解决优化问题。单位算符是一种具有特殊属性的线性代数算符,能够很好地与量子比特电路的底层量子力学相匹配。由于解的概率性质,最好多次运行该算法以获得更精确的答案。在这种情况下,我们将运行算法 10 次(这是一个足够大的任意数字,可以生成具有概率解的可用结果),并通过使用列表 10-1 中的脚本,进一步探索该功能,脚本会重新加载来自列表 4-1 的图 1。
#load QuantumOps package
library(QuantumOps)
#transform Graph 1 from Listing 4-1 to unweighted graph
mydata1<-as.matrix(read.csv("Graph1w.csv",header=F))
mydata1[mydata1>0]<-1
#run the quantum approximation optimization algorithm maximum cut algorithm
q<-QAOA_maxcut(mydata1,p=10)
#explore the results
q
列表 10-1:在第四章首次看到的图 1 上运行 maxcut 算法 10 次
请注意,这个算法的输出包含 2⁷ 个项目,而我们的原始图包含六个顶点。通常,这种版本的量子最大割算法会在输出中包含 2((+n)^(+1)) 个项目,并且问题会扩展到更大的图。该算法的输出也是原始格式的,用户需要将输出转换为最可能的割。几个现有的 Python 包提供了更可用的输出,但此包为您提供了一种在 R 中探索一些基于量子比特的计算模拟的方式。
除了最大流和最小割算法之外,还有量子版本的随机游走算法,并且有可能基于这些算法构建社区发现算法或类似 PageRank 的算法。事实上,过去几年已经提出并在理论上研究了一些量子 PageRank 算法。然而,这类应用在实践中尚未得到广泛探索。但它为未来网络科学的进一步研究和潜在应用提供了一个途径。
与网络科学关系较少但更贴近图论的其他示例包括图着色算法和专注于测试图属性(如同构性和连通性)的算法。量子图查询和量子版本的 Dijkstra 算法或其他最短路径算法仍处于初级阶段,但它们在量子图论算法和量子网络科学算法的未来中展现出潜力。
尽管量子计算是一项新兴技术,但图论和网络科学已经看到了量子算法的潜在收益,未来可能会开发出更多的算法。目前,现有的算法通常是在 Python 中运行,但随着越来越多的公司开发量子计算机并为研究人员提供访问接口,未来很可能会出现新的量子计算机接口。
使用量子计算加速算法
大多数算法目前还没有可用的量子计算或模拟量子计算软件包。然而,可以利用量子计算和模拟量子计算软件包中已有的基本数学工具,逐步构建本书中提到的算法。R 软件包 QuantumOps 提供了一些这样的工具供我们探索,因此,让我们深入了解量子系统中基本数学计算的一个示例。请注意,此软件包仅模拟将在量子计算机上运行的算法,因此,在你的经典笔记本上看到的加速效果并不等同于在真实量子计算机上运行时的效果。然而,下面的示例将展示量子算法是如何被开发以在量子计算机上运行,从而在问题复杂度增加时加速计算,解决需要大量计算力的问题。
有许多算法可以找到两个数字之间的最大公约数,并且可以在量子计算框架内实现这一点。最大公约数是指能够同时整除这两个数字的最大数字;例如,能够同时整除 12 和 20 的最大数字是 4。我们可以将 12 分解为它的因数(1、2、3、4、6、12),将 20 分解为它的因数(1、2、4、5、10、20)。然后我们可以看到,4 是两个因数集中的最大共同元素。当数字较小时,这对我们来说是一个简单的手工计算问题;然而,在许多加密应用中,待因式分解或判定为质数的数字可能涉及 12 位或更多的数字。因式分解这些数字需要计算机的帮助。
gcd()函数在 QuantumOps 中找到两个数字之间的最大公约数,就像它们在量子计算机上被计算的方式一样。让我们用 12 和 20 作为输入数字,尝试一下这个例子,并看看gcd()函数是如何工作的;请参见列表 10-2。
#load QuantumOps package
library(QuantumOps)
gcd(12,20)
列表 10-2:找到 12 和 20 的最大公约数
你应该从列表 10-2 的代码输出中看到4,这对应于我们手工找到的 12 和 20 的最大公约数。这个函数可以计算远大于手工计算范围的公共约数。让我们输入两个新的更大的数字(比如,14,267 和 11,345),通过修改列表 10-2 中的gcd()函数来找到它们的最大公约数:
gcd(14267,11345)
根据我们的输出,这两个数字之间的最大公约数是 1。虽然这两个数字都不是质数,但它们没有共同的因数。对于这样大的数字,这个算法运行得很快,如果你对因式分解算法在网络安全中的应用感兴趣,建议你尝试在你应用中使用的规模上的数字,以进一步探索这个函数及其能力。在量子系统上,运行这个算法以处理更大的数字在合理的计算时间内是可能的。这意味着,一旦量子计算超越研究领域变得更加普及,基于因式分解的安全算法将无法有效运行。
QuantumOps 包并不包含一些更高级的数学工具,而这些工具是算法构建的基础,但它可以定义点积、范数以及其他对距离度量设计至关重要的线性代数工具,还可以定义机器学习任务中常见的其他线性代数工具。在真实的量子计算机上,我们能够更快速地运行算法,并处理比我们目前考虑的问题要大的许多倍。然而,QuantumOps 包使我们能够探索一些量子计算机上进行的量子算法研究中存在的内容。
在量子计算机上使用图像分类器
当前机器学习中的热门话题之一是图像分类,即利用机器学习根据给定的类别标签对输入图像进行分类。通常,你会拥有一组带有类别标签的图像,可以用来训练机器学习算法,识别出表明图像属于某个类别的特征(如颜色、线条、圆形或更复杂的模式)。例如,考虑标记某些植物或动物种类的问题,基于图片,这些图片可能包含或不包含我们希望自动标记的一个或多个类别。请看图 10-3,它展示了一棵炮弹树的开花部分。

图 10-3:一张费尔柴尔德热带花园中盛开的炮弹树的图片(原产于中美洲和南美洲)
现在请看图 10-4,它展示了一只大象。

图 10-4:一张大象在南非克鲁格国家公园的路上行走的图片
对这些图像进行分类有很多挑战。例如在图 10-3 中,我们看不到整棵树(这使得它难以被识别为树,而不是灌木或藤蔓),而且树正在开花(这意味着其他炮弹树的照片可能没有花)。在图 10-4 中,大象正朝着远离摄像头的方向走(这意味着没有动物面部),图像应用了镜头滤镜(改变了自然颜色),而且图像中包含了其他类型的事物(如植物、道路等)。大多数现实世界中的图像集并不会包含只有目标类别的完整图像,且颜色方案一致(想想你在谷歌图片搜索“猫”时出现的所有猫的图片)。一个好的分类器需要能够对不同光照下、图像中包含其他物体的不同类型的猫进行泛化。
我们可能还会面临用于训练算法的图像集中的类别不平衡问题。我们可能有大量的兰花、郁金香、美洲豹和袋鼠的照片,但我们可能只有相对较少的黑色蝙蝠花、加蓬眼镜蛇或非洲矮锯鲨的照片。例如,我们可能会遇到一种全新的植物,这种植物在自然界中不存在,或者是罕见的植物或花卉,许多图片并不存在,例如图 10-5 中展示的杂交品种。

图 10-5:一张在费尔柴尔德热带花园拍摄的基因工程新植物物种的图片
通常,图像分类算法涉及预训练的或自定义构建的卷积神经网络(CNN),这些在第一章中有讨论。简单回顾一下,卷积神经网络(CNNs)是一种深度学习算法,通过优化从输入图像层到多个不同类型的层,再到包含类别标签的输出层的映射,来寻找相关特征。在 CNN 架构中,某些层会在图像类别中找到显著特征,这些特征会在其他层中汇聚,这些层从前一层中找到最佳特征集并将其输入到下一层的特征提取层。通常,这些架构涉及多个层,而且通常需要大量的训练数据才能表现良好。此外,它们还需要大量的计算能力。
由于量子计算为许多算法提供了更快的运行时间,并且能够利用叠加态来扩展搜索能力,深度学习算法(如 CNN)与量子计算的结合提供了一种协同效应,能够更快速且使用更少的输入数据来找到相关特征。在许多现实应用中,我们并不能访问每一张在 Google 搜索中出现的图像。我们可能只有几百张关于罕见病症的医学图像,或者没有足够的计算能力来优化包含成千上万张蛇类图片的动物图像集,这些蛇类可能对发展中国家的农民或村庄构成威胁。
然而,到 2023 年为止,许多量子神经网络算法已经存在,且许多算法在图像分类等问题上显示出了竞争力的表现(尽管考虑到当前量子计算机的量子比特数量限制,扩展仍然是一个问题)。我们将探讨一个最近在南非开发的量子神经网络,它与 CNN 类似,用于处理图像分类问题,这就是 QuantumOps 包中用于一般用途和著名图像分析基准数据集的电路中心量子分类器。
电路中心量子分类器的细节有些物理学内容较重。如果你没有完全跟上也没关系;我们将在本节后续看到它的实际应用。
以电路为中心的量子分类器的基本方法是通过监督学习来学习电路的量子门参数,类似于在深度学习算法中拟合隐藏的神经网络层参数。独立变量被编码成量子系统的幅度,这些幅度会通过量子门进行操作。这些单比特和双比特量子门通过单比特测量来优化,测量会将系统从叠加态坍缩为单一态。通过多次运行算法来学习梯度,类似于本章前面提到的量子最小割和最大流算法的方法。与深度学习算法一样,我们使用丢弃正则化(dropout)分数,这会在每次迭代中修剪并添加到电路中。最终结果是一个优化过的量子架构,它通过修改独立变量集来创建基于训练集的独立变量和因变量的高质量建议标签。
虽然量子算子如何训练算法的具体细节超出了本书的范围,但该算法本质上是通过量子电路修改处理独立变量的量子物理规律,从而准确预测因变量。这种方法的一个优势是,相较于卷积神经网络(CNNs),神经网络架构和训练过程中所需的参数更少,能够加速拟合过程,并避免在架构设计中需要深入的专业知识,从而得到一个适合问题的架构。
我们将要探讨的数据来自于最常见的图像分析基准数据集之一。MNIST 数据集包含了成千上万张手写数字(0–9)的图片。这些图片分别从 250 位和 500 位书写者的集合中收集,并合并成一个数据集。由于不同的人和不同的文化有不同的书写数字方式(例如,在欧洲某些地区为了区分 1 和 7,会在 7 上加斜线),而且不同的人书写时也常常有不同的倾斜角度(右倾、左倾、正中、向下、向上、直立等),因此,判断图像中是哪一个数字,实际上比表面看起来要更具挑战性。
让我们通过一个示例来详细了解如何将这个以电路为中心的量子分类器应用到 QuantumOps 中,并用于识别 MNIST 数据集中的单个数字,参考示例 10-3。
#load QuantumOps package
library(QuantumOps)
QuantumMNIST256Classifier(matrix(sample(256,replace=TRUE),nrow=1),array(1),0,1,1,.001,1,"test")
示例 10-3:训练量子分类器以识别数字 0
Listing 10-3 创建了一个图像样本,其中目标类别设置为数字 0(即分类 0 与任何其他数字),学习参数为 1,每次迭代没有学习率衰减,偏置较低(允许其他参数更新得更快),并且只有一次训练迭代。根据你的机器,运行可能需要一些时间,因为该算法正在模拟一个量子系统;甚至可能需要更强大的计算能力。使用 CNN 时,我们需要与网络相关的更多参数(更不用说需要调整架构以适应隐藏层的数量和类型),更多的训练时间,以及更多的计算能力。使用这段代码,我们优化了 33 个量子门并找到了整个优化后的分类器电路矩阵。这代表了量子架构,能够解析手写数字 0 与其他数字的区别。我们可以重复这个过程,直到为 MNIST 中的每个数字类找到量子分类器。在实际的量子计算机上,这个实现会更快,因为电路不需要在经典电路上进行模拟。
虽然量子神经网络的其他版本已经存在,但大多数还没有开源实现。我们鼓励你探索现有的论文,并尝试在现有的量子系统上实现量子神经网络的可能实现。大多数量子计算公司都提供与学术界和工业界研究人员的合作伙伴关系,以加速量子算法设计进展,如果你可以访问量子计算机,你可以在真实的量子计算机上运行本章的算法(以及其他模拟的包),从而利用计算速度的提升。
总结
在本章中,我们探讨了分布式计算解决方案来扩展算法,例如我们的计算密集型网络和 TDA 算法。我们还介绍了量子计算框架,模拟了一个用于寻找最小流和最大割解的量子图算法,运行了量子最大公约数算法的模拟,并探索了一个模拟的量子分类器,灵感来源于 CNN,用来探索量子计算的潜力。随着量子计算机的规模扩大并且越来越多的研究人员和行业数据科学家可以使用它们,你未来可能会有机会在实际系统上实施这些类型的算法,这将比经典算法提供更好的性能。
鉴于当前电路设计的进展,未来可能会开发其他解决方案,帮助扩展本书中的算法,这些算法在现有计算基础设施下在大数据处理上存在困难,我们希望扩展算法的工具能够加速几何和拓扑领域新工具的发展。拓扑数据分析领域正在迅速发展。该领域的更多研究可能会导致新算法的出现,解决机器学习和数据分析中的一般性或特定问题。
第十三章

第十四章:对……的赞誉
数据的形态
“标题已经说明了一切。数据被许多复杂的关系所束缚,这些关系在我们充满电子表格的二维世界中并不容易展现。数据的形态带领你走过这一更丰富的视角,并展示如何将其付诸实践。”
—斯蒂芬妮·汤普森,数据科学家和演讲者
“数据的形态是将几何学应用于机器学习领域的一个新颖视角和非凡成就。它的范围广泛,包含了大量具体示例和实践实现的编码技巧,同时也有极为清晰、简洁的写作风格,帮助读者理解概念。即使是作为一位在行业内已经多年经验的资深数据科学家,读完这本书后,我仍然与我的领域建立了更深的联系,并获得了新的理解。”
—库尔特·舒普费尔,博士,麦当劳公司
“数据的形态是数据科学中拓扑学和几何学应用的绝佳来源。拓扑学和几何学推动了机器学习在非结构化数据中的发展,而数据的形态则很好地介绍了这一主题给新读者。”
—尤切纳“艾克”楚库,资深量子开发者
第十五章:数据的形状
基于几何的机器学习与数据分析在 R 中的应用
作者:Colleen M. Farrelly 和 Yaé Ulrich Gaba

第十六章
数据的形态。 版权 © 2023 由 Colleen M. Farrelly 和 Yaé Ulrich Gaba 拥有。
保留所有权利。未经版权拥有者和出版商的书面许可,本书的任何部分不得以任何形式或通过任何手段(电子或机械方式,包括复印、录音或任何信息存储与检索系统)复制或传播。
初版
27 26 25 24 23 1 2 3 4 5
ISBN-13:978-1-7185-0308-3(印刷版)
ISBN-13:978-1-7185-0309-0(电子书)
出版人:William Pollock
主编:Jill Franklin
制作经理:Sabrina Plomitallo-González
制作编辑:Sydney Cromwell
开发编辑:Alex Freed
封面插画:Gina Redman
内部设计:Octopod Studios
技术审阅:Franck Kalala Mutombo
文稿编辑:Kim Wimpsett
排版员:Jeff Lytle, Happenstance Type-O-Rama
校对员:Scout Festa
索引员:BIM Creatives, LLC
有关分发、大宗销售、公司销售或翻译的详细信息,请直接联系 No Starch Press ®,邮箱:info@nostarch.com 或:
No Starch Press, Inc.
地址:245 8th Street, San Francisco, CA 94103
电话:1.415.863.9900
www.nostarch.com
国会图书馆编目数据
作者:Colleen Farrelly, Colleen, 作者。| Gaba, Yaé Ulrich, 作者。
标题:数据的形态:网络科学、基于几何的机器学习与拓扑数据
《R 分析》/ 作者:Colleen M. Farrelly 和 Yaé Ulrich Gaba。
描述:旧金山,加利福尼亚州:No Starch Press,[2023 年] | 包含参考文献。
标识符:LCCN 2022059967(印刷版)| LCCN 2022059968(电子书)| ISBN 9781718503083(平装本)|
ISBN 9781718503090(电子书)
主题:LCSH:几何编程。 | 拓扑学。 | 机器学习。 | 系统分析—数据
处理:| R(计算机程序语言)
分类:LCC T57.825 .F37 2023(印刷版)| LCC T57.825(电子书)| DDC 006.3/1--dc23/
版本:eng/20230301
LC 记录可在 https://lccn.loc.gov/2022059967 查阅
LC 电子书记录可在 https://lccn.loc.gov/2022059968 查阅
No Starch Press 和 No Starch Press 标志是 No Starch Press, Inc. 的注册商标。文中提到的其他产品和公司名称可能是其各自所有者的商标。我们并不打算每次都使用商标符号,而是以编辑的方式使用这些名称,旨在为商标所有者带来利益,并无侵犯商标的意图。
本书信息以“原样”分发,不提供任何保证。尽管在准备此作品时已采取一切预防措施,作者和 No Starch Press, Inc. 对任何人或实体因本书内容所引起的任何损失或损害,或被认为由其引起的损失或损害,不承担任何责任。
第十七章
献给我的祖母 Irene Borree,她直到九十多岁时仍然享受我们关于新技术的讨论。
—Colleen M. Farrelly
献给全能的上帝,耶书亚·哈马西亚赫,智慧与知识所有宝藏的钥匙,也是道路的引领者。
献给我亲爱的妻子,Owolabi。感谢你一直以来的信任。
献给我的父母,Prudence 和 Gilberte,以及我的兄弟姐妹,Olayèmi、Boladé 和 Olabissi。
献给 Jeff Sanders,我会称他为我的“学术父亲”。
—Yaé Ulrich Gaba
第十八章:作者介绍
Colleen M. Farrelly 是一位高级数据科学家,她的学术和行业研究聚焦于拓扑数据分析、量子机器学习、基于几何的机器学习、网络科学、层次建模和自然语言处理。自从从迈阿密大学获得生物统计学硕士学位后,Colleen 在多个行业担任数据科学家,包括医疗保健、消费品、生物技术、核工程、市场营销和教育等领域。Colleen 经常在技术会议上演讲,涵盖主题包括 PyData、SAS Global、WiDS、Data Science Africa 和 DataScience SALON。工作之余,Colleen 喜欢写俳文/俳画或游泳。
Yaé Ulrich Gaba 在南非开普敦大学(UCT)完成了博士学业,专攻拓扑学,目前是量子跃迁非洲(QLA,卢旺达)的研究员。他的研究兴趣包括计算几何、应用代数拓扑(拓扑数据分析)以及几何机器学习(图形和点云表示学习)。他目前的重点是数据分析中的几何方法,他的工作旨在开发有效且理论上有依据的算法,用于利用几何和拓扑思想与方法进行数据和形状分析。
技术审稿人介绍
Franck Kalala Mutombo 是卢本巴希大学的数学教授,曾担任塞内加尔 AIMS 的学术主任。他曾在斯特拉思克莱德大学和南非 AIMS 担任研究职位,并与开普敦大学有联合任职。他拥有来自苏格兰格拉斯哥的斯特拉思克莱德大学的数学科学博士学位。他是复杂网络结构及其应用研究的专家。他最近的研究考察了网络结构对长程交互的影响,这些交互应用于流行病、扩散和物体聚类。他的其他研究兴趣包括流形的微分几何、偏微分方程的有限元方法以及数据科学。
前言
Colleen M. Farrelly 和 Yaé Ulrich Gaba 的书名《数据的形状》与作者邀请我们一起体验的旅程一样贴切而美丽,正如我们发现那些描绘我们分析数据洞察更深层含义的几何形状。
通过利用拓扑和几何数据分析,启用并结合常见的机器学习、数据科学和统计解决方案,包括监督/无监督学习或深度学习方法的组合,为我们提供了对潜在数据问题的新见解。它提醒我们作为数据科学家的责任,任何算法方法都可能因数据偏差而严重扭曲我们的预期结果。举个例子,数据科学家需要充分理解数据的上下文,避免在需要考虑三维细节的情况下,进行基于二维欧几里得距离的分析,类似于在全球旅行时进行路由分析所需要的方式。
在全书的数学数据分析之旅中,我们遇到了结构化数据分析的起源,以及许多看似非结构化的数据场景,这些场景可以转化为结构化数据,从而使标准的机器学习算法能够执行预测性和规范性分析洞察。当我们在数据的谷底和峰顶之间穿行时,我们学会了沿途收集特征,这些特征成为进入其他数据层的关键输入,形成了对包括网络数据、图像和基于文本的数据在内的各种非结构化数据源的几何解释。此外,Farrelly 和 Gaba 擅长通过在 R 和 Python 中提供的精心定义的示例,详细阐述了基础和高级概念,这些示例可以从他们书籍的网页上下载。
在过去几年与 Farrelly 和 Gaba 合作的多个激动人心的项目中,我一直希望能有一本书出现,能够像《数据的形状》一样清晰、优雅地解释拓扑数据分析领域的发展,直到利用分布式和量子计算解决方案的阶段。
在我担任 Cypher Genomics 首席技术官期间,Farrelly 领导了我们的基因组数据分析项目。她立即以敏锐的洞察力启发了我,帮助我理解如何最好地建立疾病本体论与症状本体论之间的相关性,同时利用模拟来理解缺失连接对图谱的影响。Farrelly 的务实方法帮助我们成功解决了关键问题,创建了一种算法,通过跨越基因、症状和疾病本体论进行映射,从而根据基因或症状数据预测疾病。她专注于基于拓扑的网络挖掘诊断方法,帮助我们通过图总结和统计检验定义了数据网络的形态、属性和连接分布。我们在本体论映射、基于图的预测以及网络挖掘与分解方面的共同努力,带来了关于代谢组学、蛋白质组学、基因调控网络、患者相似性网络和变量相关性网络的关键数据网络发现。
从我们共同的基因组学和相关生命科学分析的日子,到我们最近的量子计算项目,Farrelly 和 Gaba 始终展现出对所有相关复杂性以及如何将他们的见解应用于多个日常问题的强烈热情和独特理解。加入他们的“数据形态”之旅,将是一次宝贵的时光,因为你将踏上一个精心编排的冒险,探索使用几何模式解决机器学习和数据分析中的常见或特定问题的 R 和 Python 算法,帮助塑造所需的结果。
这本书对初学者和资深专家来说都具有相关性和吸引力。第一次接触的读者会发现,深入理解专为分析网络数据而设计的算法示例非常简单,包括社交网络和地理网络,以及本地和全球指标,来理解网络结构和个人在网络中的角色。讨论涵盖了为网络数据开发的聚类方法、建议网络中新边缘的链接预测算法,以及理解例如流程或流行病如何通过网络传播的工具。
高级读者会发现,深入探讨一些新兴话题非常有趣,例如在机器学习算法中用非线性代数替代线性代数,以及在灾难规划中使用外微积分来量化需求。数据的形态让我迫不及待地想要卷起袖子,迎接许多新的挑战,因为我觉得自己像《古墓丽影》中的 Lara Croft 一样准备充分,这多亏了 Farrelly 提供的宝贵“藏宝图”和深刻的探索工作。它们之间可能存在某种隐藏的联系或“隐藏层”吗?
Michael Giske
技术执行官,B-ON 全球首席信息官,Inomo Technologies 主席
第十九章:致谢
我,Colleen,想感谢我的父母 John 和 Nancy,以及我的祖母 Irene,在我写书期间给予的支持,感谢他们鼓励我在小时候接触数学并玩味其中。
我还要感谢 Justin Moeller,感谢他与我进行的体育与艺术对话,这使我走上了数据科学的职业道路,感谢他和 Christy Moeller 在长时间写作本书过程中给予的支持,也感谢 Ross Eggebeen、Mark Mayor、Matt Mayor 和 Malori Mayor 多年来在这个项目及其他写作工作中持续的支持。
我的职业生涯和这本书的完成,离不开 Cynthia DeJong、John Pustejovsky、Kathleen Karrer、Dan Feaster、Willie Prado、Richard Schoen 和 Ken Baker 在我学术生涯中的支持,尤其是在我从医学/社会科学转向数学的过程中。感谢 Jay Wigdale 和 Michael Giske 在我职业生涯中的支持,也感谢许多朋友和同事的帮助,包括 Peter Wittek、Diana Kachan、Recinda Sherman、Natashia Lewis、Louis Fendji、Luke Robinson、Joseph Fustero、Uchenna Chukwu、Jay 和 Jenny Rooney,以及 Christine 和 Junwen Lin。
如果没有我们的编辑 Alex Freed;我们的执行编辑 Jill Franklin;以及我们的技术审阅者 Franck Kalala Mutombo,本书是不可能完成的。我们还要感谢 Bastian Rieck 和 Noah Giansiracusa 的贡献。我们感谢 No Starch Press 营销团队的支持,特别是 Briana Blackwell 在宣传我们演讲方面的帮助。
我们还要感谢 R,它提供了开源包和用代码生成的图形,以及微软 PowerPoint,它获得许可用于生成本书中的额外图像。我们还要感谢 NightCafe,感谢它提供了生成图像的平台,并授予创作者完全的版权。
生活中的任何成就都离不开许多已知和未知的人们的帮助。我,Yaé,想特别感谢那些让这项工作成为可能的人。
感谢我的妻子 Owolabi,感谢你不懈的支持。感谢 Colleen Farrelly,感谢她发起了这个项目并带我一起参与。感谢 Franck Kalala,我的资深同事和朋友,感谢他出色的审阅技能。
感谢我的朋友和同事:Collins A. Agyingi、David S. Attipoe、Rock S. Koffi、Evans D. Ocansey、Michael Kateregga、Mamana Mbiyavanga、Jordan F. Masakuna 和 Gershom Buri 的关心。感谢 Jan Groenewald 和整个 AIMS-NEI 家庭。
感谢我的精神父亲和导师们,Pst Dieudonné Kantu 以及整个 SONRISE 家庭,Pst Daniel Mukanya,Pst Magloire N. Kunantu,他们的领导力启发了我自己的成长。
第二十章:介绍

我,科琳,第一次面对自己在数学上的犹豫,是在几何学为我在艺术课上遇到的一个问题提供了解决方案时:将一幅平面画作转移到一个弯曲的花瓶上。我朋友画布上的直线在弯曲的花瓶上并没有按照相同的方式表现。画作上各点之间的距离因曲率的不同而变化。我们无意中发现了我们在课堂上学到的几何学(其行为类似于画布上的画作)和真实世界物体(如花瓶)几何学之间的差异。真实世界的数据往往更像花瓶,而不是画布上的画作。作为一名行业数据科学家,我与许多非数据科学领域的专业人士合作过,他们想要学习新的数据科学方法,但要么在职业生涯中没有接触过很多数学或编程,要么在之前的教育经历中对数学有着挥之不去的恐惧。没有编码示例的数学密集型论文常常限制了其他专业人士在自己领域内解决重要问题时可以使用的工具集。
数学不过是另一种理解我们周围世界的语言;就像任何语言一样,它是可以学习的。本书专注于几何学,但它不是一本数学教科书。我们避免使用证明,极少使用方程式,并尽量简化算法背后的数学,使这些工具能够为更广泛的读者所接受。如果你在数学上更为先进,并且想要了解完整的数学理论,我们在书末提供了参考资料。
几何学是每一个机器学习算法和问题设置的基础,今天存在成千上万的基于几何的算法。本书聚焦于当前使用的几打个算法,优先介绍那些可以在 R 中实现的算法。如果你想了解几何如何与算法相关,如何通过代码实现基于几何的算法,或者如何从几何的视角思考你遇到的问题,请继续阅读。
本书适合谁?
尽管本书适合任何想要动手学习网络科学、基于几何学的机器学习以及基于拓扑学的算法的读者,但有一定的统计学、机器学习背景,以及至少掌握一门编程语言(理想情况下是 R 或 Python)将会更有帮助。本书的设计目标是为以下人群提供指导:
-
使用少量病人数据的医疗专业人士
-
寻找所学内容应用性的数学学生
-
希望利用数据推动销售的小企业主
-
对使用拓扑数据分析进行研究项目感兴趣的物理学家或化学家
-
对基于证明的文本持谨慎态度的好奇社会学家
-
希望丰富工具集的统计学家或数据科学家
-
寻找实践示例以展示给学生的教育工作者
-
转向机器学习的工程师
我们将在示例中调查许多科学和商业领域,并涵盖今天塑造数据科学的几十种算法。每一章将专注于所讨论算法背后的直觉,并提供如何使用这些算法通过 R 编程语言解决问题的示例。虽然本书中的示例以 R 语言呈现,但我们的可下载代码库(nostarch.com/download/ShapeofData_PythonCode.zip)包括了 R 和 Python 代码,用于 Python 有类似功能的示例,以便支持两种语言的用户。您可以根据自己的兴趣跳过不相关的部分。
本书介绍
本书从介绍机器学习中的几何学开始。与几何学相关的算法主题通过一系列网络科学章节展开,逐步过渡到度量几何学、基于几何学和拓扑学的算法,以及这些算法在自然语言处理、分布式计算和量子计算中的一些新应用。以下是本书章节的简要概述:
第一章:数据的几何结构 详细描述了如何从几何学的角度检查机器学习算法,举例说明医疗数据和图像数据。
第二章:网络的几何结构 通过社交网络的示例介绍网络数据的度量、结构和类型。
第三章:网络分析 介绍了网络数据上的监督学习和无监督学习、基于网络的聚类算法、不同网络的比较,以及疾病在网络中的传播。
第四章:网络过滤 从网络数据转向单纯复形数据,扩展网络度量到更高维度的交互,并介绍诸如网络等对象的孔计数。
第五章:数据科学中的几何学 概述了维度灾难、距离度量在机器学习中的作用、维度减少与数据可视化,并应用于时间序列和概率分布。
第六章:几何学在机器学习中的新应用 详细介绍了几种基于几何的算法,包括在教育数据中的监督学习、基于几何的灾难规划和活动偏好排序。
第七章:拓扑数据分析工具 重点介绍基于拓扑的无监督学习算法及其在学生数据中的应用。
第八章:同伦算法 介绍了一种与路径规划和小数据分析相关的算法。
第九章:最终项目:文本数据分析 重点介绍文本数据集、用于文本嵌入的深度学习算法以及通过前几章的算法分析处理后的文本数据。
第十章:多核与量子计算 深入探讨分布式计算解决方案和量子算法,包括一个量子网络科学示例和一个量子图像分析算法。
下载并安装 R
在本书中,我们将使用 R 编程语言。R 安装简单,且与 macOS、Linux 和 Windows 操作系统兼容。你可以在cloud.r-project.org选择适合你系统的下载链接。你可能会被提示点击一个与你地理位置相关的链接(或者选择一个通用的云连接选项)。如果你之前没有安装过 R,可以选择首次安装基础版,这是 R for Windows 页面上的第一个下载选项。
一旦你点击首次安装选项,你应该会看到一个屏幕,提供下载 R for Windows 的选项。
R 下载完成后,你将按照系统提供的提示进行安装。根据操作系统的不同,安装过程可能会略有不同。不过,安装指南将带你完成设置 R 所需的步骤。
如果你想发布项目或将 R 与其他开源项目(如 Python)连接,RStudio 提供了一个舒适的界面,方便你更轻松地将 R 与其他平台连接。你可以在www.rstudio.com找到 RStudio 的下载链接。下载 RStudio 后,只需按照操作系统的命令提示进行安装,配置适合你使用场景的设置。
安装 R 包
R 提供了几种在系统上安装新包的选项。命令行方式可能是最简单的。你将使用 install.packages("``package_name``") 命令,其中 package_name 是你想安装的包的名称,例如 install.packages("mboost") 用于安装 mboost 包。然后,你可能会被要求选择下载的地理位置。包将开始下载(并下载任何未在你机器上安装的依赖包)。
你也可以使用图形用户界面(GUI)来安装包。如果你想浏览可用的包而不是只安装一个特定的包来满足你的需求,这种方法可能更为合适。在你启动 R 后,你可以从“包”菜单中选择 安装包(s) 选项。
你将被提示选择位置,安装过程将像使用命令行安装包的选项一样进行。
获取 R 帮助
R 有许多有用的功能,能够帮助你处理代码中的函数或包问题。help()函数可以让你获取关于已安装包或函数的信息。通过在函数后加上包名(例如,help(glmboost, "mboost")可以帮助你了解通过 mboost 包实现的广义线性模型提升回归函数的使用方法),你可以查看尚未安装的包的相关信息,这样你就能在决定安装新包之前了解该函数的作用。如果你正在寻找某些特定功能,但不确定网上找到的资料是否正是你需要的,这个功能会非常有用。如果不想使用help()函数,你还可以在函数名之前加上问号(例如,?glmboost)。
你还可以使用命令browseVignettes()浏览包中函数的使用示例,它会显示你在 R 中已安装的每个包的 vignettes。如果你想要查看某个特定包的 vignettes,可以像这样指定包名:browseVignettes(package="mboost")。许多包都带有很好的概述,展示如何将包中的函数应用于示例数据集。
R 拥有广泛的用户群体,互联网搜索或编程论坛可以为与某个包相关的特定问题提供额外资源。还有许多优秀的教程概述了 R 语言中的基本编程概念和常见函数。如果你对编程不太熟悉,可能需要先通过一个免费的 R 编程教程,或者在尝试本书中的代码之前,先在 R 中处理一些数据。
由于 R 是一个不断发展的语言,新的包会定期添加和移除,我们鼓励你通过包的官方网站和网络搜索来跟进相关的发展。已停止维护的包仍然可以作为遗留包安装和使用,但需要谨慎使用,因为这些包不会再由包作者进行更新。在本书中我们将看到一个例子,展示如何安装一个遗留包。同样,新的包会定期开发,你应该在几何学领域找到并使用新的包,随着它们的发布。
Python 用户支持
虽然本书提供了 R 代码示例,但我们可下载的资源库(nostarch.com/download/ShapeofData_PythonCode.zip)包括了尽可能的 Python 包和函数的翻译。大多数示例都有对应的 Python 翻译,供 Python 用户使用。然而,某些翻译可能不存在,或者只包括那些在某些操作系统上无法正确安装的包。我们鼓励你在这些翻译不存在的情况下开发 Python 应用,且未来本书中的方法(以及未来开发的方法)可能会提供更多的 Python 支持。
总结
数学对于一些人来说可能令人畏惧,但它构成了当前机器学习和技术中许多热门话题的基础。理解这些流行术语背后的几何学将帮助你更深入地理解算法是如何工作的,以及它们如何被用来解决问题。你甚至可能在这个过程中找到一些乐趣。
我们喜欢帮助人们学习几何学和机器学习。欢迎随时与我们联系,或者通过 LinkedIn 与我们取得联系(www.linkedin.com/in/colleenmfarrelly)。
这本书将一步步带你了解几何学。你可能会有问题,可能会对某些概念感到困惑,或者会根据你所阅读的内容尝试一些自己的例子。数据科学是一个过程。在你遇到困难时寻求帮助是学习数据科学的自然一部分。最终,你会找到自己解决问题的偏好方法。
让我们开始吧!
第二十一章:目录详细内容
-
《数据的形态》赞誉
-
标题页
-
版权
-
致谢
-
关于作者
-
前言
-
致谢
-
简介
-
本书适合谁阅读?
-
关于本书
-
下载并安装 R
-
安装 R 包
-
获取 R 帮助
-
Python 用户支持
-
总结
-
-
第一章:数据的几何结构
-
机器学习分类
-
监督学习
-
无监督学习
-
匹配算法与其他机器学习
-
-
结构化数据
-
虚拟变量的几何
-
数值电子表格的几何
-
监督学习的几何
-
-
非结构化数据
-
网络数据
-
图像数据
-
文本数据
-
-
总结
-
-
第二章:网络的几何结构
-
网络理论基础
-
有向网络
-
R 中的网络
-
网络中的路径和距离
-
-
网络中心性度量
-
顶点的度数
-
顶点的接近度
-
顶点的介数
-
特征向量中心性
-
PageRank 中心性
-
Katz 中心性
-
中心与权威
-
-
在一个示例社交网络中测量中心性
-
网络的附加量
-
顶点的多样性
-
三元闭合
-
顶点的效率与偏心性
-
Forman-Ricci 曲率
-
-
全球网络度量
-
网络的互联性
-
网络中的传播过程
-
网络的谱度量
-
-
现实世界行为的网络模型
-
Erdös-Renyi 图
-
无标度图
-
Watts-Strogatz 图
-
-
总结
-
-
第三章:网络分析
-
使用网络数据进行监督学习
-
使用社交媒体网络指标进行预测
-
预测社交媒体中的网络链接
-
-
使用网络数据进行无监督学习
-
将聚类应用于社交媒体数据集
-
网络中的社区挖掘
-
-
比较网络
-
通过网络分析传播
-
跟踪疾病在城镇间的传播
-
跟踪风帆冲浪者之间的疾病传播
-
破坏通信和疾病传播
-
-
总结
-
-
第四章:网络过滤
-
图过滤
-
从图到单纯形复形
-
Betti 数的例子
-
欧拉示性数
-
持久同调
-
-
通过持久同调比较网络
-
总结
-
-
第五章:数据科学中的几何学
-
常见距离度量
-
模拟小型数据集
-
使用基于范数的距离度量
-
比较图、形状和概率分布
-
-
使用度量几何的 K-最近邻
-
流形学习
-
使用多维尺度法
-
通过 Isomap 扩展多维尺度法
-
使用局部线性嵌入捕捉局部特征
-
使用 t-SNE 进行可视化
-
-
分形
-
总结
-
-
第六章:几何在机器学习中的新应用
-
处理非线性空间
-
介绍 dgLARS
-
使用 dgLARS 预测抑郁症
-
使用 dgLARS 预测信用违约
-
-
应用离散外微分
-
机器学习算法中的非线性代数
-
使用 HodgeRank 比较选择排名
-
总结
-
-
第七章:拓扑数据分析工具
-
找到具有独特行为的不同群体
-
验证测量工具
-
使用映射器算法进行子群挖掘
-
逐步了解 Mapper 算法
-
使用 TDAmapper 查找数据中的聚类结构
-
-
总结
-
-
第八章:同伦算法
-
引入同伦
-
引入基于同伦的回归分析
-
在样本数据集上比较结果
-
总结
-
-
第九章:最终项目:分析文本数据
-
构建自然语言处理管道
-
项目:分析诗歌中的语言
-
文本数据的标记化
-
标注词性
-
向量归一化
-
-
在 R 中分析诗歌数据集
-
使用基于拓扑的 NLP 工具
-
总结
-
-
第十章:多核与量子计算
-
多核方法在拓扑数据分析中的应用
-
量子计算方法
-
使用基于量子比特的模型
-
使用基于 Qumodes 的模型
-
使用量子网络算法
-
通过量子计算加速算法
-
在量子计算机上使用图像分类器
-
-
总结
-
-
参考文献
-
索引
表格列表
-
表 2-1:Farrelly 社交网络顶点的中心性度量
-
表 3-1:k-均值聚类的聚类均值和大小(k = 3),在 Farrelly 社交网络的若干顶点度量上运行
-
表 4-1:图 1 过滤中的度中心性
-
表 4-2:图 2 过滤中的度中心性
-
表 4-3:Farrelly 社交网络中顶点的拓扑维度和度数总结
-
表 5-1:在列表 5-2 的矩阵中,点对之间的欧几里得距离计算
-
表 5-2:在列表 5-2 的矩阵中,点对之间的曼哈顿距离计算
-
表 5-3:在列表 5-2 的矩阵中,点对之间的 Minkowski 距离计算
-
表 5-4:在列表 5-2 的矩阵中,点对之间的 Canberra 距离计算
-
表 5-5:在图 5-7 的矩阵中,单个点的 Mahalanobis 距离结果
-
表 6-1:UCI 信贷违约 dgLARS 模型中项的系数
-
表 6-2:城镇对之间的最短距离
-
表 6-3:城镇对之间的最短距离
插图列表
-
图 1-1:自变量流、监督学习算法(视为函数)和因变量预测
-
图 1-2:Microsoft Excel 工作簿中结构化数据的示例
-
图 1-3:经过转换的结构化数据集,其中类别变量被替换为两个二元虚拟变量
-
图 1-4:将类别变量的值放置在单一维度中,会使得其中一些值比其他值更接近。
-
图 1-5:创建性别虚拟变量的两种方法。左侧,每个类别都有一个轴,确保类别是等距离的;右侧,我们只使用两个轴,导致一些类别之间更接近。
-
图 1-6:使用纬度和经度(左)作为地理空间数据的变量会扭曲数据点之间的距离。这里显示的是,位于本初子午线两侧的非常近的点,在经纬度平面(右)中被表示为非常远的点。
-
图 1-7:几种分类算法在二维空间中的决策边界
-
图 1-8:带有因变量值的训练数据,通过圆圈大小表示(上图),以及两种非线性回归算法的三维预测表面:3-NN(下左)和随机森林(下右)
-
图 1-9:训练误差与测试误差之间的关系图,作为预测算法灵活性的函数,展示了过拟合的概念
-
图 1-10:二维空间中两对点的绘图
-
图 1-11:在图 1-10 左侧(浅灰色显示)附近点和右侧(深灰色显示)远离点的随机小扰动后,欧几里得距离的直方图
-
图 1-12:如图 1-11 所示的欧几里得距离直方图,不同之处在于嵌入到d = 10 维(左)和d = 100 维(右)空间后
-
图 1-13:在二维空间中不能线性分离的两类数据点(左),但在将其放置到三维空间后(右)并在那里进行扰动后可以线性分离
-
图 1-14:克鲁格国家公园中的一头大象(左)和一只母狮(右)
-
图 1-15:图 1-14 中狮子的头部,几何地作为一个 3D 数学表面观察
-
图 2-1:同一网络的两种不同绘图。这些图具有相同的顶点和连接顶点的边,但这些关系的绘制方式有所不同。然而,无论我们如何可视化这些关系,它们的基本结构是不会改变的。
-
图 2-2:三位同事之间的电话网络,(a) 为无向,(b) 为有向
-
图 2-3:连接的城镇之间的城镇连通性和道路里程的绘图
-
图 2-4:一个具有四个顶点连接成正方形的网络
-
图 2-5:Farrelly 的社交网络数据集的绘图,包括她的医学院服务组(顶部集群)和退伍军人组织组(底部集群)之间的连接,顶点 7(Farrelly 本人)作为桥梁
-
图 2-6:Farrelly 的社交网络数据上紧密中心性(左)和介数中心性(右)的气泡图
-
图 2-7:Farrelly 的社交网络数据上特征向量中心性(左)和 PageRank 中心性(右)的气泡图
-
图 2-8:Farrelly 社交网络数据上 Katz 中心性的气泡图,衰减参数 alpha = 0.2(左)和 alpha = 0.1(右)
-
图 2-9:Farrelly 社交网络的有向版本上中心性(左)和权威中心性(右)的气泡图
-
图 2-10:一个有一个友谊链接未知的友谊网络,说明三元闭合的概念
-
图 2-11:Farrelly 社交网络上的传递性气泡图
-
图 2-12:一条直线的中点通过将其从左到右滑动穿过具有递增 Ricci 曲率的空间而变形
-
图 2-13:Farrelly 社交网络的负 Forman–Ricci 曲率
-
图 2-14:顶部行的三个网络都有 25%的密度,而左下角和右下角的网络分别具有 50%和 75%的密度。
-
图 2-15:两个网络,绘制以说明与图拉普拉斯矩阵相关的谱度量。它们具有相同数量的连接分量,但右侧的网络具有更高的代数连通性。
-
图 2-16:两个无标度网络(顶部)和两个 Watts–Strogatz 网络(底部)
-
图 3-1:Farrelly 的社交网络日记条目数据的直方图
-
图 3-2:在清单 3-2 中运行的 Poisson 回归的残差和分位数图
-
图 3-3:Farrelly 的社交网络,根据表 3-1 总结的 k-means 聚类进行颜色和标注
-
图 3-4:Farrelly 社交网络上通过四种不同算法进行的聚类
-
图 3-5:三种不同类型的随机网络的网络直径直方图:Erdös–Renyi(浅灰色),无标度(中灰色),和 Watts–Strogatz(深灰色)
-
图 3-6: 四个城镇及其之间道路的接近度分数(反向距离)
-
图 3-7: 两个精简版的风帆网络,其中删除了所有权重不在前四分位数(左)或前二四分位数(右)内的边
-
图 3-8: 在原始 KONECT 风帆网络数据集上进行的 SIR 模拟(100 次试验),展示了时间上感染人数的变化(包括均值和置信区间),对于传染率为 3,恢复率为 2 的疾病
-
图 3-9: 在原始 KONECT 风帆网络数据集上进行的 SIR 模拟(带置信度),现传染率为 1,恢复率为 10
-
图 3-10: 作者完整网络上的 SIR 传染病模型
-
图 3-11: 作者修改后的网络上的 SIR 传染病模型(删除了顶点 7)
-
图 4-1: 两个示例网络的图形
-
图 4-2: 在 Graph 1 和 Graph 2 的过滤过程中图形直径度量的图形
-
图 4-3: 一个简复合体,展示了三位同事之间的双向互动
-
图 4-4: 一个简复合体,展示了三位同事之间的三向互动
-
图 4-5: 一个示例的棒球和篮球,看起来相似,但在拓扑上是不同的
-
图 4-6: 从一张纸片构建圆环面,纸片边缘连接
-
图 4-7: 三片含有不同位置孔洞的奶酪块
-
图 4-8: 绘制图 4-7 中框图所捕捉到的特征(孔洞)持久性的示意图
-
图 4-9: 三种模拟网络类型的图形
-
图 4-10: 三种模拟网络类型的持久性图形(从上到下:厄尔多斯-雷尼,规模无关,瓦茨-斯特罗加茨)
-
图 5-1: 一张纸片上的两个点的图形,以及连接它们的直线
-
图 5-2: 球面上两个点的图形,以及连接它们的测地线
-
图 5-3: 一个邻里中房屋的图形,其中一个人正走在两栋房子之间
-
图 5-4: 一个邻里中房屋的图形,其中一条直线连接房屋
-
图 5-5: 一个邻里中房屋的图形,其中行人在房屋之间的人行道上行走
-
图 5-6: 五个点的图形,所有点都位于由变量 a、b 和 c 定义的坐标轴上
-
图 5-7: 五个点的图形,带有一条直线指向集合中的一个点
-
图 5-8:基于列表 5-2 矩阵的个别点,采用列均值中心化后的马氏距离图,列均值点显示在轴外
-
图 5-9:两种泥堆分布,类似于使用 Wasserstein 距离度量可以比较的概率密度函数类型
-
图 5-10:两种泥堆分布,类似于可以使用 Wasserstein 距离度量比较的概率密度函数类型,这些度量衡量了我们将堆 1 转换为堆 2 时需要移动泥土的工作量
-
图 5-11:两种二项分布的密度函数绘制对比
-
图 5-12:为比较绘制的三种二项分布的密度函数,其中两个来自相同分布的样本
-
图 5-13:两种不同半径的圆
-
图 5-14:一只狗和主人通过牵引绳连接,在公园的不同路径上行走
-
图 5-15:一只狗和主人通过一条较长的牵引绳连接,在公园的不同路径上行走
-
图 5-16:两个示例时间序列的图
-
图 5-17:两圆交点图
-
图 5-18:三角形和四面体,存在于不同维度的欧几里得空间中
-
图 5-19:三角形和四面体,均映射到三维欧几里得空间
-
图 5-20:从二维圆盘中抽取的样本
-
图 5-21:一个高中食堂,内有三种不同的学生群体
-
图 5-22:MDS 结果的并排视图,结果因选择的距离度量而异
-
图 5-23:Isomap 结果的并排视图,结果因最近邻数量而异
-
图 5-24:LLE 结果的并排视图,结果因最近邻数量而异
-
图 5-25:使用整个样本作为最近邻的 LLE 结果图
-
图 5-26:具有不同困惑度设置的 t-SNE 结果的并排图
-
图 5-27:分形的示例。请注意,不同尺度下的模式具有自相似性。
-
图 5-28:在不同尺度下测量一系列分形曲线下的面积的示例
-
图 5-29:2019 年 6 月至 2020 年 5 月模拟的道琼斯工业平均指数收盘价图。请注意,从 2020 年 2 月底开始的大幅下降,当时 COVID 成为全球性问题。
-
图 6-1:一个正弦波示例,在其中一个局部最大值处画出了切线
-
图 6-2:一个椭圆,具有多个通过点 A 的可能切线
-
图 6-3:一个椭圆与点 A 及其切平面,延伸切线到切平面和空间
-
图 6-4:加载到风险指数上的问题数量比较
-
图 6-5:在索引问题中捕获的相关信息的两种调整度量
-
图 6-6:三角形的边界
-
图 6-7:一条线的边界
-
图 6-8:两点构成一条线
-
图 6-9:三位同事共同工作的图,通过三方互动表示
-
图 6-10:连接的城镇之间的连接性图与道路里程
-
图 6-11:连接的城镇之间的连接性图、城镇间的道路里程以及每个城镇内的资源
-
图 6-12:情景 1 的修改版图示,灾难中一条道路被摧毁
-
图 6-13:一条直线与曲线
-
图 6-14:一条曲线与椭圆相交的图示
-
图 6-15:一个凸物体
-
图 6-16:一个非凸物体
-
图 6-17:相对于其他选择的三种选择排名图
-
图 6-18:偏好数据中加入另一项活动的图示
-
图 6-19:四项活动的偏好不完全图
-
图 6-20:不完全且不一致的排名偏好数据示例
-
图 6-21:没有一致偏好的不完全偏好数据图示
-
图 6-22:显示通过霍奇–赫尔姆霍兹分解细分的流动的图示
-
图 7-1:第一组教育经验数据的持久性图
-
图 7-2:模拟数据的树状图
-
图 7-3:另一组模拟数据的持久性图,这次使用不同的参数模拟数据
-
图 7-4:一个多阴影的物体,具有由阴影梯度定义的莫尔斯函数
-
图 7-5:按阴影梯度分块图 7-4 的分箱结果
-
图 7-6:通过对图 7-4 的结果进行分箱定义的聚类
-
图 7-7:Quora 样本分析中找到的聚类的网络图
-
图 7-8:Quora 样本结果的网络图,定义箱重叠的参数不同
-
图 8-1:通往高尔夫球场洞口的长路径(左)变形为较短的路径(右)
-
图 8-2:一个环形课程(甜甜圈)中起点和终点相同的两条路径,无法相互变形,除非被切割或移除内部孔
-
图 8-3:一个例子障碍赛道,从起点到终点有几种可能的解决方案
-
图 8-4:一个蒙着眼的人通过障碍赛道
-
图 8-5:一个蒙着眼的人通过引导绳导航障碍赛道
-
图 8-6:三维数据的散点图,即具有多个局部极值的函数
-
图 9-1:按诗歌类型绘制的 t-SNE 图,类型通过圆圈或三角形表示(
perplexity=5) -
图 9-2:按诗歌类型绘制的持久性图
-
图 9-3:t-SNE 嵌入结果的图,严肃或幽默类型的诗歌分别用圆圈和三角形表示(
perplexity=5) -
图 10-1:将三部分数据映射到三个核心,它们将在机器学习管道中执行数学或算法步骤
-
图 10-2:比较经典比特与量子比特的图
-
图 10-3:位于费尔柴尔德热带花园的开花炮弹树的照片(原产于中美洲和南美洲)
-
图 10-4:一只大象走在南非克鲁格国家公园的道路上的照片
-
图 10-5:一张在费尔柴尔德热带花园拍摄的基因工程新植物物种的照片
清单列表
-
清单 2-1:一个从边列表生成图 2-2(b) 中的有向网络的脚本
-
清单 2-2:一个从邻接矩阵生成图 2-2(b) 中有向网络的脚本
-
清单 2-3:一个生成图 2-3 中连接城镇网络并绘制它的脚本
-
清单 2-4:一个加载社交网络数据集、将其转换为图对象并进行绘制的脚本
-
清单 2-5:一个为 Farrelly 社交网络数据集中的每个中心性度量创建气泡图网络图的脚本
-
清单 2-6:一个将 Farrelly 社交网络转换为有向网络,并绘制结果中的枢纽和权威分数的脚本
-
清单 2-7:一个为 Farrelly 社交网络中的几个顶点中心性得分创建表格的脚本
-
清单 2-8:一个计算并绘制 Farrelly 社交网络的 Forman–Ricci 曲率的脚本
-
清单 2-9:一个计算网络
g的图拉普拉斯算子并从中提取连接组件数量和代数连接性的脚本 -
列表 3-1:一个导入相关.csv文件以供进一步分析的脚本
-
列表 3-2:一个计算 Poisson 回归并分析其结果的脚本
-
列表 3-3:一个使用 k-means 算法对顶点度量进行聚类的脚本,将图 3-1 中的网络顶点分成k = 3 组
-
列表 3-4:一个在 Farrelly 社交网络上运行四种顶点聚类算法的脚本,绘制结果并计算每种算法的模块度分数
-
列表 3-5:一个生成 300 个网络并平均分配为三种不同类型的脚本;计算它们的网络直径;然后绘制每个网络的直方图:Erdös–Renyi、无标度网络和 Watts–Strogatz 模型
-
列表 3-6:一个创建并绘制第二章中的四个城镇网络的脚本,边的权重由道路长度的倒数决定
-
列表 3-7:一个加载 KONECT Windsurfer 网络数据集并通过去除权重不在前一或前二四分位数中的边缘,创建两个稀疏版本的脚本,然后绘制结果
-
列表 3-8:一个在 KONECT Windsurfer 网络数据集上运行 100 次 SIR 模型模拟的脚本,感染率为
beta=3,恢复率为gamma=2,然后绘制结果并显示不同时间点的感染者中位数 -
列表 4-1:一个加载两种不同网络结构以进行过滤的脚本
-
列表 4-2:一个计算 Farrelly 社交网络中各顶点拓扑维度的脚本
-
列表 4-3:一个模拟三种不同网络结构以进行统计比较的脚本
-
列表 5-1:一个模拟并绘制小型数据集的脚本
-
列表 5-2:一个模拟数据集中五个点的矩阵,包含随机变量a、b和c
-
列表 5-3:一个模拟不同二项分布的脚本
-
列表 5-4:一个加载并检查两个时间序列数据集的脚本
-
列表 5-5:一个从二维圆盘中抽样以检查 Gromov–Hausdorff 距离的脚本
-
列表 5-6:一个通过* k *-NN 分类并使用不同的距离度量和五个邻居对样本进行分类的脚本
-
列表 5-7:一个生成示例数据集并计算距离矩阵的脚本
-
列表 5-8:一个加载模拟的 DJIA 收盘数据,计算分形维度和收盘价格范围,并进行相关性测试以确定分形维度与收盘价格范围之间的关系的脚本
-
Listing 6-1: 加载 Quora 数据集的脚本
-
Listing 6-2: 使用 dgLARS 和交叉验证的 dgLARS 算法加载、处理并分析 UCI 信用违约数据集的脚本
-
Listing 6-3: 生成连接城镇示例图,绘制图形,给每个城镇添加资源,直观展示这些资源并分析互联城镇资源的脚本
-
Listing 7-1: 加载教育数据集并将其划分为两组,通过持久同调进行探索的脚本
-
Listing 7-2: 加载并处理数据以获取距离矩阵的脚本
-
Listing 8-1: 创建一个有全局最小值和最大值但有多个局部最优解的两变量函数的脚本
-
Listing 8-2: 加载并分析 Quora IQ 样本的脚本
-
Listing 9-1: 读取处理后的诗歌数据的脚本
-
Listing 9-2: 加载 BERT 数据并嵌入数据,使用 t-SNE 绘制结果的脚本
-
Listing 9-3: 加载 BERT 数据并将数据划分为训练集和测试集,构建 Lasso 模型并使用同伦连续拟合,显示测试数据的预测值与实际值的脚本
-
Listing 10-1: 在第四章首次出现的图 1 上运行最大切割算法 10 次的脚本
-
Listing 10-2: 计算 12 与 20 的最大公因数的脚本
-
Listing 10-3: 训练一个量子分类器来识别数字 0 的脚本
指南
-
封面
-
前言部分
-
献辞
-
前言
-
简介
-
开始阅读
-
索引
页面
-
i
-
iii
-
iv
-
v
-
vii
-
xv
-
xvi
-
xvii
-
xviii
-
xix
-
xx
-
xxi
-
xxii
-
xxiii
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
155
-
156
-
157
-
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
200
-
201
-
202
-
203
-
204
-
205
-
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
221
-
222
-
223
-
224
-
225
-
226
-
227
-
228
-
229
-
230
-
231
-
232
-
233


浙公网安备 33010602011771号