中ridge_10种线性代数在数据科学中的强大应用(内附多种资源)

原文选自 | Analytics Vidhya

作者 | Khyati Mahendru

本文转载自 TalkingData数据学堂 ,未经允许禁止转载

本文摘要

  • 线性代数为各种各样的数据科学算法和应用提供支持

  • 在这里,我会向您介绍通过线性代数帮助您成为更好的数据科学家的10种实际应用

  • 我们已将这些应用程序分类到各个领域 - 基本机器学习,降维,自然语言处理和计算机视觉

介绍

如果数据科学是蝙蝠侠,线性代数将是罗宾。这种忠实的伙伴经常被忽视。但实际上,它支持数据科学的主要领域,包括自然语言处理和计算机视觉等热门领域。

我个人看到很多数据科学爱好者选择跳过这个主题,因为他们发现数学太难理解了。当数据科学的编程语言提供了大量用于处理数据的软件包时,人们并不会对线性代数感到烦恼。

但这是个错觉。我们熟悉的所有强大的机器学习算法的背后都是线性代数。它是数据科学家技能的重要组成部分。我们很快就会看到,您应该将线性代数视为学习数据科学必须掌握的主题。

a5be810924aedb3098b1526e11875c9a.png

相信我,线性代数真的是无处不在!它将开启您以前无法想象的数据的可操作的可能性。

在本文中,我详细解释了十大线性代数在数据科学中的应用。我将应用大致分为四个领域供您参考:

  • 机器学习

  • 维度降低

  • 自然语言处理(NLP)

  • 计算机视觉

我还为每个应用提供了资源,您可以深入了解您感兴趣的那个应用。

注意:在您继续阅读之前,我建议您阅读这篇精湛的文章 - 数据科学的线性代数。理解我们将在这里介绍的内容并不是强制性的,但它对于您技能的进步来说是一篇很有价值的文章。

目录

  • 为什么学习线性代数?

  • 机器学习中的线性代数

    • 损失函数

    • 正则

    • 协方差矩阵

    • 支持向量机分类

  • 维数降维中的线性代数

    • 主成分分析(PCA)

    • 奇异值分解(SVD)

  • 自然语言处理中的线性代数

    • Word嵌入

    • 潜在语义分析

  • 计算机视觉中的线性代数

    • 图像表示作为张量

    • 卷积和图像处理

为什么学习线性代数?

我曾经多次遇到过这个问题。当你只需用Python导入包并构建模型时,为什么要花时间学习线性代数?

我认为线性代数是数据科学的基础之一。没有坚实的基础,你无法建造一座摩天大楼,对吗?想想这种情况:

您希望使用主成分分析(PCA)来减少数据维度。如果您不知道它将如何影响您的数据,您将如何决定要保留多少主要组件?显然,您需要真正了解算法的机制才能做出此决定。

通过对线性代数的理解,您将能够更加了解机器学习和深度学习算法,这将允许您选择适当的超参数并开发更好的模型。

您还可以从头开始编写算法,并对它们进行自己的变换。这不是我们最初喜欢数据科学的原因吗?那我们需要将线性代数视为解锁一个全新世界的关键。

机器学习中的线性代数

最大的问题 - 线性代数都适合机器学习的哪些部分?让我们来看看你们都非常熟悉的四个应用。

1.损失函数

您必须非常熟悉模型(如线性回归模型)如何拟合给定数据:

  • 您从一些任意预测函数开始(线性回归模型的线性函数)

  • 在数据的独立功能上使用它来预测输出

  • 计算预测输出与实际输出的距离

  • 使用这些计算值可以使用Gradient Descent等策略优化预测函数

但是等等 - 您如何计算预测与预期输出的差异?用损失函数。

亏损函数是Vector Norm在线性代数中的应用。矢量的范数可以简单地说就是它的大小。有许多类型的矢量规范。我会很快解释其中两个:

  • L1范数:也称为曼哈顿距离或出租车标准。如果从原点到矢量,如果唯一允许的方向与空间轴平行,则L1范数是您行进的距离。

56c3f3f2766ce399cbb7f88673a3479b.png

