机器学习必备的数学基础

1机器学习会用到哪些数学基础

第一部分,我们先来看一看机器学习需要哪些数学的基础。我们可以先引用一个专家的定义。这个专家是来自美国华盛顿大学的佩罗·多明戈斯。这也是人工智能领域的一个老兵。他对于机器学习给出了这样一个定义,机器学习是由三个部分组成,分别是表示、评价,还有优化。这样的三个步骤,实际上也就对应着在机器学习当中所需要的数学。
机器学习三部曲

表示

在表示这一步当中,我们需要建立起数据,还有实际问题的抽象模型。所以,这里面就包括了两个方面,一方面我们要对要解决的这个实际的问题进行抽象化处理。比方说我们要设计一个算法,判断一个邮件它到底是不是一封垃圾邮件,那么得到的结果无外乎两种,要么是,要么不是。这样一个问题如果对它做抽象,实际上就是个二分分类问题。是,我们可以把它定义成 0,不是,可以把它定义成 1。所以,这个问题最终要解决的是什么呢?输出一个 0 或者 1 的结果。当然把 0 和 1 的意义调过来也可以,用 1 代表是垃圾邮件,0 代表不是,也是可以的。所以,在表示的过程当中,我们要解决的问题就是把我们面临的真实世界当中的一些物理问题给它抽象化,抽象成一个数学问题。抽象出来这个数学问题之后,我们要进一步去解决它,还要对这个数据进行表示。

对于问题抽象完了以后,我们还要对数据进行抽象。在判定这个邮件到底是不是垃圾邮件的时候,我们要怎么判断呢?要根据它的特征进行判断,看一看这个邮件里的关健字是否有关于推销的,或者关于产品的一些关键字。这些特征,这些关键字,我们就要把它表示成一个特征,表示成一个向量,或者表示成其他的形式。表示成向量也好,表示成其他形式也好,都是对这个数据做出了抽象。

在表示阶段,我们需要建立的是数据,还有问题的抽象模型。把这个模型建立出来,然后去寻找合理的算法。

  • K- 近邻算法 。在机器学习当中,我们常见的有 K- 近邻算法。K- 近邻算法在我们的专 栏中没有提到,因为它太简单了。它实际上就是,找到一个样本点和这个样本点最近的 几个邻居,最近的这 K 个邻居。按照少数服从多数的原则,对它进行分类,这就是 K- 近邻算法。
  • 回归模型 。除此之外,还有线性回归,这样的统计学习方法。我建立一个线性回归模型,当然,对二分类我们可以建立逻辑回归模型。
  • 决策树 。还有像决策树这样的方法。决策树它不依赖于数据,它完全是自顶向下的一个设计。线性回归也好,逻辑回归也好,它是从数据反过来去推导模型,而决策树直接去用模型判定数据,两个方向不太一样。
  • SVM 支持向量机 。最后,还有 SVM 支持向量机这样的纯数学方法。所以说表示的部分,我们需要把问题和数据进行抽象,这个时候我们就要用到抽象的工具。

评价

给定了模型之后,我们如何评价这个模型的好坏呢?这个时候就需要设定一个目标函数,来评价这个模型的性质。

设定目标函数

目标函数的选取也可以有多种形式。像对于我们说到的垃圾邮件这种问题,我们可以定义一个错误率。比方说一个邮件它原本不是垃圾邮件,但是我这个算法误判成了垃圾邮件,这就是一个错例。所以呢,错误率在分类问题当中是个常用的指标,或者说常用的目标函数。

最小均方误差和最大后验概率

那么在回归当中呢,我们会使用最小均方误差这样一个常用目标函数,尤其是在线性回归里。除此之外呢,还有最大后验概率,一些其他的指标。

优化

有了目标函数以后,我们要求解这个目标函数在模型之下的一个最优解,这个模型能够获取到的最小错误率,或者最小均方误差是多少呢?我们要求出一个特定的值。没有这个值的话,你如何评价不同的模型它到底是好是坏呢?所以说优化这个步骤它的作用是求解目标函数在模型之下的一个最优解,看看这个模型在解决这个问题的时候,最好能达到什么样的程度。

总结来说,多明戈斯教授总结到的机器学习的三个步骤,包括了表示、评价、优化这样三个步骤,在这三个步骤当中我们会用到不同的数学公式来分别解决这三个问题。
三种数学工具

线性代数

