news 2026/4/15 22:30:11

使用 Python 进行基于马尔可夫链的动手职业路径建模

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Python 进行基于马尔可夫链的动手职业路径建模

原文:towardsdatascience.com/hands-on-career-path-modelling-using-markov-chain-with-python-022f09090c31

从职业角度来看,我是个非常奇怪的人:我在一家初创公司担任软件/机器学习工程师,我拥有物理学硕士学位,我即将为我的航空航天与机械工程博士学位答辩。在我的不断变化的职业生涯中,有两件事保持不变:我对科学的热爱和我对编程的热情。

将科学和编程结合在一起的一个美妙方式是通过建模。我的意思是,为了描述世界,你基于对现实的一定程度的近似做出合理的假设。基于这个假设和你的起始近似,我们可以模拟一个给定过程。模拟将给出一些结果,这些结果源于原始假设,但在模拟之前并不完全可预测。

例如,让我们假设我们正在试图弄清楚一个围栏能容纳多少头牛。物理学家会做出的一个相当奇怪的假设如下:

“让我们考虑一个正方形牛”

意味着我们将牛的形状近似为正方形。然后我们将围栏近似为一个更大的正方形(这个假设更加合理)。

现在,让我们给这个问题加一点盐,让我们考虑牛可以有随机的长度,这意味着正方形的大小对每头牛来说都不相同,而且每个正方形长度的分布是高斯分布的结果,均值为 2,方差为 1。让我们假设围栏的长度为 L=10。

为了解决这个问题,我们必须进行一个非常简单的蒙特卡洛模拟。我们不断地在 10×10 平方的围栏内添加正方形牛,看看我们是否遇到问题,因为我们不能无限制地添加它们。我们重复这个过程 N=1000 次,然后提取牛的数量平均值。

现在,很明显,这是一种计算围栏能容纳多少头牛的相当粗糙的方法,实际上这在物理学界是一个著名的笑话。尽管如此,它完美地描述了建模的方法。现在我非常喜欢人工智能。我每天都在学习和从事人工智能工作,而且我从 2019 年开始就是这样做的。不过,我对人工智能有一点不同意见,那就是由于人工智能,我们不再需要建模了。我们可以直接训练一个机器学习模型。**这是错误的(而且有点令人难过)。**我们需要建模,因为建模是我们理解周围世界的基础。

希望通过一些正方形牛和一些同情心,我让你相信建模很酷。

在这篇博客文章中,我将使用一个非常强大的建模工具,名为马尔可夫链,来模拟个人的职业****发展。我们将从一个刚刚毕业的人开始,并给出一些关于他们未来会做什么的概率假设。通过将这些假设输入到马尔可夫链模型中,我们将得到个人职业结果分布。让我们开始吧!

0. 马尔可夫链简介

如果你们中的一些人已经阅读过我的某些文章(谢谢,我爱你,你们是最好的 ❤),你们已经知道我喜欢马尔可夫链。如果你熟悉马尔可夫链,你可以安全地跳过这部分。

如果你对马尔可夫链不熟悉,在这篇文章中,我以一般性的方式讨论了它们,并且根据我谦逊的观点,这是一份很好的指南,对于那些之前从未听说过马尔可夫链的人来说,想要了解其精髓。

实际上,对于这篇博客文章,我们不需要了解很多马尔可夫链,因为它相当注重代码,但不是非常理论,所以我将非常快速地描述它是如何工作的。为了简洁起见,我将用职业发展的例子来精确描述这一点。

让我们考虑一个随机事件E。这个事件可以在时间 t=0、t=1、t=n 发生。在这些时间中的每一个(1 到 n),事件可以取不同的值。例如,在 t=2(意味着 2 年后),这个人可能正在攻读学士学位。我们用数学表达式来表示这一点:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/78a371939538915fa759e0ef0d0b00fa.png

作者图片

现在,一个人在 5 年后正在学习,给定在年份=2 时这个人正在攻读学士学位的概率是多少?马尔可夫链的假设告诉我们,为了知道这一点,只需要知道前一年的情况,例如,以下表达式:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/371a8eb522aedc7aa07050118f1b3e96.png

告诉我们,如果一个人在第一年攻读学士学位,他们继续攻读学士学位的概率相当高(0.8)。

我们可以在第 3 年、第 4 年、第 5 年之后做同样的事情,只需考虑第 2 年、第 3 年和第 4 年的事件。因此,我们称之为

现在,这并不特别有趣,但我们可以问自己:10 年后这个人被雇佣的概率是多少?这将是在时间 t=10 时所有其他事件(有学士学位的人、有硕士学位的人、没有学士学位的人等)的总和(总和)。