在这个2D空间中,您可以通过沿x轴行进3个单位然后沿y轴平行移动4个单位(如图所示)到达矢量(3,4)。或者您可以先沿y轴行进4个单位,然后沿x轴行进3个单位。在任何一种情况下,您将共旅行7个单位。

  •  L2范数:也称为欧几里德距离。L2 范数是矢量距原点的最短距离,如下图中的红色路径所示:

6a43326234fe7163185998cf319af0cd.png

这个距离是用毕达哥拉斯定理计算的。它是(3 ^ 2 + 4 ^ 2)的平方根,等于5。

但是,常规如何用于找出预测值与预期值之间的差异?假设预测值存储在矢量P中,并且期望值存储在矢量E中。然后PE是差异向量。PE的标准是预测的总损失。

2.正则化

正则化是数据科学中非常重要的概念。这是我们用来防止模型过度拟合的技术。正则化实际上是规范的另一个应用。

据说一个模型在适合训练数据时过度拟合。这样的模型对新数据表现不佳,因为它甚至已经学习了训练数据中的噪声。它无法概括之前从未见过的数据。下面的插图总结了这个想法:

4f68bfceee40e1124289c829957b162d.png

正则化通过将权重向量的范数添加到成本函数来惩罚过于复杂的模型。由于我们希望最小化成本函数,因此我们需要最小化此规范。这导致权重向量的不需要的分量减少到零并且防止预测功能过于复杂。

您可以阅读以下文章,了解正则化背后的完整数学原理:

    如何避免过度拟合使用正则化(见下方链接)

https://www.analyticsvidhya.com/blog/2015/02/avoid-over-fitting-regularization/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

我们上面讨论的L1和L2规范用于两种类型的正则化:

  • L1正则化与Lasso 回归一起使用

  • L2正则化与岭回归一起使用

请参阅我们关于Python中的Ridge和Lasso回归的完整教程(见下方链接),以了解有关这些概念的更多信息。

https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-ridge-lasso-regression-python/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

3.协方差矩阵

双变量分析是数据探索中的重要一步。我们想研究变量对之间的关系。协方差或相关性是用于研究两个连续变量之间的关系的度量。

协方差表示变量之间线性关系的方向。正协方差表示一个变量的增加或减少的同时,另一个变量发生了相同的变化。负协方差表明一个变量的增加或减少伴随另一个变量相反的变化。

fb97a04ff37107b38aff5b4f6fb5b2dc.png

另一方面,相关性是协方差的标准化值。相关值告诉我们线性关系的强度和方向,范围从-1到1。

现在,您可能会认为这是统计学而非线性代数的概念。好吧,记得我告诉过你线性代数是无处不在的吗?使用线性代数中的转置和矩阵乘法的概念,我们对协方差矩阵有一个非常简洁的表达式:

7d5c6d992ee10106fb02748981d65c3d.png

这里,X是包含所有数字特征的标准化数据矩阵。

我鼓励您阅读我们的数据探索完整教程(见下方链接),以了解有关协方差矩阵,双变量分析以及探索性数据分析中涉及的其他步骤的更多信息。

https://www.analyticsvidhya.com/blog/2016/01/guide-data-exploration/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

4.支持向量机分类

支持向量机,是最常见的分类算法之一,经常产生令人印象深刻的结果。它是矢量空间概念在线性代数中的应用。

支持向量机或SVM,是一种判别分类器,通过查找决策面来工作。它是一种有监督的机器学习算法。

在此算法中,我们将每个数据项绘制为n维空间中的点(其中n是您已知的要素数),每个要素的值是特定坐标的值。然后,我们通过找到非常好地区分两个类的超平面来进行分类,即具有最大余量,在这种情况下是C.

21da00d8869663e129fe4b58f699baff.png

超平面是一个子空间,其维数比其对应的向量空间小1,因此它将是2D向量空间的直线,3D向量空间的2D平面等等。再次使用Vector Norm来计算边际。

但是,如果数据不能像下面的情况那样线性分离呢?

94bcbd239a09069de444b15fd4c63b02.png