在这三个步骤中,应用了三种不同的工具。在表示这个步骤当中,我们主要使用的工具是什么呢?就是线性代数。线性代数呢,我们在这个专栏里面也提到,它起到的一个最主要的作用就是把具体的事物转化成抽象的数学模型。不管你的世界当中有多么纷繁复杂,我们都可以把它转化成一个向量,或者一个矩阵的形式。这就是线性代数最主要的作用。

所以,在线性代数解决表示这个问题的过程中,我们主要包括这样两个部分,一方面是线性空间理论,也就是我们说的向量、矩阵、变换这样一些问题。第二个是矩阵分析。给定一个矩阵,我们可以对它做所谓的 SVD(singular value decomposition)分解,也就是做奇异值分解,或者是做其他的一些分析。这样两个部分共同构成了我们机器学习当中所需要的线性代数,当然了,这两者也是各有侧重。线性空间的话,我们主要应用在一些解决理论问题当中,矩阵分析在理论当中有使用,在实践当中也有一些使用。

概率统计

我们说到,线性代数起作用是在表示的过程当中。在评价过程中,我们需要使用到概率统计。概率统计包括了两个方面,一方面是数理统计,另外一方面是概率论。

数理统计好理解,我们机器学习当中应用的很多模型都是来源于数理统计。比方说最简单的线性回归,还有逻辑回归,它实际上都是来源于统计学。在具体地给定了目标函数之后,我们在实际地去评价这个目标函数的时候,我们会用到一些概率论。比方说给定了一个分布,我要求解这个目标函数的期望值。在平均意义上,这个目标函数能达到什么程度呢?这个时候就需要使用到概率论。所以说在评价这个过程中,我们会主要应用到概率统计的一些知识。

实际上对于数理统计来说,我们在评价模型的时候,不只关注的是一个目标函数,我们可能还关注一些它的统计特性。比如说它的置信度,或者是其他的一些指标。你这个模型建立起来,它的可信性程度到底有多大,这些在早期的机器学习算法当中也是需要考虑的。当然随着神经网络,随着深度学习的兴起,这部分内容实际上渐渐地衰落,或者渐渐地被忽略。你在神经网络当中可能只需要达到一个这个好的目标函数,好的指标就行,至于说它的置信度,这些我们不去考虑。

所以说,这也是深度学习不太受学数学,或者说学统计学的人待见的一个原因。因为统计学强调什么呢?强调可解释性,你这个模型能够达到什么样的指标,我们能把它清清楚楚地讲明白,为什么能够达到这样的指标,它的原理在哪?它背后的根据在哪?我给定一个分布,假如说高斯分布,那么再给定一个模型,我就可以通过严谨而简洁的这个数学推导,把这个结果以公式的形式给它呈现出来,这个看起来就很高大上,或者说很清楚。但神经网络和深度学习,现在还达不到这样可解释的程度。所以说现在也有人批评,说深度学习是炼金术,主要的原因在这里。我只能够通过调参数调出一个比较好的结果,但是到底这个结果为什么会出现?哪些因素会影响到它?可能还不是那么清晰。所以呢,关于概率统计,我们主要应用在评价这个过程中。

最优化理论

关于优化,就不用说了,我们肯定用到的是最优化理论。在最优化理论当中,主要的研究方向是凸优化。

凸优化当然它有些限制,但它的好处是什么呢?能够简化这个问题的解。因为在优化当中我们都知道,我们要求的是一个最大值,或者是最小值,但实际当中我们可能会遇到一些局部的极大值,局部的极小值,还有鞍点这样的点。凸优化可以避免这个问题。在凸优化当中,极大值就是最大值,极小值也就是最小值。

但在实际当中,尤其是引入了神经网络还有深度学习之后,凸优化的应用范围越来越窄,很多情况下它不再适用,所以这里面我们主要用到的是无约束优化。我在整个范围之内,我对参数,对输入并没有限定。在整个的输入范围内去求解,不设置额外的约束条件。同时,在神经网络当中应用最广的一个算法,一个优化方法,就是反向传播。

三种数学工具和三个步骤并非一一对应

我们今天谈论这个机器学习当中,用到的基础数学都包括哪些呢?包括这三种,线性代数,概率统计,还有最优化理论。这是我们在机器学习当中用到的最基础的一些数学工具。如果大概做一个分类,分别对应到我们机器学习当中,表示、评价,还有优化这样三个步骤。
当然,这种应用它也并不是说一一对应的关系。在表示当中我只用到线性代数,概率统计一点儿都不涉及,同样地,我在评价的时候,线性代数也不涉及,不是这样,都会有一个交叉的过程,但是在每个步骤当中应用到的主要工具还是有所区别。