这将是我们的模拟的核心。

1. 我们的模拟假设

对于这个案例研究,我列出了一份可能的职业选择列表,考虑到一个刚刚从高中毕业的人的起点。

这个人可以做:

  • 完全不上大学

  • 上大学

如果他们上大学,他们可以做:

  • 去常春藤联盟大学,

  • 去州立大学,

  • 去社区学院。

对于他们中的每一个人,他们可以去:

  • 科学、技术、工程和数学(STEM)

  • 商业

  • 人文科学

之后,他们可以选择是否获得实习,或者不获得实习。无论哪种方式,之后他们都可以被雇佣或失业。这是路径,这是它的样子:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/06d8a44578fdee16de6cf8d40e2c9fa8.png

作者制作的照片

现在,每个黑色圆圈(以及最后的红色方块)都配备了一个概率级别,这是在给定前一个状态下到达给定状态的概率。例如,常春藤联盟可能配备了概率=0.2,这意味着,鉴于我们去了大学(前一个节点),我们也将去常春藤联盟大学。在图像中,我为了简洁省略了学习专业(人文、STEM 或商业)。

每个黑色圆圈也都有一个持续时间。***“不去上大学”的持续时间是 0,因为它是一个立即寻找工作/实习的决定,而“常春藤联盟”***的持续时间是 4。红色方块有一个“薪水”,正如现实生活中一样,它根据前面的节点而变化。例如,没有任何学位的人(平均来说)会比有实习的常春藤联盟学生赚得少。当然,“失业”的薪水是 0。

请注意!!! 这些是我的模拟假设。请随意根据您认为与您具体情况更相关的假设进行更改。

现在,我们能用这些数据做什么呢?很多事情。但简而言之,我们可以在我们的 Python 系统中运行模拟并分析响应。这被称为蒙特卡洛方法

2. 蒙特卡洛模拟

一切看起来都很完美,但我们需要将数据数字化,而不仅仅是文字。首先,我们需要找到模拟数据的一个格式。有很多方法可以做到这一点:定义二叉树,定义图,定义表格,…

我为了简单起见,将这些数据存储在一个.json 文件中。我这样做是因为通过 json 文件导航的简单性,它在 Python 变量中变成了字典。

这是.json 文件:

{"HighSchoolGraduate":{"GoToCollege":{"probability":0.7,"duration":0,"IvyLeague":{"probability":0.1,"duration":4,"STEM":{"probability":0.4,"WithInternship":{"probability":0.7,"duration":0,"Employed":{"probability":0.99,"AvgSalary":120000},"Unemployed":{"probability":0.01}},"WithoutInternship":{"probability":0.3,"duration":0,"Employed":{"probability":0.9,"AvgSalary":110000},"Unemployed":{"probability":0.1}}},"Humanities":{"probability":0.3,"WithInternship":{"probability":0.7,"duration":0,"Employed":{"probability":0.97,"AvgSalary":90000},"Unemployed":{"probability":0.03}},"WithoutInternship":{"probability":0.3,"duration":0,"Employed":{"probability":0.85,"AvgSalary":80000},"Unemployed":{"probability":0.15}}},"Business":{"probability":0.3,"WithInternship":{"probability":0.7,"duration":0,"Employed":{"probability":0.98,"AvgSalary":100000},"Unemployed":{"probability":0.02}},"WithoutInternship":{"probability":0.3,"duration":0,"Employed":{"probability":0.88,"AvgSalary":90000},"Unemployed":{"probability":0.12}}}},"StateUniversity":{"probability":0.5,"duration":4,"STEM":{"probability":0.4,"WithInternship":{"probability":0.7,"duration":0,"Employed":{"probability":0.97,"AvgSalary":80000},"Unemployed":{"probability":0.03}},"WithoutInternship":{"probability":0.3,"duration":0,"Employed":{"probability":0.9,"AvgSalary":70000},"Unemployed":{"probability":0.1}}},"Humanities":{"probability":0.3,"WithInternship":{"probability":0.7,"duration":0,"Employed":{"probability":0.95,"AvgSalary":60000},"Unemployed":{"probability":0.05}},"WithoutInternship":{"probability":0.3,"duration":0,"Employed":{"probability":0.85,"AvgSalary":50000},"Unemployed":{"probability":0.15}}},"Business":{"probability":0.3,"WithInternship":{"probability":0.7,"duration":0,"Employed":{"probability":0.96,"AvgSalary":75000},"Unemployed":{"probability":0.04}},"WithoutInternship":{"probability":0.3,"duration":0,"Employed":{"probability":0.87,"AvgSalary":65000},"Unemployed":{"probability":0.13}}}},"CommunityCollege":{"probability":0.4,"duration":2,"Employed":{"probability":0.92,"AvgSalary":50000},"Unemployed":{"probability":0.08}}},"DoNotGoToCollege":{"probability":0.3,"duration":0,"Employed":{"probability":0.85,"AvgSalary":35000},"Unemployed":{"probability":0.15}}}}

