社区发现之标签传播算法(LPA)

在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密,有些用户之间的连接较为稀疏,连接紧密的用户群体可以看做一个社区,在风控问题中,可以简单的理解为团伙挖掘。

目前的社区发现问题分为两大类:非重叠社区发现和重叠社区发现。非重叠社区发现问题描述的是:一个网络中,每个节点均只能属于同一个社区,这意味这社区和社区之间是没有交集的。在非重叠社区发现算法中,有不同种类的解法:
1)基于模块度的社区发现算法:基本思想是通过定义模块度(Modularity)来衡量一个社区的划分是不是相对比较好的结果,从而将社区发现问题转化为最大化模块度的问题进行求解,后续的Louvain算法会讲到。
2)基于标签传播的社区发现算法:基本思想是通过标记节点的标签信息来更新未标记节点的标签信息,在整个网络中进行传播,直至收敛,其中最具代表性的就是标签传播算法(LPA,Label Propagation Algorithm),也是本文要讨论的算法。
注意:在团伙挖掘的实际应用的过程中,不要寄希望于优化社区发现算法提高准确性,可能永远都解决不了问题,因为关系的形成在实际中太过于复杂,我们更多的关注构图关系的筛选、清洗、提纯,以及分群后进一步加工处理
 

一、LPA概述

Label Propagation Algorithm,也称作标签传播算法(LPA),是一个在图中快速发现社群的算法,由Raghavan等人在2007年于论文《Near linear time algorithm to detect community structures in large-scale networks》中提出。在 LPA 算法中,节点的标签完全由它的直接邻居决定。标签传播算法是一种基于标签传播的局部社区发现算法,其基本思想是节点的标签(community)依赖其邻居节点的标签信息,影响程度由节点相似度决定,并通过传播迭代更新达到稳定。

1、算法的思想

在用一个唯一的标签初始化每个节点之后,该算法会重复地将一个节点的标签社群化为该节点的相邻节点中出现频率最高的标签。当每个节点的标签在其相邻节点中出现得最频繁时,算法就会停止。该算法是异步的,因为每个节点都会在不等待其余节点更新的情况下进行更新。
该算法有5个步骤:
1)初始化网络中所有节点的标签,对于给定节点x,Cx(0)=x。
2)设置 t=1。
3)以随机顺序排列网络中的节点,并将其设置为x。
4)对于特定顺序选择的每个x∈X,让Cx(t)=f(Cxi1(t),…,Cxim(t),…。f这里返回相邻标签中出现频率最高的标签。如果有多个最高频率的标签,就随机选择一个标签。
5)如果每个节点都有其邻居节点中数量最多的标签,则停止算法,否则,设置t=t+1并转到3。
这是一个迭代的计算过程且不保证收敛,大体的思路就是每个人都看看自己的邻居都在什么社区内,看看频率最高的社区是啥,如果和自己当前的社区不一样,就把这个最高频社区当成是自己的社区,然后告诉邻居,周而复始,直到对于所有人,邻居们告诉自己的高频社区和自己当前的社区是一样的,算法结束。所以说对于这个算法,计算复杂度是O(kE),k是迭代的次数,E是边的数量。大家的经验是这个迭代的次数大概是5次就能近似收敛,以实现精度和性能的平衡,能发现这个数字和六度分隔理论里面的数字也差不多。
我们可以很形象地理解算法的传播过程,当标签在紧密联系的区域,传播非常快,但到了稀疏连接的区域,传播速度就会下降。当出现一个节点属于多个社群时,算法会使用该节点邻居的标签与权重,决定最终的标签,传播结束后,拥有同样标签的节点被视为在同一群组中。
下图展示了算法的两个变种:Push 和 Pull。其中 Pull 算法更为典型,并且可以很好地并行计算:
社区发现之标签传播算法(LPA)
我们不再继续深入,看完上图,你应该已经理解了算法的大概过程。其实,做过图像处理的人很容易明白,所谓的标签传播算法,不过是图像分割算法的变种,Push 算法是区域生长法(Region Growing)的简化版,而 Pull 更像是分割和合并(divide-and-merge,也有人称 split-merge)算法。确实,图像(image)的像素和图(graph)的节点是十分类似的。

2、用于图聚类