高等数学是数学工具的基础

当然,在数学工具当中,我们并没有涉及到高等数学,高等数学我们就把它当作一个基础,一个基础中的基础。不光是人工智能,或者说机器学习,只要有数学参与的地方,我们都需要有高等数学的这个基础。那么具体到机器学习当中,我们在高等数学这一块儿用到的比较多的,可能包括求导,微分,这样的一些内容。当然还有这个积分,我们在求解这个目标函数的期望值的时候可能也会遇到。
所以到这呢,我们就说,我们介绍了机器学习当中用到了哪些数学。主要就是这三块,线性代数,概率统计,还有最优化,那么任何复杂的算法实际上都是由这三者的结合叠加所构造出来的,那么这三者在机器学习当中他们起到的作用分别是什么呢?我们可以具体地来看一看。

2 三种数学工具在机器学习中的作用

线性代数

将具体事物抽象为数学对象

对于线性代数来说,我们可以对它做一个简单的定义。所谓线性代数是什么?就是数量和结构的一个组合,也就是说,线性代数等于数量加上结构。本身数量呢,它是一个单独的数。对于单个的数我们没有结构可言,对于单个的对象没有结构可言。但是当我们把一组数,或者一堆数排列到一块儿的时候,这个排列不是随机的排列,而是有一定的顺序进行排列的时候,这个时候,数目之间的顺序或者数量之间的顺序就形成了一种结构,这个结构就可以蕴含一定的信息,能够供我们去使用。

除了顺序之外,结构还有另外一层含义。我可以对数量定义一些运算。在线性空间里面我们提到,基本的运算包括什么呢?包括加法,包括数乘,这样一些运算。有了运算之后,我们就可以对不同的对象,单个的数目放在一块儿,按照一定的顺序排列在一起,我们可以把它组成一个向量,组成这样一个对象。那么有了加法,数乘这样一些运算之后,你就可以对这个对象再来进行一些操作。这样的话,就实现了把具体事物给它抽象成数学对象,这样的一个过程。这就是线性代数最主要的一个作用。当然不光是在机器学习里面,在其他应用到线性代数的场合也是一样:把具体的事物抽象成为数学对象。
提升大规模运算的效率

当然除此之外呢,它还有另外一个优势,线性代数还有另外一个作用,就是能够提升大规模运算的效率。因为在现代的机器学习当中,我们要处理的数据都是海量的数据,数据的数量是呈指数形式的增长。我们要处理的数据越来越多,如果只是简单地说,用最传统的方法,用一个一个的 for 循环去处理高维的矩阵,它的效率肯定是相当低下。有了线性代数之后,我们可以把矩阵的运算引入到机器学习的算法当中,通过一些额外的库,或者一些额外的软件包,提升大规模运算的效率。这里面最直观的一个例子就是 MATLAB 软件。MATLAB 软件本身名字叫矩阵实验室。它的特点,或者说它的卖点就在于,对矩阵,或者说对向量它操作的高效率。

所以说呢,线性代数,我们把它总结一下,它就等于数量和结构的组合。它的作用,一方面可以把具体的事物抽象成数学对象,另外一方面,可以提升大规模运算的效率。

概率统计

利用数据学习模型
如果我们说,线性代数可以看成是数量还有结构的组合的话,那么概率统计就可以看成是模型还有数据的组合。

那么模型和数据组合在一块,实际上是双向的处理。我们机器学习有学习的阶段,我们要利用这个数据去训练这个模型,这个阶段,我们是用数据去学习这个模型。在模型里面,我们就可以去选择。有那么多的模型,像我们刚才说到的,有 K- 近邻的模型,有回归模型,有决策树,还有支持向量机,这样不同的模型。我训练的任务就是用数据来学习这些模型,来确定这个模型的参数,最终得到一个确定的模型。这就可以看成什么呢?看成是在给定数据的情况下,我来求解这个参数,它的条件概率。给定的数据,如果有一部分参数的条件概率是最大的,那么就选择这部分参数,作为我这个模型的参数。实际上,训练过程解决的就是这样一个问题。
当然具体来说,包括生成模型,包括判别模型,那么
生成模型我们求解的是输入输出的一个联合概率分布,那么判别模型是一个条件概率分布。但不管怎么样,很多情况下,我们关注的目标都是分布,那么利用数据进行训练的过程也就是学习这个分布的过程。
利用模型推断数据