我们的直觉说决策面必须是圆形或椭圆形,对吧?但你怎么找到它?在这里,内核转换的概念发挥作用。在线性代数中,从一个空间转换到另一个空间的想法非常普遍。

让我们介绍一个变量z = x ^ 2 + y ^ 2。如果我们沿z轴和x轴绘制数据,这就是数据的外观:

cb8a83540a381a4eecb0374e9d9facfb.png

现在,这显然可以通过线z = a进行线性分离,其中a是一些正常数。在转换回原始空间时,我们得到x ^ 2 + y ^ 2 = a作为决策面,这是一个圆圈!

6b3cdb97c9216963cd2fa57cdcc3e189.png

最好的是,我们不需要自己添加其他功能。SVM有一种称为内核技巧的技术。阅读有关支持向量机的这篇文章(见下方链接),了解SVM,内核技巧以及如何在Python中实现它。

https://www.analyticsvidhya.com/blog/2017/09/understaing-support-vector-machine-example-code/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

维度降低

您将经常使用具有数百甚至数千个变量的数据集。这就是行业运作的方式。对每个变量进行查看并确定哪个变量更切合实际是有必要的么?

这没有多大意义。我们需要降低变量的数量来执行任何类型的连贯分析。这就是维数减少的原因。现在,我们来看看这里常用的两种降维方法。

5.主成分分析(PCA)

主成分分析(PCA)是一种无监督降维技术。PCA找到最大方差的方向并沿着它们投影数据以减小尺寸。

在不使用数学的情况下,这些方向是数据的协方差矩阵的特征向量。

67ddef6a4db501bfb88c2b59b4845356.png

方阵的特征向量是特殊的非零向量,即使在对矩阵应用线性变换(乘法)之后,其方向也不会改变。它们显示为下图中的红色矢量:

63802b65ae01e0bc79a621b8143cd586.png

您可以使用scikit-learn包中的PCA类轻松地在Python中实现PCA:

86b1fc22bb0fe9be7d6b64373ec0ef62.png

我在sklearn 的Digits数据集上应用了PCA - 一组8×8手写数字图像。我获得的图像令人印象深刻,数字看起来似乎很好地聚集在一起:

299a861c19fcfd752489283d14357f6e.png

请参阅我们的用Python代码进行12种降维技术综合指南(见下方链接),深入了解PCA和其他11种降维技术。这是关于这个主题的最好的文章之一。

https://www.analyticsvidhya.com/blog/2018/08/dimensionality-reduction-techniques-python/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science 

6.奇异值分解

在我看来,奇异值分解(SVD)被低估了,没有获得足够多的讨论。这是一种令人惊叹的矩阵分解技术,具有多种应用。我将在以后的文章中尝试介绍其中的一些内容。

现在,让我们谈谈维度降低中的SVD。具体而言,这称为截断SVD。

  • 我们从大的mxn数值数据矩阵A开始,其中m是行数,n是特征的数量

  • 将其分解为3个矩阵,如下所示:

bf5038e2080284b6c3e1b4287e84d61a.png

                                                资料来源:hadrienj.github.io

  • 根据对角矩阵选择k个奇异值,并相应地截断(修剪)3个矩阵:

f80a5fab24c5a3cd11570d10d1194025.png资料来源:researchgate.net
  • 最后,将截断的矩阵相乘以获得变换后的矩阵A_k。它的尺寸为mx k。因此,它具有k

以下是在Python中实现截断的SVD的代码(它与PCA非常相似):

ab0e083d96607f634b0607bf96c23123.png

在将截断的SVD应用于Digits数据时,我得到了下面的图。您会注意到它不像我们在PCA之后获得的那样集群:

9ae76da6cad915263673822365c42059.png

自然语言处理(NLP)

自然语言处理(NLP)是目前数据科学领域最热门的领域。这主要取决于过去18个月的重大突破。如果您还未决定选择哪个分支 - 您应该强烈考虑NLP。

让我们看一下NLP中线性代数的几个有趣的应用。这应该有助于你进行决定!

7. Word嵌入