图聚类是根据图的拓扑结构,进行子图的划分,使得子图内部节点的链接较多,子图之间的连接较少。依赖其邻居节点的标签信息,影响程度由节点相似度决定,并通过传播迭代更新达到稳定。
参考原始论文
https://arxiv.org/abs/0709.2938
https://arxiv.org/pdf/0709.2938.pdf
在算法开始之前为每个节点打上不同的标签,每一个轮次随机找到一个节点,查看其邻居节点的标签,找到出现次数最多的标签,随后将该节点改成该标签。当相邻两次迭代后社区数量不变或社区内节点数量不变时则停止迭代,下面看图解过程
初始化
社区发现之标签传播算法(LPA)
第一轮迭代
随机挑选一个节点(如c),发现其相邻节点有abe,三者出现次数相同,故随机选一个(如a),那么c点的标签被a替代。
社区发现之标签传播算法(LPA)
第二轮迭代
随机挑选一个节点(如b),发现其相邻节点均为a,故将b换成a,重复数次,最终的结果如图所示
社区发现之标签传播算法(LPA)
我们再看一个例子,比如下图:
社区发现之标签传播算法(LPA)
分组后的结果如下,我们得到了独立非重的groupid,这个结果其实是很难在实际场景中应用的,那么我们就的结果就没有意义了么?这个可以帮我们定位到浓度很高的群体,然后再加上部分属性标签,就能轻而易举的识别出问题黑产了。
社区发现之标签传播算法(LPA)

3、用于半监督

该算法也可以作为半监督的分类算法,标签传播时一种半监督机器学习算法,它将标签分配给以前未标记的数据点。在算法开始时,数据点的子集(通常只占很小一部分)有标签(或分类)。在整个算法过程中,这些标签会传播到未标记的点。在标签传播过程中,保持已标注数据的标签不变,使其像一个源头把标签传向未标注数据。
最终,当迭代过程结束时,相似节点的概率分布也趋于相似,可以划分到同一个类别中,从而完成标签传播过程,边的权重越大,表示两个节点越相似,那么label越容易传播过去。我们定义一个NxN的概率转移矩阵P:
社区发现之标签传播算法(LPA)
下面的图来看看传播过程
社区发现之标签传播算法(LPA)
传播结束后的结果如下:
社区发现之标签传播算法(LPA)
LPA使用已标记节点的标签作为基础,并尝试预测未标记节点的标签。然而,如果最初的标签是错误的,这可能会影响标签的传播过程,错误的标签可能会被传播。该算法是概率性的,并且发现的社区可能因执行的不同而不同。
 

二、算法代码实现

这个算法比较简单,有比较多的实现方式,最方便的还是networkx这个库,并用里面的一个简单的数据集进行试验。

1、数据集介绍

空手道数据集是一个比较简单的图数据集,下面我们看看其中的边和节点,后面应用这个数据集进行试验。
import networkx as nxG = nx.karate_club_graph() # 空手道G.nodes()NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33))
G.edges() EdgeView([(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8),(0, 10), (0, 11), (0, 12), (0, 13), (0, 17), (0, 19), (0, 21), (0, 31), (1, 2), (1, 3), (1, 7), (1, 13), (1, 17), (1, 19), (1, 21), (1, 30), (2, 3), (2, 7), (2, 8), (2, 9), (2, 13), (2, 27), (2, 28), (2, 32), (3, 7), (3, 12), (3, 13), (4, 6), (4, 10), (5, 6), (5, 10), (5, 16), (6, 16), (8, 30), (8, 32), (8, 33), (9, 33), (13, 33), (14, 32), (14, 33), (15, 32), (15, 33), (18, 32), (18, 33), (19, 33), (20, 32), (20, 33), (22, 32), (22, 33), (23, 25), (23, 27), (23, 29), (23, 32), (23, 33), (24, 25), (24, 27), (24, 31), (25, 31), (26, 29), (26, 33),(27, 33), (28, 31), (28, 33), (29, 32), (29, 33), (30, 32), (30, 33),(31, 32), (31, 33), (32, 33)])

2、自己实现LPA算法

import randomimport networkx as nximport matplotlib.pyplot as plt # 应该封装成类的形式 def lpa(G): ''' 异步更新方式 G:图 return:None 通过改变节点的标签,最后通过标签来划分社区 算法终止条件:迭代次数超过设定值 ''' max_iter_num = 0 # 迭代次数 while max_iter_num < 10: max_iter_num += 1 print('迭代次数',max_iter_num) for node in G: count = {} # 记录邻居节点及其标签 for nbr in G.neighbors(node): # node的邻居节点 label = G.nodes[nbr]['labels'] count[label] = count.setdefault(label,0) + 1 #找到出现次数最多的标签 count_items = sorted(count.items(),key=lambda x:-x[-1]) best_labels = [k for k,v in count_items if v == count_items[0][1]] #当多个标签最大技术值相同时随机选取一个标签 label = random.sample(best_labels,1)[0] # 返回的是列表,所以需要[0] G.nodes[node]['labels'] = label # 更新标签 def draw_picture(G): # 画图 node_color = [float(G.nodes[v]['labels']) for v in G] pos = nx.spring_layout(G) # 节点的布局为spring型 plt.figure(figsize = (8,6)) # 图片大小 nx.draw_networkx(G,pos=pos,node_color=node_color) plt.show() if __name__ == "__main__": G = nx.karate_club_graph() #空手道数据集 # 给节点添加标签 for node in G: G.add_node(node, labels = node) #用labels的状态 lpa(G) com = set([G.nodes[node]['labels'] for node inG]) print('社区数量',len(com)) draw_picture(G)
迭代次数 1迭代次数 2迭代次数 3迭代次数 4迭代次数 5迭代次数 6迭代次数 7迭代次数 8迭代次数 9迭代次数 10社区数量 3
代码运行结果:
社区发现之标签传播算法(LPA)