接下来呢,在训练结束之后,我们要这个模型要来干什么呢?要进行预测,也就是说,利用这个模型来进行数据的推断。给定这个模型,我给到一个输入,我输入可能是一个特征,一些特征的组合,形成一个向量。我把这个输入的向量代入到模型当中,就可以求出一个结果,当然也可能是多个结果。我取这个概率最大的结果作为一个输出,这个过程就是反过来利用模型去推断数据的一个过程。所以我们说,概率统计等于模型和数据的一个组合,这个组合是双向的。在学习阶段,我们利用数据来训练模型,在预测阶段,我们利用模型反过来去推断这个数据。

所以,在概率统计这一块,我们关注的是模型的使用,还有概率的求解。当然两者不是完全区别开的,是相互融合的。在建立模型的时候,我们会利用到一些先验概率分布。在求解目标函数的时候,我们也会涉及求解数学期望这样一些操作。这里面我们也给出了一个实例,就是回归分析还有机器学习方法的比较。

最优化理论

概率统计呢,我们可以把它解释成这个模型和数据的一个组合,那么最优化的话,就可以看成是目标和约束的一个组合。在这里面,我们最优化的目标是什么呢?是求解,让这个期望函数,或者让目标函数取到最值的解,手段是什么呢?就是通过调整模型的参数来实现,为什么要调整这个模型的参数?因为很多时候,我们想求解到这个解析解是求不出来的。在很多复杂的问题当中呢,这个解析解是没有办法求出来的。对于线性回归来说,我们可以求解出 Beta 的一个表达式,那样一个矩阵相乘,求逆,再进行相乘的一个表达式。很多时候,这个解析解我们求不到,求不到怎么办?就只能一点一点去试,一步一步去找,我要的最小值或者最大值,它到底在哪?这个时候就会用到我们最优化的方法,包括梯度下降,包括其他的一些方法。

在使用这些方法的时候,我们要注意调整一些参数。一方面是模型的参数,另外一方面还有所谓的超参数。
调整模型参数,一方面,它的作用让我们找到真正的最小值,或者找到真正的最大值。另外一方面,避免在寻找的过程中把最小值,或者最大值,本来你是能找到的,但是这个超参数没有设计好,比如说我的步长、速率没有设计好,把这个点错过,要避免这样一些问题。所以说对于最优化而言,我们可以把它看成是目标,还有参数的一个组合,通过这两者来找到我们想要的合适的点。

3。需要掌握到什么程度?

刚才呢,我们结合这些实例,解释了线性代数,概率论,概率学统计,还有最优化,在机器学习当中的一些作用。接下来我们来看一看,需要掌握到什么程度。需要掌握到什么程度呢?实际上,应该说是一个见仁见智的问题。当然理想的情况肯定是掌握得越多越好,最好你能把所有的数学都掌握到,不光是我们提到的这些,甚至更加高级的你都会,这是最好的效果。当然在实际当中,我们不可能,没有那么多精力去专门地钻研到这个数学当中,所以说这种理想的情况也是不存在的。那么具体来说,掌握到什么程度呢?
机器学习的三重境界

能使用:利用已知方法解决问题

我在这里列出来了三个阶段。第一个阶段呢,我管它叫做能使用。也就是说,给定一个模型,我能够用它来根据给定的输入来求解输出,也就是利用已知的方法来解决问题。那么这个已知的方法,我可以把它看成一个黑箱子,我不关注这个过程,不关注这个方法是如何解决问题,只要能够解决问题就行。可能已经有了一个算法,那么我只需要对数据做一些处理,把这个数据送入到算法当中,得到一个输出,我能看明白这个输出是怎么回事,这就可以。这是能使用的阶段,我只是做一个算法的使用者,我能把它用清楚就够了。

能看懂:理解已知方法的工作原理

如果在能使用的基础上再进一步,那么就是能看懂,我不光用这个已知的方法来解决问题,同时我还能够理解这个方法的工作原理。知其然,还能知其所以然。能使用就是知其然,能看懂就是知其所以然。那么这个方法可能背后有一些数学推导,会涉及到一些概率,最优化,还有线性代数的一些使用。那么这个能看懂,就要求你具备相关的知识,能够把这个推导的过程给它顺下来,知道这个方法具体是怎么来工作。