机器学习算法不适用于原始文本数据。我们需要将文本转换为一些数字和统计特征来创建模型输入。文本数据中有许多使用工程特征的方法,例如:

  1. 文本的元属性,如字数,特殊字符数等。

  2. 使用词性标签和语法关系(如专有名词的数量)的文本的NLP属性

  3. Word矢量符号或Word嵌入

Word嵌入是一种将单词表示为数字的低维向量同时在文档中保留其上下文的方式。这些表示是通过在大量文本上训练不同的神经网络而获得的,这些文本被称为语料库。它们还有助于分析单词之间的句法相似性:

368cc1605631544619fea364ed6f7006.png

Word2Vec和GloVe是两种最受欢迎的用来创建Word曲面嵌入的模型。

在使用Word2Vec进行一些轻度预处理后,我在莎士比亚语料库上训练了我的模型,并获得了“世界”这个词的嵌入词:

246a241dfdeabf4bc21f3001dc8a92cb.png

太酷了!但更棒的是我获得了下面的这张图。观察到语法相似的单词会彼此更加接近。我圈出了一些这样的词汇。结果并不完美,但仍然非常惊人:

b3cc18880c4df5f6ea7d69371044f4f1.png

还有其他几种获取Word嵌入的方法。阅读我们的文章直观了解Word嵌入:从计数向量到Word2Vec。(见下方链接)

https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

8.潜在语义分析(LSA)

当你听到这组话语时,你首先想到的是什么 - “王子,王室,国王,贵族”?这些非常不同的词几乎是同义词。

现在,考虑以下句子:

  • 主队的投手似乎身体不适

  • 桌上有一罐果汁可供您享用

(投手和罐子的英文都是pitcher)

“pitcher”这个词基于句子的语境会有不同的含义。

这些单词对于我们人类来说很容易通过多年的语言经验来解释。但是机器怎么办?在这里,主题模型的NLP概念发挥作用:

0a866df7d038e4c2ef8c553b86b6f430.png

主题模型是一种无监督的技术,可以在各种文本文档中查找主题。这些主题只不过是相关单词的集群。每个文档可以有多个主题。主题模型输出各种主题,它们在每个文档中的分布以及它包含的不同单词的频率。

潜在语义分析(LSA)或潜在语义索引是主题建模的技术之一。它是奇异值分解的另一种应用。

潜在意味着'隐藏'。正如其名称一样,LSA试图通过利用单词周围的上下文从文档中捕获隐藏的主题。

我将简要介绍LSA中的步骤,因此请确保使用Python中的代码查看使用潜在语义分析的主题建模的简介(见下方链接),以便进行适当和深入的理解。

https://www.analyticsvidhya.com/blog/2018/10/stepwise-guide-topic-modeling-latent-semantic-analysis/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

  • 首先,为您的数据生成Document-Term矩阵

  • 使用SVD将矩阵分解为3个矩阵:

    • 文档主题矩阵

    • 主题重要性对角矩阵

    • 主题词矩阵

  • 根据主题的重要性截断矩阵

0b085de07d6e0bda4fcf88ff1df21629.png

有关自然语言处理的实践经验,您可以查看我们的课程用Python处理NLP。该课程对初学者友好,您将构建5个真实生活中的项目!

计算机视觉

深度学习的另一个领域是计算机视觉。如果您希望将技能组扩展到表格数据之外,那么请学习如何使用图像。

这将拓宽您目前对机器学习的理解,并帮助您快拿下面试。

9.图像表示为张量

您如何解释计算机视觉中的“视觉”?显然,计算机不像人类那样处理图像。就像我之前提到的,机器学习算法需要使用数字特征。

数字图像由称为像素的小不可分割单元组成。请看下图:

a55763b1540a0be667bd4c9c986e5367.png

这个灰度图像数字零的由8×8 = 64个像素。每个像素的值在0到255的范围内。值0表示黑色像素,255表示白色像素。

mxn灰度图像可以表示为具有m行和n列的2D矩阵,其中单元格包含相应的像素值:

d321182abb6df5e118bb15bf038ff54d.png

但彩色图像怎么样?彩色图像通常存储在RGB系统中。每个图像可以被认为是由三个2D矩阵表示,R,G和B通道各有一个。R通道中的像素值0表示红色的零强度,255表示红色的全强度。