3、调包实现LPA算法

networkx集成了这个算法,可以直接调用
import matplotlib.pyplot as pltimport networkx as nxfrom networkx.algorithms.community import asyn_lpa_communities as lpa
# 空手道俱乐部G = nx.karate_club_graph()com = list(lpa(G))print('社区数量',len(com))
com [{0, 1, 2, 3, 7, 8, 9, 11, 12, 13, 17, 19, 21, 30},{4, 5, 6, 10, 16},{14, 15, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33}]

# 下面是画图pos = nx.spring_layout(G) # 节点的布局为spring型NodeId = list(G.nodes())node_size = [G.degree(i)**1.2*90 for i in NodeId] # 节点大小
plt.figure(figsize = (8,6)) # 设置图片大小nx.draw(G,pos, with_labels=True, node_size =node_size, node_color='w', node_shape = '.' )
'''node_size表示节点大小node_color表示节点颜色with_labels=True表示节点是否带标签'''color_list = ['pink','orange','r','g','b','y','m','gray','black','c','brown']
for i in range(len(com)): nx.draw_networkx_nodes(G, pos, nodelist=com[i], node_color = color_list[i+2], label=True)plt.show()
社区发现之标签传播算法(LPA)

三、分群结果可视化

在可视化方面,确实R语言要强,大家有时间可以学习下,活儿全还是有点用处的,我们这里用R的igraph包来展现一些社区发现的结果。
library('igraph')karate <- graph.famous("Zachary")community <- label.propagation.community(karate)# 计算模块度modularity(community)0.3717949
#membership查看每个点的各自分组情况。membership(community)1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2
plot(community,karate)
下面为两次跑的结果,可以看到,两次的结果并不一样,这个就是震荡效应导致的结果
社区发现之标签传播算法(LPA)
换一个对比下看看
community <- walktrap.community(karate, weights = E(karate)$weight, steps = 8, merges =TRUE, modularity = TRUE)plot(community,karate)
社区发现之标签传播算法(LPA)
可以用更复杂的数据,画出来还挺好看的,数据集的下载地址:http://snap.stanford.edu/data/egonets-Facebook.html
library(igraph)library(d3Network)igraphDat <- read.graph(file = "/Users/wuzhengxiang/Documents/PPT模板/0.edges", directed = FALSE)
## Simplify to remove duplications and from-self-to-self loopsigraphDat <- simplify(igraphDat, remove.multiple = TRUE, remove.loops = TRUE )
## Give numbersV(igraphDat)$label <- seq_along(V(igraphDat))
## Average path length between any two given nodes(averagePathLength <- average.path.length(igraphDat))
## Community structure detection based on edge betweennesscommunityEdgeBetwn <- edge.betweenness.community(igraphDat)
## Check the transitivity of a graph (probability that the adjacent vertices of a vertex are connected)(transitivityDat <- transitivity(igraphDat, type = "localaverage", isolates = "zero") )
## Set the seed to get the same resultset.seed("20200513")
## Add community indicating background colorsplot(igraphDat,vertex.color = communityEdgeBetwn$membership, vertex.size = log(degree(igraphDat) + 1),mark.groups = by(seq_along(communityEdgeBetwn$membership), communityEdgeBetwn$membership, invisible) )
## Annotatetitle("Stanford Facebook data", sub = "http://snap.stanford.edu/data/egonets-Facebook.html" )text(x = -1, y = -1, labels = sprintf("Average path length: %.2fnTransitivity: %.2f", averagePathLength, transitivityDat) )
社区发现之标签传播算法(LPA)
社区发现之标签传播算法(LPA)
社区发现之标签传播算法(LPA)

四、算法优缺点

作为一个比较简单的算法,其优缺点也是特别的明显。

1、算法优点

算法逻辑简单,时间复杂度低,接近线性复杂度,在超大规模网络下会有优异的性能,适合做社区发现的baseline。
无须定义优化函数,无须事先指定社区个数,算法会利用自身的网络结构来指导标签传播。

2、算法缺点