现在你可能会问…我是从真实数据库中获取这些数字的吗绝对不是。这些数字完全是随机的,你可以进行自己的研究/实验。在我的假设中,我确保每个路径级别的概率总和为 1(这是强制性的),并且教育最长的持续时间对应于平均薪水最高的,这意味着如果你待的时间更长,那么在就业的情况下,平均来说你会赚更多的钱。

将此文件保存为您喜欢的名称。我充分发挥创意,选择了以下名称:

career_decision_tree.json

但你可以选择你喜欢的名称。只是别忘了它。 🙂

我们模拟的目标是从 JSON 文件中检索以下我手动注入的考虑因素,这些因素在现实生活中,你会从你的统计数据中找到:

  • 更长时间的教育意味着更高的高薪机会

  • 没有教育意味着更高的失业机会

  • 更著名的大学导致更高的薪资和更高的就业概率

这合理吗?也许吧,也许不合理。关键是我们要从模拟中找到这种类型的响应(事后)。

2.1 实施方案

现在,我们如何在马尔可夫链上运行 1k、10k、100k 次模拟?让我们一步步来做。首先,我们需要导入所需的库。没有什么特别的,我喜欢用seaborn进行绘图,但这并不是必需的。我相信其他库已经在 Anaconda 包中。如果不是,一个非常简单的 pip install 就能解决问题 😃

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F3%26cellId%3D0&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F3%26cellId%3D0&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1719880338076&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

让我们用这一行非常简单的代码来加载 json 文件:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F3%26cellId%3D1&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F3%26cellId%3D1&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1719880338076&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

现在,让我们从头到尾运行整个过程,从头部(高中毕业生,绿色节点)到脚部(就业/失业,红色节点)。当我们遍历我们的树时,我们保存持续时间薪水路径。由于.json 文件中的薪水只是一个“平均”薪水,我们添加了一些“噪声”,即在 AvgSalary 的-10%到+10%之间添加一些数值(可能更多,根据您的喜好调整)。当然,如果我们运气不好,最终失业,最终的薪水将是 0。我还将最低薪水设置为 24k。

这是运行代码:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F5%26cellId%3D3&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F5%26cellId%3D3&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1719882385130&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

现在,我们可以运行马尔可夫链,比如说运行 100k 次,只需要几秒钟:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F6%26cellId%3D4&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F6%26cellId%3D4&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1719964795084&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

我已经将案例分为那些毕业后找到工作和那些没有找到工作的人。

2.2 就业/失业

第一个有趣的问题是***“就业/失业的百分比是多少”***?当然,根据我们在 json 文件中设定的概率,失业人数将低于就业人数。这是因为,无论你是否上大学,找到工作的概率都高于 0.5…

Jovian Notebook

作者制作的照片

因此,总的来说,正如预期的那样,失业率很低。尽管如此,如果你没有上大学,失业率大约是上大学时的两倍:

Jovian Notebook

作者制作的照片

如果你没有上大学,失业的概率大约是 15%,如果你上了大学,概率是 7%。

2.3 与时间相关的统计数据

让我们获取一些更多与时间相关的统计数据。再次,让我们将人口分为就业和失业:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D8&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D8&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1722034594033&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

让我们看看这些人学习了多少年。

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D9&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D9&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1722034594033&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

作者制作的照片

因此,大多数上大学并就业的人学习了 4 年。另一方面,大多数失业的人根本没上过大学(这一点我们已经知道了)。

2.4 基于薪水的统计数据

那么,学习 0-2 年或 4 年有明显的优势吗?在薪水方面有明显的差异:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D11&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D11&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1722034594033&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

作者制作的照片

学习了 2 年的人最高收入为 60k,而如果你学习了 4 年,你可以达到 140k。

清晰地看待它的方法:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D12&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fcareernotebook%2Fv%2F16%26cellId%3D12&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2Fb53d5eb9577f405ab1103775b4fad651%2Fpreview%2F826b8603065e4253838028799dff84b6%3Fts%3D1722034594033&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

作者制作的照片

记住一件事:这些数字是虚构的,所以它们本身没有任何意义本身。然而,令人印象深刻的是,我们可以通过运行马尔可夫链并提取模拟结果来事后推断它们。