然后,每个像素值是三个通道中相应值的组合:

0381170c2d7763bee2dbe93a122df0c8.png

实际上,不是使用3个矩阵来表示图像,而是使用张量。张量是广义的n维矩阵。对于RGB图像,使用第三有序张量。想象一下,三个二维矩阵一个接一个堆叠:

6bb688e5d03ddf8b8cce95b50d6c85c9.png

                                                        图片来源:slidesharecdn

10.卷积和图像处理

2D卷积是图像处理中非常重要的操作。它包括以下步骤:

  1. 从一个小的权重矩阵开始,称为内核或过滤器

  2. 在2D输入数据上滑动此内核,执行逐元素乘法

  3. 添加获得的值并将总和放在单个输出像素中

9309c5804d14216429bdb49842065565.png

该功能看起来有点复杂,但它广泛用于执行各种图像处理操作,如锐化和模糊图像和边缘检测。我们只需要知道正在尝试完成的任务的正确Kernel。以下是一些可以使用的Kernel:

801f0c24431de8510423c22881912fa9.png

f1a9db9cafd516997eb414af82cf96c7.png

您可以下载我使用过的图像,并使用上面的代码和内核自己尝试这些图像处理操作。另外,试试这个关于图像分割技术的计算机视觉教程!(见下方链接)

https://www.analyticsvidhya.com/blog/2019/04/introduction-image-segmentation-techniques-python/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

04e3b894705c1b1731b16f6967b64c81.png

这是迄今为止我最喜欢的线性代数在数据科学中的应用。

现在您已熟悉计算机视觉的基础知识,现在是时候通过16个超棒的OpenCV功能开始您的计算机视觉之旅(见下方链接)。我们还有一个关于使用深度学习的计算机视觉的综合课程(见下方链接),您可以在其中进行真实的计算机视觉案例研究!

https://www.analyticsvidhya.com/blog/2019/03/opencv-functions-computer-vision-python/?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2?utm_source=blog&utm_medium=10-applications-linear-algebra-data-science

结束笔记

我的目标是将线性代数变得比你之前想象的更有趣。就个人而言,了解一个主题的应用会激励我学习更多关于它的知识。

96edc0336ce718d62a6983b63671c811.png

欢迎大家关注我们的微信公众号数据帮club↓

8fad373887df6e651b85c656d10a49ff.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法之冒泡排序(JAVA)

//冒泡排序算法 平均时间复杂度 O(n*n) 稳定的排序算法 下面的是改进版的冒泡排序算法,使用exchange 标志位进行控制 public class bubbleSort { public static void bubbleSort(int[] data) { int i 0; int j 0; int tmp 0; int len …

C语言中变量的储存类别

C语言中变量的储存类别C语言中变量的储存类别1.动态存储方式与静态动态存储方式:从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。静态存储方式:是指在程序运行期间分配固定的存储空间的…

语言与golang语言运行速度_Golang语言情怀第13期 Go 语言设计模式 介绍

设计模式是什么俗话说:站在别人的肩膀上,我们会看得更远。设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于复用的软…

blog发布测试

blog发布测试转载于:https://www.cnblogs.com/aj407blogs/p/9736120.html

字符串2在字符串1中第一次出现的位置strstr()

//字符串2在字符串1中第一次出现的位置,采用遍历的思想,移动str1的位置与str2进行匹配char *strstr(const char *str1, const char *str2) {int i 0;if (NULL str1){return NULL;}if (NULL str2){return (char *)str1;}if (*str2 ! \0){while (*str1 …

苦练IoT应用开发,还能加速变现,这个机会别错过

都说人间大事,不过吃喝二字。厨房经济近年来显示出了巨大发展潜力,智能厨电已成为潮流趋势。智慧厨电究竟是如何——让厨房小白做出一顿可口大餐?让懒人摆脱厨房油烟和洗碗的困扰?让怕冷的人喝到永远55℃的热水?……在…

jquery UI集合

http://www.cnblogs.com/leoxie2011/archive/2011/04/08/2009978.html