雪崩效应:社区结果不稳定,随机性强。由于当邻居节点的社区标签权重相同时,会随机取一个。导致传播初期一个小的错误被不断放大,最终没有得到合适的结果。尤其是异步更新时,更新顺序的不同也会导致最终社区划分结果不同。
社区发现之标签传播算法(LPA)
上图中展示了一次标签传播算法的流程:初始化阶段,每个节点都以自己作为社区标签。比如a的社区就是a,c的社区就是c。当进入传播阶段,节点c的邻居节点共4个:a,b,c,d。而社区标签也是4个:a,b,c,d,假设随机取了一个a。
如果是异步更新,此时b,d,e三个节点的邻居节点中社区标签均存在2个a,所以他们都会立马更新成a。如果c当时随机选择的是b,那么d,e就会更新成b,从而导致b社区标签占优,而最终的社区划分也就成b了。
震荡效应:社区结果来回震荡,不收敛,当传播方式处于同步更新的时候,尤其对于二分图或子图存在二分图的结构而言,极易发生。
社区发现之标签传播算法(LPA)
上图中展示了一次二分图中标签传播算法的流程,在同步更新的时候,每个节点依赖的都是上一轮迭代的社区标签。当二分图左边都是a,右边都是b时,a社区的节点此时邻居节点都是b,b社区的节点此时邻居节点都是a,根据更新规则,此时a社区的节点将全部更新为b,b社区的节点将全部更新为a。此时算法无法收敛,使得整个网络处于震荡中。
转自:https://mp.weixin.qq.com/s/DgCK9Ea-Qf00KyB1W8x8Iw

机器学习和深度学习的区别到底是什么?

 

  • 终于考上人工智能的研究僧啦,不知道机器学习和深度学习有啥区别,感觉一切都是深度学习
  • 挖槽,听说学长已经调了10个月的参数准备发有2000亿参数的T9开天霹雳模型,我要调参发T10准备拿个Best Paper
机器学习和深度学习的区别到底是什么?

现在搞传统机器学习相关的研究论文确实占比不太高,有的人吐槽深度学习就是个系统工程而已,没有数学含金量。

但是无可否认的是深度学习是在太好用啦,极大地简化了传统机器学习的整体算法分析和学习流程,更重要的是在一些通用的领域任务刷新了传统机器学习算法达不到的精度和准确率。

深度学习这几年特别火,就像5年前的大数据一样,不过深度学习其主要还是属于机器学习的范畴领域内,所以这篇文章里面我们来唠一唠机器学习和深度学习的算法流程区别。

机器学习和深度学习的区别到底是什么?

1、机器学习的算法流程

实际上机器学习研究的就是数据科学(听上去有点无聊),下面是机器学习算法的主要流程:

  1. 数据集准备
  2. 探索性的对数据进行分析
  3. 数据预处理
  4. 数据分割
  5. 机器学习算法建模
  6. 选择机器学习任务
  7. 最后就是评价机器学习算法对实际数据的应用情况如何
机器学习和深度学习的区别到底是什么?
=

1.1 数据集

首先我们要研究的是数据的问题,数据集是构建机器学习模型流程的起点。简单来说,数据集本质上是一个M×N矩阵,其中M代表列(特征),N代表行(样本)。

列可以分解为X和Y,X是可以指特征、独立变量或者是输入变量。Y也是可以指类别标签、因变量和输出变量。

机器学习和深度学习的区别到底是什么?

1.2 数据分析

进行探索性数据分析(Exploratory data analysis, EDA)是为了获得对数据的初步了解。EDA主要的工作是:对数据进行清洗,对数据进行描述(描述统计量,图表),查看数据的分布,比较数据之间的关系,培养对数据的直觉,对数据进行总结等。

探索性数据分析方法简单来说就是去了解数据,分析数据,搞清楚数据的分布。主要注重数据的真实分布,强调数据的可视化,使分析者能一目了然看出数据中隐含的规律,从而得到启发,以此帮助分析者找到适合数据的模型。

在一个典型的机器学习算法流程和数据科学项目里面,我做的第一件事就是通过 “盯住数据”,以便更好地了解数据。个人通常使用的三大EDA方法包括:

描述性统计

平均数、中位数、模式、标准差。

机器学习和深度学习的区别到底是什么?

数据可视化

热力图(辨别特征内部相关性)、箱形图(可视化群体差异)、散点图(可视化特征之间的相关性)、主成分分析(可视化数据集中呈现的聚类分布)等。

机器学习和深度学习的区别到底是什么?

数据整形

对数据进行透视、分组、过滤等。

机器学习和深度学习的区别到底是什么?

1.3 数据预处理

数据预处理,其实就是对数据进行清理、数据整理或普通数据处理。指对数据进行各种检查和校正过程,以纠正缺失值、拼写错误、使数值正常化/标准化以使其具有可比性、转换数据(如对数转换)等问题。

例如对图像进行resize成统一的大小或者分辨率。

数据的质量将对机器学习算法模型的质量好坏产生很大的影响。因此,为了达到最好的机器学习模型质量,传统的机器学习算法流程中,其实很大一部分工作就是在对数据进行分析和处理。

一般来说,数据预处理可以轻松地占到机器学习项目流程中80%的时间,而实际的模型建立阶段和后续的模型分析大概仅占到剩余的20%。