在这种情况下,这些虚构的数字告诉我们以下故事:你在学习 2 年后或 4 年后找到工作的可能性几乎一样,但如果你学习时间更长,你赚更多钱的机会就更大,因为工资分布倾向于为学士学位的人提供更高的金额。

3. 结论

在这篇博客文章中,我们深入探讨了使用马尔可夫链进行职业路径建模的迷人世界,以 Python 的实际操作方法进行。我们从建模的基础开始,强调它是如何结合科学和编码来近似现实世界过程的。通过模拟马尔可夫链,我们探讨了不同的教育和职业选择如何影响个人的未来就业前景和薪资。

这里是对我们做了什么的快速回顾:

  1. 马尔可夫链简介:我们简要介绍了马尔可夫链及其如何用于模拟随机过程,特别是关注职业发展。

  2. 模拟假设:我们定义了一系列从高中毕业开始的职业路径,包括各种教育和职业选择,每个选择都分配了概率和持续时间。我们将这些数据存储在一个.json 文件中,以便于访问和操作。

  3. 蒙特卡洛模拟:使用假设和数据,我们进行了多次蒙特卡洛模拟,以查看不同的职业路径如何发展。我们生成了关于就业概率、教育持续时间以及薪资分布的统计数据。

  4. 分析:我们分析了模拟的结果,观察了诸如高等教育对薪资和就业概率的影响等趋势。我们利用这些见解来验证我们的模型假设。

  5. 可视化:在整个帖子中,我们使用了各种图表来可视化模拟的结果,这使得理解不同职业选择的影响变得更容易。

4. 关于我!

再次感谢你花时间。这对我们意义重大 ❤

我叫 Piero Paialunga,就是我这个人:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5c49ced9d71ee7f31d6c3cc411e6de66.png

图像由作者制作

我是辛辛那提大学航空航天工程系的博士研究生,同时也是 Gen Nine 的机器学习工程师。我在博客文章和领英上谈论人工智能和机器学习。如果你喜欢这篇文章,并想了解更多关于机器学习的内容,以及跟随我的研究,你可以:

A. 在**领英上关注我,我在那里发布所有故事 B. 订阅我的通讯。这将让你了解新故事,并有机会给我发信息,以接收你可能有的所有更正或疑问。 C. 成为推荐会员,这样你就不会有“每月故事数量上限”的限制,你可以阅读我(以及成千上万的机器学习和数据科学顶级作家)关于最新技术的所有文章。 D. 想和我合作?查看我的收费和项目在Upwork**!

如果你想要问我问题或者开始合作,请在这里或者**领英**上留言:

[email protected]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:39:14

Python+Vue的流浪动物管理系统_ Pycharm django flask

这里写目录标题项目介绍项目展示详细视频演示感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人技术栈文章下方名片联系我即可~解决的思路…

作者头像 李华
网站建设 2026/4/16 15:30:38

使用 Python 进行遗传算法的动手优化

原文:towardsdatascience.com/hands-on-optimization-using-genetic-algorithms-with-python-bb7970dbbf0a 你听说过这个销售策略吗? “你在 X 上浪费了几个小时吗?为什么不试试 Y?” 我确信你做到了。例如:“不要花几…

作者头像 李华
网站建设 2026/4/16 10:41:10

LobeChat CORS跨域问题解决全攻略

LobeChat CORS跨域问题解决全攻略 在构建现代 AI 聊天应用时,LobeChat 已成为许多开发者的首选前端界面。它不仅拥有媲美主流商业产品的交互体验,还支持灵活接入 OpenAI、Ollama、LocalAI 等多种模型后端。然而,当我们将 LobeChat 部署为独立…

作者头像 李华
网站建设 2026/4/16 1:22:39

LobeChat如何实现多租户隔离?适用于企业多部门协作

LobeChat 如何实现多租户隔离?适用于企业多部门协作 在企业数字化转型的浪潮中,AI 聊天系统早已不再是“锦上添花”的功能模块,而是支撑运营效率的核心工具。从研发团队调试本地大模型,到市场部批量生成推广文案,再到 …

作者头像 李华
网站建设 2026/4/16 2:40:39

超细整理,性能测试如何做?怎么做?常见面试题(汇总六)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 【性能概念、并发…

作者头像 李华
网站建设 2026/4/16 15:32:45

全场普跌,只剩套利还发糖

// 基金套利 //白银基金LOF今天溢价继续在20%高位维持,没啥好犹豫的直接发车,套到没溢价为止,套得早的现在一个账户收益应该有200以上。明天白银基金LOF又要停牌1小时,10:30才能交易,深市可以提前委托。盘中实时溢价可…

作者头像 李华