android人脸识别demo_零门槛解决Windows人脸识别应用开发难题

自人脸识别免费SDK——ArcFace3.0上线以来,凭借对人脸识别、活体检测、年龄检测、性别检测等核心算法模型进行全面升级,大幅提升算法鲁棒性,显著降低接入门槛,同时支持Windows、iOS、Android(包含Android10&#xff09…

strcpy()源代码

将源字符串拷贝到目的字符串中 char *strcpy(char *dest, const char *src) {assert((NULL ! dest) && (NULL ! src));char *ret dest;while ((*dest *src) ! \0){;}return ret; }

Visual Studio会让嵌入式开发变得更香

在几个月之前,我一直非常喜欢用Source Insight看代码,主要是习惯了原来的风格。从Source Insight 转到vscode 的原因是,在腾讯使用samba连接Source Insight看代码非常非常卡,让我觉得很难受。然后是在同事的建议下更换了vscode,里…

类和继承

所有的类都派生自Object;派生类引用可以转换成基类;屏蔽基类成员使用关键字new则可以屏蔽基类成员;虚方法和覆写方法基类的方法被标记为virtual 在派生类中有匹配的override方法 For Example: class MyBaseClass{ Virtual public void printf…

现实世界的Windows Azure:采访InishTech的销售及市场部主管Andrew O’Connor

MSDN: 告诉我们关于你们公司的信息以及您为Windows Azure创建的解决方案。O’Connor: InishTech 有点不寻常。我们的软件许可和保护服务(SLPS)平台是一个传统的多租户Windows Azure应用程序,利用Windows Azure SDK、 Windows Azure Dev Fabri…

python第2位的值_Python组通过匹配元组列表中的第二个元组值

在本教程中,我们将编写一个程序,该程序将列表中具有与第二个元素相同的元素的所有元组分组。让我们看一个例子来清楚地理解它。输入值[(Python, nhooos), (Management, other), (Django, nhooos), (React,nhooos), (Social, other), (Business, other)]输…

将源字符串的前count个字符拷贝到目的字符串中strncpy()

将源字符串的前count个字符拷贝到目的字符串中 char *strncpy(char *dest, const char *src, unsigned int count) {assert((NULL ! dest) && (NULL ! dsrc));char *ret dest;if (0 count){return dest;}while (count-- > 0){if (!(*ret *src)) //\0{return des…

珠海半导体公司招聘

受一个朋友所托,帮忙发一个招聘信息公司名字:珠海极海半导体有限公司上班地点:广州岗位名称:FAE工程师岗位要求:薪资:15K左右,会根据实际面试情况做相应调整。一些聊天内容的消息供大家参考&…

类模板 与 模板类

1.类模板与模板类的概念 ⑴ 什么是类模板 一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自…

python 网站发送验证码_Python爬虫模拟登录带验证码网站

爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法。python提供了强大的url库,想做到这个并不难。这里以登录学校教务系统为例,做一个简单的例子。首先得明白cookie的作用,cookie是某些网站为了辨别用户身份、…

二分法查找(Java)

二分法查找 时间复杂度为O(logn) public class BiSearch { public static int search(int[] data, int find){int low 0;int mid 0;int upper 0;if (null data) {return -1;}upper data.length - 1;while (low < upper) {mid (low upper)/2;if (data[mid] &g…

Linux同步原语系列-spinlock及其演进优化

1. 引言通常我们的说的同步其实有两个层面的意思&#xff1a;一个是线程间的同步&#xff0c;主要是为了按照编程者指定的特定顺序执行&#xff1b;另外一个是数据的同步&#xff0c;主要是为了保存数据。为了高效解决同步问题&#xff0c;前人抽象出同步原语供开发者使用。不仅…

[转]我在赶集网的两个月 7.4(完结)

转自&#xff1a;http://www.itiger.cn/?p678 转发这个文章的目的&#xff0c;表示对作者的敬佩&#xff0c;工作就是需要如此&#xff0c;需要有想法&#xff0c;需要总结。赶集少了这样的人才&#xff0c;可悲啊。 发信人: Caolixiang (慕慕珍珍), 信区: WorkLife 标 题: 我…