1.4 数据分割

训练集 & 测试集

在机器学习模型的开发流程中,希望训练好的模型能在新的、未见过的数据上表现良好。为了模拟新的、未见过的数据,对可用数据进行数据分割,从而将已经处理好的数据集分割成2部分:训练集合测试集。

第一部分是较大的数据子集,用作训练集(如占原始数据的80%);第二部分通常是较小的子集,用作测试集(其余20%的数据)。

接下来,利用训练集建立预测模型,然后将这种训练好的模型应用于测试集(即作为新的、未见过的数据)上进行预测。根据模型在测试集上的表现来选择最佳模型,为了获得最佳模型,还可以进行超参数优化。

机器学习和深度学习的区别到底是什么?

训练集 & 验证集 & 测试集

另一种常见的数据分割方法是将数据分割成3部分:

  1. 训练集
  2. 验证集
  3. 测试集

训练集用于建立预测模型,同时对验证集进行评估,据此进行预测,可以进行模型调优(如超参数优化),并根据验证集的结果选择性能最好的模型。

验证集的操作方式跟训练集类似。不过值得注意的是,测试集不参与机器学习模型的建立和准备,是机器学习模型训练过程中单独留出的样本集,用于调整模型的超参数和对模型的能力进行初步评估。通常边训练边验证,这里的验证就是用验证集来检验模型的初步效果。

机器学习和深度学习的区别到底是什么?

交叉验证

实际上数据是机器学习流程中最宝贵的,为了更加经济地利用现有数据,通常使用N倍交叉验证,将数据集分割成N个。在这样的N倍数据集中,其中一个被留作测试数据,而其余的则被用作建立模型的训练数据。通过反复交叉迭代的方式来对机器学习流程进行验证。

这种交叉验证的方法在机器学习流程中被广泛的使用,但是深度学习中使用得比较少哈。

机器学习和深度学习的区别到底是什么?

1.5 机器学习算法建模

下面是最有趣的部分啦,数据筛选和处理过程其实都是很枯燥乏味的,现在可以使用精心准备的数据来建模。根据taget变量(通常称为Y变量)的数据类型,可以建立一个分类或回归模型。

机器学习算法

机器学习算法可以大致分为以下三种类型之一:

监督学习

是一种机器学习任务,建立输入X和输出Y变量之间的数学(映射)关系。这样的(X、Y)对构成了用于建立模型的标签数据,以便学习如何从输入中预测输出。

无监督学习

是一种只利用输入X变量的机器学习任务。X变量是未标记的数据,学习算法在建模时使用的是数据的固有结构。

强化学习

是一种决定下一步行动方案的机器学习任务,它通过试错学习(trial and error learning)来实现这一目标,努力使reward回报最大化。

参数调优

传说中的调参侠主要干的就是这个工作啦。超参数本质上是机器学习算法的参数,直接影响学习过程和预测性能。由于没有万能的超参数设置,可以普遍适用于所有数据集,因此需要进行超参数优化。

以随机森林为例。在使用randomForest时,通常会对两个常见的超参数进行优化,其中包括mtry和ntree参数。mtry(maxfeatures)代表在每次分裂时作为候选变量随机采样的变量数量,而ntree(nestimators)代表要生长的树的数量。

另一种在10年前仍然非常主流的机器学习算法是支持向量机SVM。需要优化的超参数是径向基函数(RBF)内核的C参数和gamma参数。C参数是一个限制过拟合的惩罚项,而gamma参数则控制RBF核的宽度。

调优通常是为了得出超参数的较佳值集,很多时候不要去追求找到超参一个最优值,其实调参侠只是调侃调侃,真正需要理解掌握算法原理,找到适合数据和模型的参数就可以啦。

特征选择

特征选择从字面上看就是从最初的大量特征中选择一个特征子集的过程。除了实现高精度的模型外,机器学习模型构建最重要的一个方面是获得可操作的见解,为了实现这一目标,能够从大量的特征中选择出重要的特征子集非常重要。

特征选择的任务本身就可以构成一个全新的研究领域,在这个领域中,大量的努力都是为了设计新颖的算法和方法。从众多可用的特征选择算法中,一些经典的方法是基于模拟退火和遗传算法。除此之外,还有大量基于进化算法(如粒子群优化、蚁群优化等)和随机方法(如蒙特卡洛)的方法。

机器学习和深度学习的区别到底是什么?

1.6 机器学习任务

在监督学习中,两个常见的机器学习任务包括分类和回归。

分类

一个训练好的分类模型将一组变量作为输入,并预测输出的类标签。下图是由不同颜色和标签表示的三个类。每一个小的彩色球体代表一个数据样本。三类数据样本在二维中的显示,这种可视化图可以通过执行PCA分析并显示前两个主成分(PC)来创建;或者也可以选择两个变量的简单散点图可视化。