能设计:根据问题特征开发新方法

如果在这个能看懂的基础上,再进一步的话,我们可以把它叫做能设计。我把已知方法理解之后,我还可以根据我的问题,根据我自己的实际问题的特点,来开发一些新的方法。要么呢,可以对已知的方法我来做一些改进,使它更符合我自己的一个待解决问题的方法,或者说我开发一个完全新的方法,就是重新推导,推倒重来,直接设计一个新的方法。那么很显然,这个呢,对于数学功底就有更深层次的一个要求。
所以我们说对于数学的掌握程度包括这样的三个层次,能使用,能看懂,还能设计。那么具体在实际当中,你需要做到哪个程度,那么就要根据自己的实际情况来做出判断。
如何尽快、高效率掌握数学知识?
掌握核心概念
在这方面,我给出的建议是,一方面是,我们要握核心概念,在线性代数当中核心概念是什么?就是线性空间,向量矩阵以及对于向量矩阵的度量,包括范数、包括内积这些,这些就是它的核心概念。那么在概率统计当中,频率学派,还有贝叶斯学派,他们两者之间的区别是一个核心概念,同时呢,像期望方差这些指标,还有条件概率,这样的一些概念,条件概率联合概率这样一些概念也是核心概念。那么在最优化当中,这些算法,这个梯度下降法,或者牛顿法,这就是核心概念。
以点带面
在时间有限的情况下,我们一定要把有限的精力集中在重要的知识上。先把这些核心概念搞清楚,再通过这些核心的概念,来以点代面,从这些关键的问题去铺开,慢慢地去接触其他的问题。
问题导向
最后一点呢,我觉得,在学习的时候,我们可以以问题为导向,就是结合着我们实际的需求,结合我们实际的问题,来决定我们去学什么。这个呢,和我们前面所说到的这个掌握到什么程度也是一样,掌握到什么程度也是相通的。因为毕竟我们学习,机器学习,学习机器学习当中的数学都是为了解决问题。如果不能解决问题的话,你学到的这个东西的价值就没有能够解决问题的这个知识的价值大。当然我们也不能说一点价值都没有。在学习的时候,大家可以尝试着以问题为导向。带着问题去探索这些知识,带着问题去学习知识,可能你会发现,这样会得到更高的效率。

4 推荐书目

推荐书目在我们专栏里面也有相应的推送。在基础数学,基础学习,神经网络,还有深度学习,每个模块我们结束之后都会推荐一些相关的书籍。但是在这里,我想要跟大家推荐的两本书,都是关于机器学习,或者说都是关于统计学习,一本叫 An Introduction Statistical to Learning ,另一本叫 The Elements of Statistical Learning 。
两本书的作者是同一拨人,有两个共同的作者。它们讲述的都是统计学习,或者机器学习的方法。其中前一本可以看成是后一本的简化版。它更通俗、更简单一些,后面这个稍微有些难。为什么推荐这两本呢?因为这两本,它更深入的会挖掘方法背后的一些数学含义。我们能够看到的教科书,它主要的作用是把这个方法讲清楚。来了个方法,比如说线性回归,怎么推导,怎么区算,一大堆公式写出来,那么给出一个推导的结果,或者说决策树,或者其他的算法都一样,可能到这里就结束了,我的任务就完成了。
这两本书,它不光是介绍方法推导,它可能更看中统计学上的意义。我们为什么要这么做,我们设计这个方法在统计学上有什么意义。因为作者都是统计学家,有几十年的积淀,有几十年的研究积淀,所以,相比于其他市面上教科书,我认为他们两个 insight 可能更多一些。当然了,大家看起来,也会有相应的难度,可能并不是像我们平时的教科书那么简单。这些书,我们一遍两遍是读不完的,如果真正要从事人工智能、机器学习这方面的工作的话,可能要多读几遍,每读一遍也会有不同的收获。

转载:https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2651006267&idx=1&sn=111a37f9b8674f56f523bc623efc9a00&chksm=bdbedd688ac9547e446649b3ca3f0d5a6ab1c19b6c0ef9fbb1d691e1fb70321b02dafb342a20&mpshare=1&scene=23&srcid=0319MECGh9jCsNEVmaktu5NX#rd

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容