机器学习和深度学习的区别到底是什么?

性能指标

如何知道训练出来的机器学习模型表现好或坏?就是使用性能评价指标(metrics),一些常见的评估分类性能的指标包括准确率(AC)、灵敏度(SN)、特异性(SP)和马太相关系数(MCC)

回归

最简单的回归模式,可以通过以下简单等式很好地总结:Y = f(X)。其中,Y对应量化输出变量,X指输入变量,f指计算输出值作为输入特征的映射函数(从机器学习模型中得到)。

上面的回归例子公式的实质是,如果X已知,就可以推导出Y。一旦Y被计算(预测)出来,一个流行的可视化方式是将实际值与预测值做一个简单的散点图,如下图所示。

机器学习和深度学习的区别到底是什么?

对回归模型的性能进行评估,以评估拟合模型可以准确预测输入数据值的程度。评估回归模型性能的常用指标是确定系数(R²)。此外,均方误差(MSE)以及均方根误差(RMSE)也是衡量残差或预测误差的常用指标。

2、深度学习算法流程

深度学习实际上是机器学习中的一种范式,所以他们的主要流程是差不多的。深度学习则是优化了数据分析,建模过程的流程也是缩短了,由神经网络统一了原来机器学习中百花齐放的算法。

在深度学习正式大规模使用之前呢,机器学习算法流程中药花费很多时间去收集数据,然后对数据进行筛选,尝试各种不同的特征提取机器学习算法,或者结合多种不同的特征对数据进行分类和回归。

机器学习和深度学习的区别到底是什么?

下面是机器学习算法的主要流程:主要从

  1. 数据集准备
  2. 数据预处理
  3. 数据分割
  4. 定义神经网络模型
  5. 训练网络

深度学习不需要我们自己去提取特征,而是通过神经网络自动对数据进行高维抽象学习,减少了特征工程的构成,在这方面节约了很多时间。

但是同时因为引入了更加深、更复杂的网络模型结构,所以调参工作变得更加繁重啦。例如:定义神经网络模型结构、确认损失函数、确定优化器,最后就是反复调整模型参数的过程。

参考文献  
[1] https://github.com/dataprofessor/infographic    
[2] 陈仲铭. 《深度学习:原理与实践》   

作者:ZOMI酱 

https://zhuanlan.zhihu.com/p/455602945

 

– EOF –

转自:https://mp.weixin.qq.com/s/tFw8sfsznHwn0E5I7SVf3A

读懂一个 Demo就能入门机器学习?

作者: 东泽 EuryChen 

来源: 东泽聊技术

读懂一个 Demo就能入门机器学习?我们总有一种感觉,机器学习门槛高、难入门。这是因为这里有太多晦涩的概念「神经网络」、「评估指标」、「优化算法」等让初学者老是有种盲人摸象的感觉。甚至连理解一个 Tensorflow 官方 Demo 都感觉吃力,因此不少开发者就有过「机器学习从入门到放弃」的经历。本文站在全局视角,通过分析一个 TensorFlow 官方的 Demo 来达到俯瞰一个「机器学习」系统的效果,从而让读者看清这个头大象的全貌,帮助初学者入门「机器学习」。

理解机器学习

「机器学习」的目的就是利用已有答案来寻找规则,从而做出预测。

  • 「传统系统」的目标是获得答案
  • 「机器学习」的目标是利用已有答案获得规则

读懂一个 Demo就能入门机器学习?

正是因为「机器学习」的目标是获得规则,人们便可以拿它来做各种预测:股票走势、彩票号码、服饰推荐、甚至预测员工何时离职。图片识别本质上也是找到规则。比如要识别一张图片物体是否有一只猫咪,那么胡须、耳朵、绒毛等都可以作为猫咪的特征值,而定义特征值就是在定义成为一只猫的组成规则。

详解一个机器学习 Demo

学习一项技能最好方法就是去使用它。这部分我们来看一个 TensorFlow Demo。TensorFlow 是 Google 推出的深度学习框架,基本信息我就不多做介绍了。我要介绍的是如何读懂这个 Demo。你可能会问,一个 Demo 有那么难懂么?对于「机器学习」的初学者来说,如若不懂「神经网络」、「损失函数」、「评估指标」等概念,还真是挺难读懂一个 Demo 的。

看下这个 Demo,代码不多,我全部贴出来了。读懂一个 Demo就能入门机器学习?看到这部分代码的全貌,什么感觉?我第一次读到的感觉是:「语法都能看懂,但就是不知道你这是要干啥!」如果你也有这样的感觉,那么我建议你认真把这篇文章读完。这个 Demo 实际上是要训练一个可以识别手写数字的模型(Model), 要识别的手写数字长这样:读懂一个 Demo就能入门机器学习?你也许一下子会有很多问号。手写数字?图片在哪?怎么识别?别急,下面我来为大家详解这个 Demo。

数据准备

人工智能领域中的数据是什么?我们从 TensorFlow 这个框架的名字中就能看出来 — Tensor(张量)形成的 Flow(流)。在「人工智能」领域,绝大部分数据都是以 Tensor 的形式存在,而 Tensor 可以直接理解成多维数组。读懂一个 Demo就能入门机器学习?

举个例子: 要把一张图片输入到人工智能模型中。我们第一反应是要先把图片数字化,用 Base64 来表示这张图、或者用二进制等等。但是对于人工智能系统,最佳方式是把图片转换成 Tensor。我们试试用 Tensor 来表示一张 像素 3*3 、背景为白色、对角线为黑色的图片:

读懂一个 Demo就能入门机器学习?读懂一个 Demo就能入门机器学习?运行代码之后,我们就得到了那张对角线是黑色的 3*3 图片。这就是用一个四阶 Tensor 表示一张图片,Tensor 形状为 (1, 3, 3) 。同理如果要表示 6000 张 28*28 的图片,那么 Tensor 的形状就是  (6000, 28, 28)

现在我们阅读第一部分的代码:读懂一个 Demo就能入门机器学习?「MNIST」(Mixed National Institute of Standards and Technology database) 是美国国家标准与技术研究院收集整理的大型手写数字数据库,包含 60,000 个示例的训练集以及 10,000 个示例的测试集,里面的图片长这样。读懂一个 Demo就能入门机器学习?这些图片都是通过空间的矩阵的方式存储的:读懂一个 Demo就能入门机器学习?

这样我们就明白这段代码的意思了,是从 mnist 中获取用于训练的的数据集集( x_trian,y_train ),以及用于测试的数据集( x_test,y_test )。

  • x_trian 形状为 (6000, 28, 28) ,表示 6000 张 28*28的图片。
  • y_trian 形状为 (6000,),表示 x_train 对应的数字答案。

模型(model)是什么

得到了数据集之后,是不是可以开始训模型了?别急,我们要搞清楚模型是什么,Tensorflow 文档是这样定义模型:

读懂一个 Demo就能入门机器学习?在机器学习中,模型( Model )是一个具有可学习参数的函数,它将输入映射到输出。最优参数是通过在数据上训练模型获得的。一个训练有素的模型将提供从输入到所需输出的精确映射。

我来帮你们翻译一下这个定义:模型是个函数,这里面内置了很多参数,这些参数的值会直接影响模型的输出结果。有意思的是这些参数都是可学习的,它们可以根据训练数据的来进行调整来达到一组最优值,使得模型的输出效果最理想。

  • 那么模型里参数又是什么?
  • Demo 当中模型传入的 4 个Layer 又是什么含义?

读懂一个 Demo就能入门机器学习?

  • 模型又是如何训练的?

想要知道这些问题答案,那么:「先生小姐,泳泳健身,呃不。神经网络,了解一下」

神经网络 ( Neural Network )

神经网络 ( Neural Network )顾名思义,就是用神经元 ( Neuron )连接而成的网络( Network )。那么什么是神经元?

读懂一个 Demo就能入门机器学习?机器学习中的神经元( Neuron ) 源于生物神经网络 — 通过电位变化表示“兴奋”的生物神经元。在机器学习领域,一个神经元其实是一个计算单元。它需要被输入N 个信号后开始计算(兴奋),这些信号通过带权重(weights)的连接传递给了神经元,神经元通过加权求和,计算出一个值。然后这个值会通过激活函数( activation function )的处理,产生输出,通常是被压缩在 0~1 之间的数字。

读懂一个 Demo就能入门机器学习?

Demo 当中,第一个 Layer 就是把就是把 28*28 的图片展开成一个包含 784 个神经元一维数组。

...
# 第一个 Layer
# 神经元展开成一维数组
tf.keras.layers
.Flatten(input_shape=(28, 28)),
...

读懂一个 Demo就能入门机器学习?

第二个 Layer:

...
tf.keras.layers
.Dense(128, activation='relu'),
...

Layer2 传入了参数 activation='relu',意思是用 relu 作为激活函数 。我们先来理解下什么是「激活函数」,

读懂一个 Demo就能入门机器学习?当我们的大脑同时接收到大量信息时,它会努力理解并将信息分为 「有用 」和 「不那么有用 」的信息。在神经网络的情况下,我们需要一个类似的机制来将输入的信息分为 「有用 」或 「不太有用」。这对机器学习很重要,因为不是所有的信息都是同样有用的,有些信息只是噪音。这就是激活函数的作用,激活函数帮助网络使用重要的信息,抑制不相关的数据点。

例如 Demo 中,Layer1 输出 784 个神经元,并不是全部激活的。而只有激活神经元才能对 Layer2 产生刺激,而 layer4 输出10个神经元,其中第 2 个神经元激活,表示识别结果为 1 的概率是 99%。读懂一个 Demo就能入门机器学习?

所以 relu 是激活函数的一种,用于神经元的激活 — 根据上一个 Layer 给予的刺激算出神经元最后输出(显示)的那个数字。Layer2 层有 128个神经元,这128个神经元会和 Layer1 中 728 个神经元相互连接,共将产生 728 * 128 =93184 权重(weights)各自不同的连接 。Layer1 中神经元的输出将与连接到 layer2 的权重值进行加权求和,得到的结果会被带入 relu 函数,最终输出一个新的值作为 Layer2 中神经元的输出。

读懂一个 Demo就能入门机器学习?

第三个 Layer

...
  tf.keras.layers.Dropout(0.2),

Dropout layer 的主要作用就是防止过度拟合。过渡拟合现象主要表现是:最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。Dropout 解决过度拟合的办法之一,就是随机丢弃一部神经元。Demo 当中就是使用 Dropout 随机丢弃 20% 神经元。读懂一个 Demo就能入门机器学习?

第四个 Layer

...
tf.keras.layers
.Dense(10, activation='softmax')
...

Layer4 上有 10 个神经元,并使用 softmax作为激活函数,这 10个神经元的输出就是最终结的结果。下图为识别一个手写数字 1 的整个过程,各层神经元逐层激活,最终输出预测结果。读懂一个 Demo就能入门机器学习?

到这里,我们通过了解 4 个Layer之间的作用关系简单的了解了一个神经网络的运作方式。

模型训练补充

读懂一个 Demo就能入门机器学习?要读懂这段代码,我们要先通过一个类比来理解下什么是: 损失函数( Loss Function )优化算法( Optimization Algorithms )评价指标( Evaluation Metrics )假如一名男士要开始锻炼身体,目标是胸围达到 120cm,且身材看起来匀称(别太壮):

  • 经过反复训练,他的胸围达到了 110cm,那么我们可以把Loss = |目标(120cm)- 当前(110cm)|作为一个最简单的损失函数(Loss Function)。而 Demo 中的 Loss Function 用的是 – 稀疏类别交叉熵(sparse_categorical_crossentropy),这个算法的特点就是擅长分类。
  • 是否达成目标,不能仅仅使用损失函数来判断。身材匀称、美观也很重要,而评价指标(Evaluation Metrics )的作用就给我们提供了一个评判标准。
  • 接下来我们就要寻找产生 Loss 的规律,Loss 不仅仅是胸围小于 120cm 的损失,胸围大于 120cm 而导致美感损失也是 Loss 的一部分。因此想达到最佳效果,既不能运动量不足也不能用力过猛,要找到一个平衡力量和美感的中间值。我们给予训练要素不同的权重( Weights ),蛋白质补充权重为w0、胸肌上沿训练强度w1、胸肌中部训练强度w2、胸肌下沿训练强度w3、有氧运动训练强度w4 等等。最后得到一个权重的一维数组 [w1, w2…wn] 。像这样,通过不断调整 [w1, w2…wn] 得出最优输出的方法,就是优化算法( Optimization Algorithms )。

了神经网络的模型、层、权重、优化算法、损失函数以及评估指标等之后,我们就可以读懂 Demo 中那段代码了。现在尝试画一张神经网络的工作流程图,串一串一个神经网络的工作流程。读懂一个 Demo就能入门机器学习?

训练与测试

读懂一个 Demo就能入门机器学习?这部分很好理解,带入数据训练、测试就好。说一下 epochs 。在神经网络领域,一个 epoch 是指整个训练数据集的训练一个周期。1 epoch = 1正向传播( forward pass )+ 1 反向传播( backward pass )(我们可以简单的理解,正向传播目的是为了获得预测结果,反向传播目的是调整到最优的权重(weights),来让 Loss 最小化。)

Demo 中 epochs = 5 是因为 1次 epoch 很可能得不到最优的权重(weights)。既然 1 次不能满足,那就 5 次,5 次还不满足就 10 次,直到效果最小化 Loss 的效果不再变化。

读懂一个 Demo就能入门机器学习?


总结

如果认真阅读了本文,那么我相信你已经对人工智能已经有了一点整体的认识,本文给了你一个鸟瞰人工智能的视角,摆脱了盲人摸象的感觉。这虽然不是魔法,能立刻把你变成人工智能大神,但对基本架构的进一步理解会增强你对人工智能的自学能力。无论你是从事前端、后端、全栈等技术开发者,或者只是对人工智能感兴趣,我都希望本文可以带给你一个新的视角去理解人工智能,让你读有所思,思有所得,得有所想,想有所获,获有所益。
如果你在阅读之后认为本文对你有帮助,请点击右下角「在看」,不胜感谢。

·END·

转自:https://mp.weixin.qq.com/s/2ZTiEAunrYks5SlDm-o1NA