机器学习知识

Transformer

编码器负责将输入序列转化为一种内部表示(也称为上下文向量),而解码器则根据这个上下文向量生成输出序列

编码器(Encoder):

输入嵌入(Input Embedding):将输入序列转换为固定维度的向量序列。

多头自注意力层(Multi-Head Self-Attention Layer):对输入序列中的每个位置计算与其他所有位置的注意力得分(softmax+ LayerNorm ),然后聚合这些注意力得分以生成新的表示。

这通过两种方式提高了注意力层的性能:

1.它扩展了模型关注不同位置的能力。是的,在上面的示例中,z1 包含一点其他编码,但它可能由实际单词本身主导。如果我们要翻译“The animal didn’t cross the street because it was too tired”这样的句子,那么知道“it”指的是哪个词会很有用。

2.它为注意力层提供了多个“表示子空间”。正如我们接下来将看到的,使用多头注意力,我们不仅有一个,而且还有多组查询/键/值权重矩阵(Transformer 使用八个注意力头,所以我们最终每个编码器/解码器都有八个集合) . 这些集合中的每一个都是随机初始化的。然后,在训练之后,每个集合用于将输入嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。

得到8个结果矩阵连接这些矩阵,然后将它们乘以一个额外的权重矩阵 W

前馈神经网络层(Feed Forward Neural Network Layer):对自注意力层的输出进行非线性变换,通常包括两个全连接层。两个线性变换组成,中间有一个ReLU激活函数 ->GELU

            nn.Linear(d_model, d_ff, bias=False),
            # nn.ReLU(),
            nn.GELU(),
            nn.Linear(d_ff, d_model, bias=False),
            nn.Dropout(p=0.1),

残差连接(Residual Connection):将前一层(编码器或解码器)的输出与当前层的输出相加,并通过一个可学习的缩放因子(称为“层标准化”)。有效解决了梯度消失问题

 nn.LayerNorm(d_model).cuda()(
            output + residual
        ) 

层归一化(Layer Normalization):对每个序列位置的输出进行归一化,以提高模型的稳定性和训练速度。

LayerNorm & BatchNorm

Normalization的主要作用就是把每层特征输入到激活函数之前,对它们进行normalization,使其转换为均值为0,方差为1的数据,从而可以避免数据落在激活函数的饱和区,以减少梯度消失的问题。

BN是对一个batch-size样本内的每个特征做归一化,LN是对每个样本的所有特征做归一化

所以,BN抹平了不同特征之间的大小关系,而保留了不同样本之间的大小关系。这样,如果具体任务依赖于不同样本之间的关系,BN更有效,尤其是在CV领域,例如不同图片样本进行分类,不同样本之间的大小关系得以保留。

LN抹平了不同样本之间的大小关系,而保留了不同特征之间的大小关系。所以,LN更适合NLP领域的任务,其中,一个样本的特征实际上就是不同word embedding,通过LN可以保留特征之间的这种时序关系。

BN:引入了噪声可以防止过拟合。

具体过程为:

1.计算样本均值。

2.计算样本方差。

3.样本数据标准化处理。

4.进行平移和缩放处理。引入了γ \gammaγ和β \betaβ两个参数。来训练γ和β两个参数。引入了这个可学习重构参数 γ \gammaγ 和β \betaβ,让我们的网络可以学习恢复出原始网络所要学习的特征分布。

Transformer中BN表现不太好的原因可能在于CV和NLP数据特性的不同,对于NLP数据,前向和反向传播中,batch统计量及其梯度都不太稳定。

位置编码(Positional Encoding):为了保留序列中元素的位置信息,Transformer 添加了位置编码。

编码器堆叠(Encoder Stacking):将多个编码器模块堆叠在一起,形成编码器。

自注意力机制:

1查询向量Q、一个键向量K和一个值向量V传给解码器

2计算一个分数:分数决定了对输入句子其他部分的关注程度,分数是通过查询向量与我们正在评分的各个单词的关键向量的点积来计算的。

3是将分数除以 8(论文中使用的关键向量维度的平方根 64。这会导致梯度更稳定。这里可能还有其他可能的值,但这是默认),然后通过 softmax 操作传递结果。Softmax 将分数归一化,因此它们都是正数并且加起来为 1。这个 softmax 分数决定了每个单词在这个位置上的表达量

4是将每个值向量乘以 softmax 分数(准备将它们相加)。这里的直觉是保持我们想要关注的单词的值不变,并淹没不相关的单词(例如,将它们乘以 0.001 之类的小数字)。

5是对加权值向量求和。这会在这个位置产生自注意力层的输出(对于第一个词

解码器中的自注意力层的操作方式与编码器中的方式略有不同:

在解码器中,自注意力层只允许关注输出序列中较早的位置。这是通过在 self-attention 计算中的 softmax 步骤之前masking屏蔽未来位置(将它们设置为 )来完成的。

“Encoder-Decoder Attention”层的工作方式与多头自注意力相似,不同之处在于它从其下方的层创建其查询矩阵,并从编码器堆栈的输出中获取 Keys 和 Values 矩阵。

解码器:

Decoder端的多头self-attention需要做mask,因为它在预测时,是“看不到未来的序列的”,所以要将当前预测的单词(token)及其之后的单词(token)全部mask掉

多头Encoder-Decoder attention交互模块的形式与多头self-attention模块一致,唯一不同的是其QKV矩阵的来源,其Q矩阵来源于下面子模块的输出(对应到图中即为masked多头self-attention模块经过Add & Norm后的输出),而KV矩阵则来源于整个Encoder端的输出

Encoder-Only架构

Encoder-Only 架构,也被称为单向架构,仅包含编码器部分。它主要适用于不需要生成序列的任务,只需要对输入进行编码和处理的单向任务场景,如文本分类、情感分析等。这种架构的代表是 BERT 相关的模型,例如 BERTRoBERT 和 ALBERT 等。

Encoder-Only 架构的核心思想是利用神经网络对输入文本进行编码,提取其特征和语义信息,并将编码结果传递给后续的处理模块。这种架构的优点是能够更好地理解输入文本的语义和上下文信息,从而提高文本分类和情感分析等任务的准确性。缺点是它无法直接生成文本输出,因此在需要生成文本的任务中不太适用。

Encoder-Only架构的大模型有谷歌的BERT、智谱AI发布的第四代基座大语言模型GLM4等。其中,BERT是基于Encoder-Only架构的预训练语言模型。GLM4是智谱AI发布的第四代基座大语言模型,该模型在IFEval评测集上,在Prompt提示词跟随(中文)方面,GLM-4达到了GPT-4 88%的水平。

Decoder-Only架构

Decoder-Only 架构,也被称为生成式架构,仅包含解码器部分。它通常用于序列生成任务,如文本生成、机器翻译等。这种架构的模型适用于需要生成序列的任务,可以从输入的编码中生成相应的序列。同时,Decoder-Only 架构还有一个重要特点是可以进行无监督预训练。在预训练阶段,模型通过大量的无标注数据学习语言的统计模式和语义信息。

Decoder-Only 架构的优点是擅长创造性的写作,比如写小说或自动生成文章。它更多关注于从已有的信息(开头)扩展出新的内容。其缺点是需要大量的训练数据来提高生成文本的质量和多样性。

Decoder-Only架构的大模型的代表有GPT系列、LLaMA、OPT、BLOOM等。这类模型采用预测下一个词进行训练,常见下游任务有文本生成、问答等,因此被称为ALM(Autoregressive Language Model)。

国内采用Decoder-Only架构研发的大模型有妙想金融大模型、XVERSE-13B大模型等。其中,妙想金融大模型是东方财富旗下自主研发的金融行业大语言模型,目前已经覆盖了7B、13B、34B、66B及104B参数。而XVERSE-13B大模型是由前腾讯副总裁、腾讯AI lab创始人姚星创立的明星独角兽元象研发的,该模型支持40多种语言、8192上下文长度,在多项中英文测评中,性能超过了同尺寸(130亿参数)的LIama2、Baichuan等。

Encoder-Decoder架构

Encoder-Decoder 架构,也被称为序列到序列架构,同时包含编码器和解码器部分。它通常用于序列到序列(Seq2Seq)任务,如机器翻译、对话生成等。这种架构的代表是以 Google 训练出来的 T5 为代表的相关大模型。

Encoder-Decoder 架构的核心思想是利用编码器对输入序列进行编码,提取其特征和语义信息,并将编码结果传递给解码器。然后,解码器根据编码结果生成相应的输出序列。这种架构的优点是能够更好地处理输入序列和输出序列之间的关系,从而提高机器翻译和对话生成等任务的准确性。缺点是模型复杂度较高,训练时间和计算资源消耗较大。

Encoder-Decoder架构的大模型有很多,例如Google的T5模型、华为的盘古NLP大模型等。

其中,华为的盘古NLP大模型首次使用Encoder-Decoder架构,兼顾NLP大模型的理解能力和生成能力,保证了模型在不同系统中的嵌入灵活性。在下游应用中,仅需少量样本和可学习参数即可完成千亿规模大模型的快速微调和下游适配,这一模型在智能舆论以及智能营销方面都有不错的表现。

正则化

防止过拟合:正则化通过对模型的复杂度进行限制,防止模型在训练数据上过度拟合。过拟合指的是模型在训练数据上表现良好,但在未见过的数据上表现较差的情况,这可能是因为模型学习到了训练数据中的噪声或者细节,而无法泛化到新数据上。正则化有助于使模型更加简单,从而提高其在未见过的数据上的泛化能力。

提高模型的泛化能力:正则化约束了模型的复杂度,使其更容易泛化到未见过的数据上。通过控制模型的参数大小或数量,正则化可以使模型更加稳定,减少对训练数据的过度依赖,从而提高模型的泛化能力。

减少模型的复杂度:正则化技术通过对模型的参数进行惩罚,促使模型更趋向于简单的解。例如,L1 和 L2 正则化会约束模型的权重,使其趋向于稀疏或较小的值,从而减少模型的复杂度。

控制模型的学习速度:正则化技术可以对模型的学习速度进行调节,防止模型在训练过程中权重变化过大,从而导致优化过程不稳定。这有助于加速模型的收敛,并提高模型在训练数据上的表现。

提高模型的鲁棒性:正则化有助于使模型更加鲁棒,即对输入数据的微小变化不敏感。通过降低模型的复杂度,正则化可以减少模型对训练数据中噪声的敏感度,从而提高模型的鲁棒性。

正则化通过在模型的损失函数中引入额外的惩罚项,来对模型的参数,常涉及到对网络的权重进行约束进行约束,从而降低模型的复杂度。这个额外的惩罚通常与模型参数的大小或者数量相关,旨在鼓励模型学习简单的规律,而不是过度拟合训练数据。

L1 正则化:也称为 Lasso 正则化,它通过在模型的损失函数中增加权重的 L1 范数(权重向量的绝对值之和)来实现正则化。L1 正则化倾向于产生稀疏权重矩阵,即将一些权重推向零,从而实现特征选择的效果。

L2 正则化:也称为 Ridge 正则化,它通过在模型的损失函数中增加权重的 L2 范数(权重向量的平方和)来实现正则化。L2 正则化会使权重值变得较小,但不会直接导致权重稀疏,因此不具有特征选择的作用,但可以有效地控制模型的复杂度。

Elastic Net 正则化:Elastic Net 是 L1 和 L2 正则化的组合,它在损失函数中同时使用 L1 和 L2 范数,可以综合两者的优点。

Dropout

:Dropout 是一种特殊的正则化技术,通过在训练过程中随机地丢弃(将其权重置为零)网络中的部分神经元,以及它们的连接,来减少神经网络的复杂度。这样可以防止神经元之间的共适应性,从而减少过拟合。

Dropout的优点:

减少过拟合:通过随机失活部分神经元,阻止网络过度拟合训练数据,从而提高了模型的泛化能力。

简单易用:Dropout 是一种简单而有效的正则化技术,可以直接应用于现有的神经网络模型中,而无需对网络结构进行修改。

早停(Early Stopping):早停是一种简单而有效的正则化方法,它在训练过程中监视模型在验证集上的性能,一旦验证集上的性能开始下降,就停止训练。这样可以避免模型在训练集上过拟合。

数据增强(Data Augmentation):数据增强是通过对训练数据进行变换来增加数据的多样性,从而减少过拟合的风险。例如,在图像分类任务中可以进行随机裁剪、旋转、翻转等操作来增加训练数据的数量和多样性。

批量归一化(Batch Normalization):批量归一化是一种通过对每个批次的输入进行归一化来加速训练并减少过拟合的技术。它可以使得每一层的输入分布稳定,从而更容易优化模型。

权重衰减(Weight Decay):权重衰减是一种通过在损失函数中增加权重的平方和或绝对值之和来实现正则化的技术。它等价于对权重参数进行 L2 正则化。

激活函数:

Sigmod

tanh

Relu

Gelu

GELU:

梯度消失,爆炸:

梯度爆炸

1.激活函数选择(损失函数导数):如果在神经网络中使用了具有饱和性质(如Sigmoid)的激活函数,并且权重初始化不当,则可能会出现数值上溢问题。当反向传播通过每一层传递时,sigmoid函数在中间区域的斜率很敏感变化很大,最终使得梯度变得异常大。

2.参数初始化(激活函数导数):如果权重参数初始化过大,则在前向传播和反向传播过程中都容易造成数值溢出问题。特别是在深层神经网络中,在后面的层级上发生累积效应并放大了初始错误。

3.学习率设置(上一个神经元激活函数):学习率决定了每次迭代更新参数时所采用的步长大小。如果学习率设置太大,每次更新时参数的变化就会非常剧烈,(即权重变大,数值上溢)可能导致梯度值爆炸。

饱和性质的激活函数是指在输入数据较大或较小时,激活函数的导数趋近于0,导致梯度消失或爆炸。这种情况下,神经网络可能会面临训练困难、收敛缓慢等问题。

常见的饱和性质的激活函数有Sigmoid函数和双曲正切(Tanh)函数。它们在输入接近极端值时,导数接近于0。对于Sigmoid函数而言,在输入非常大或非常小时,输出值会趋向于1或-1,并且导数几乎为0;对于Tanh函数而言,在输入非常大或非常小时,输出值也会趋向于1或-1,并且导数同样几乎为0。

解决方法:

使用合适范围内的权重初始化策略

调整学习率小

相比之下,不饱和性质的激活函数没有上述问题并具有更好的表达能力。以下是两个例子:

 ReLU(Rectified Linear Unit):

 ReLU是一种简单但广泛使用的不饱和性质激活函数。当输入为正时,ReLU将保持原始值作为输出;当输入为负时,则返回零作为输出。ReLU在实践中被证明可以有效地解决梯度消失问题,并提高神经网络模型的训练速度与效果。

 Leaky ReLU

 Leaky ReLU是对ReLU的改进,它在输入为负时不返回零,而是返回一个小的非零值。这样可以避免ReLU中出现的“神经元死亡”问题(即某些神经元永远不会被激活),并且有助于增加模型的表达能力。

 总结起来,饱和性质的激活函数可能导致梯度消失或爆炸问题,并且限制了神经网络模型能够学习复杂特征表示的能力。而不饱和性质的激活函数(如ReLU、Leaky ReLU等)则可以解决这些问题,并提供更好的训练效果。选择适当的激活函数取决于具体任务需求和实际情况。

梯度消失:梯度消失是指在深层神经网络中,随着反向传播过程的进行,较早层的权重更新变得非常小或趋近于零,导致这些层对整个网络参数的学习贡献几乎为零。这可能会导致模型无法有效地学习和优化。

解决方法:

使用合适范围内的权重初始化策略。

调整学习率大小。

使用其他类型的激活函数(如Leaky ReLUELU,GELU等),它们能够在负数区间上有一定斜率。

使用批量归一化(Batch Normalization):虽然批量归一化主要是为了解决梯度消失问题,但它通过规范化中间层的激活也可以帮助控制梯度的规模,从而间接地减少梯度爆炸的风险

————————————————

sigmoid激活函数,双曲正切(Tanh)函数在中间区域的斜率很敏感变化很大,最终使得梯度变得异常大  ->ReLU,Leaky ReLU不饱和激活函数

权重参数初始化过大,学习率设置太大导致 爆炸

为了解决梯度爆炸问题,可以采取以下措施:

权重初始化:合理选择权重的初始化方法,例如使用**Xavier(饱和函数)或He(不饱和函数)**等经典的初始化方法,并避免初始权重过大。

激活函数选择:选用具有较小饱和区域并且能够缓解梯度爆炸问题的激活函数(如ReLU、Leaky ReLU)。

梯度裁剪:通过限制梯度值的范围来防止其过大。一种常见做法是设置一个阈值,在反向传播过程中对超出阈值范围的梯度进行裁剪。

调整学习率:降低学习率可以减轻梯度爆炸现象。可以逐步减小学习率或者使用自适应优化算法(如Adam、Adagrad),使得模型在训练过程中更加稳定。

大模型的涌现能力

模型在训练过程中突然表现出的新的、之前未曾预料到的能力。这种现象通常发生在大型模型中,原因是大型模型具有更高的表示能力和更多的参数,可以更好地捕捉数据中的模式和关联。随着模型规模的增加,它们能够自动学习到更复杂、更抽象的概念和规律,从而展现出涌现能力。

原因:

数据量的增加:随着互联网的发展和数字化信息的爆炸增长,可用于训练模型的数据量大大增加。更多的数据可以提供更丰富、更广泛的语言知识和语境,使得模型能够更好地理解和生成文本。

计算能力的提升:随着计算硬件的发展,特别是图形处理器(GPU)和专用的AI芯片(比如:TPU)的出现,计算能力大幅提升。这使得训练更大、更复杂的模型成为可能,从而提高了模型的性能和涌现能力。

模型架构的改进:近年来,一些新的模型架构被引入,比如:Transformer,它在处理序列数据上表现出色。这些新的架构通过引入自注意力机制等技术,使得模型能够更好地捕捉长距离的依赖关系和语言结构,提高了模型的表达能力和生成能力。

预训练和微调的方法:预训练和微调是一种有效的训练策略,可以在大规模无标签数据上进行预训练,然后在特定任务上进行微调。这种方法可以使模型从大规模数据中学习到更丰富的语言知识和语义理解,从而提高模型的涌现能力。

大模型模型结构?

Transformer:基于自注意力机制的模型,包括编码器、解码器和编码器-解码器结构。

GPT系列:基于自注意力机制的生成式预训练模型,采用解码器结构。

BERT系列:基于自注意力机制的转换式预训练模型,采用编码器结构。

T5系列:基于Transformer的编码器-解码器模型。

大模型类型

ChatGLM 大模型:ChatGLM 是一个面向对话生成的大语言模型,适用于构建聊天机器人、智能客服等对话系统。如果你的应用场景需要模型能够生成连贯、流畅的对话回复,并且需要处理对话上下文、生成多轮对话等,ChatGLM 模型可能是一个较好的选择。ChatGLM 的架构为Prefix Decoder,训练语料为中英双语,中英文比例为1:1。所以适合于中文和英文文本生成的任务。

LlaMA 大模型:LLaMA(Large Language Model Meta AI)包含从 7B 到 65B 的参数范围,训练使用多达14,000亿 tokens 语料,具有常识推理、问答、数学推理、代码生成、语言理解等能力。它由一个 Transformer解码器组成。训练预料主要为以英语为主的拉丁语系,不包含中日韩文。所以适合于英文文本生成的任务。

Bert 大模型:Bert 是一种预训练的大语言模型,适用于各种自然语言处理任务,如文本分类、命名实体识别、语义相似度计算等。如果你的任务是通用的文本处理任务,而不依赖于特定领域的知识或语言风格,Bert 模型通常是一个不错的选择。Bert 由一个 Transformer 编码器组成,更适合于 NLU相关的任务。

prefix LMcausal LM、encoder-decoder

区别及各自有什么优缺点?

prefix LM:通过在输入序列前添加可学习的任务相关前缀,引导模型生成适应特定任务的输出。优点是可以减少对预训练模型参数的修改,降低过拟合风险;缺点是可能受到前缀表示长度的限制,无法充分捕捉任务相关的信息。

causal LM:根据之前生成的 token 预测下一个 token,可以生成连贯的文本。优点是可以生成灵活的文本,适应各种生成任务;缺点是无法访问未来的信息,可能生成不一致或有误的内容。

encoder-decoder:由编码器和解码器组成,编码器将输入序列编码为固定长度的向量,解码器根据编码器的输出生成输出序列。优点是可以处理输入和输出序列不同长度的任务,如机器翻译;缺点是模型结构较为复杂,训练和推理计算量较大。

GPT3、LLAMA、ChatGLM 的

Layer Normalization 的区别

是什么?各自的优缺点是什么?

GPT3:采用了Post-Layer Normalization(后标准化)的结构,即先进行自注意力或前馈神经网络的计算,然后进行Layer Normalization。这种结构有助于稳定训练过程,提高模型性能。

LLAMA:采用了Pre-Layer Normalization(前标准化)的结构,即先进行Layer Normalization,然后进行自注意力或前馈神经网络的计算。这种结构有助于提高模型的泛化能力和鲁棒性。

ChatGLM:采用了Post-Layer Normalization的结构,类似于GPT3。这种结构可以提高模型的性能和稳定性。

大模型常用的激活函数有哪些?

ReLU(Rectified Linear Unit):一种简单的激活函数,可以解决梯度消失问题,加快训练速度。

GeLU(Gaussian Error Linear Unit):一种改进的ReLU函数,可以提供更好的性能和泛化能力。

Swish:一种自门控激活函数,可以提供非线性变换,并具有平滑和非单调的特性。

Multi-query Attention 与 Grouped-query Attention

是否了解?区别是什么?

Multi-query Attention和Grouped-query Attention是两种不同的注意力机制变种,用于改进和扩展传统的自注意力机制。

Multi-query Attention:在Multi-query Attention中,每个查询可以与多个键值对进行交互,从而捕捉更多的上下文信息。这种机制可以提高模型的表达能力和性能,特别是在处理长序列或复杂关系时。

Grouped-query Attention:在Grouped-query Attention中,查询被分成多个组,每个组内的查询与对应的键值对进行交互。这种机制可以减少计算复杂度,提高效率,同时仍然保持较好的性能。

多模态大模型是否有接触?落地案例

多模态大模型是指可以处理和理解多种模态数据(如文本、图像、声音等)的模型。落地案例,例如:

OpenAI的DALL-E和GPT-3:DALL-E是一个可以生成图像的模型,而GPT-3可以处理和理解文本。两者结合可以实现基于文本描述生成图像的功能。

Google的Multimodal Transformer:这是一个可以同时处理文本和图像的模型,用于各种多模态任务,如图像字幕生成、视觉问答等。

线性回归模型

假设特征和结果满足线性关系;经过最⼤似然估计推导出来的待优化的⽬标函数与平⽅损失函数是等价的。

岭回归

加入L2正则项,等价于对参数w引入协方差为a的零均值高斯先验,不能做variable selection。

LASSO回归

加入L1正则项,等价于对参数w引入拉普拉斯先验,可以做variable selection。

LR原理

LR是一中常见的用于分类的模型,本质上还是一个线性回归,先把特征线性组合,然后使用sigmoid函数(单调可微)将结果约束到0~1之间,结果用于二分类或者回归预测。

模型参数估计

最大似然估计法估计模型参数,使用梯度下降或者拟牛顿法进行学习。

损失函数

最小化交叉熵误差,等价于最大似然估计

解决非线性分类问题

加核函数或特征变换,显式地把特征映射到高维空间。

SVM原理

一个样本集线性可分的时候,存在无穷个可以将两类数据正确分开,而SVM是通过最大化间隔来选择分类超平面,最大化这个间隔可以构造成一个约束最优化问题,这是一个凸二次规划问题,然后使用拉格朗日乘子法把约束优化问题转为无约束优化问题,令各个变量偏导为0代入拉格朗日函数得到它的对偶问题,最后用SMO算法来求解这个对偶问题。

解对偶问题的好处

一是对偶问题更好解,因为原问题是凸二次规划问题,对偶问题那里只需要求解alpha系数,而alpha系数只有支持向量才非0(KKT条件)。二是自然引入核函数,进而推广到非线性问题。

软间隔

当数据近似线性可分时,可以引入松弛变量,使间隔加上松弛变量大于等于1,针对每一个松弛变量都有一个惩罚。

核技巧

用一个变换把数据从原空间映射到新空间,数据在新空间是线性可分的。由于新空间有可能非常高维甚至无限维,难以计算且难以表示,所以不显式的定义该映射函数,而是定义一个函数把两个样本直接映射到他们在新空间的内积,因为求解对偶问题时只需要用到内积。常用核函数有高斯核、多项式核、线性核、拉普拉斯核、sigmoid核。

核函数的选择

根据专家先验知识,或采用交叉验证,试用不同的核函数(线性核,多项式核和径向基核函数)。

LR与SVM的异同

相同之处

如果不考虑核函数,LR和SVM都是线性分类器,都是监督算法,都是判别模型。

不同之处

损失函数不同,LR使用logistical loss(交叉熵),SVM使用hingeloss,SVM的损失函数自带正则项,而LR则需要自己添加正则项。

解决非线性问题时,SVM采用核函数机制,而LR一般不用,因为复杂核函数需要很大计算量,SVM中只有支持向量参与计算,而LR是全部样本都需要参与计算,若使用核函数计算量太大。

对异常值的敏感度不一样。LR中所有样本都对分类平面有影响,所以异常点的影响会被掩盖。但SVM的分类平面取决于支持向量,如果支持向量受到异常值影响,则结果难以预测。

在高维空间LR的表现比SVM更稳定,因为SVM是要最大化间隔,这个间隔依赖与距离测度,在高维空间时这个距离测度往往不太好。(所以需要做归一化)

分类任务常用的目标函数

交叉熵误差,hinge loss等。

相对熵

也称KL散度,相对熵可以用来衡量两个概率分布之间的差异。

交叉熵

可以用来计算学习模型分布与训练分布之间的差异,交叉熵损失通常适用于Softmax 分类器。最小化相对熵(KL散度)等价于最小化交叉熵,也等价于最大化似然估计。

Hinge loss(折页损失函数)

在二分类情况下,公式如下:L(y) =max(0 , 1–t*y),其中,y是预测值(-1到1之间),t为目标值(1或 -1)。其含义为,y的值在 -1到1之间即可,并不鼓励|y|>1,即让某个样本能够正确分类就可以了,不鼓励分类器过度自信,当样本与分割线的距离超过1时并不会有任何奖励。目的在于使分类器更专注于整体的分类误差。

LR逻辑回归为什么对特征进行离散化

离散特征的增加和减少都很容易,易于模型的快速迭代;

稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

正则项

结构风险最小化

即正则化。在经验风险最小化基础上加上正则项,惩罚复杂的模型。结构风险小同时需要经验风险小和模型简单,如贝叶斯估计中的最大后验概率估计。

经验风险最小化

即误差函数最小,样本数量大时,经验风险最小化学习效果好,如极大似然估计。样本少时会出现过拟合。

范数

其非负性使得它天然适合作为机器学习的正则项。

L1范数:向量中各个元素绝对值之和。

L2范数:向量中各个元素平方和的开二次方根。

Lp范数:向量中各个元素绝对值的p次方和的开p次方根。

L1正则

项目标函数中增加所有权重w参数的绝对值之和, 逼迫更多w为零(也就是变稀疏. L2因为其导数也趋0, 奔向零的速度不如L1给力了),倾向于使参数稀疏化;

L2正则项

倾向于使参数稠密地接近于0,目标函数中增加所有权重w参数的平方之和, 逼迫所有w尽可能趋向零但不为零。

决策树

概念:决策树一种基本的分类和回归方法,呈树形结构,表示基于特征对实例进行分类的过程。决策树的学习过程包括三个步骤:特征选择、决策树的生成以及决策树的修剪(预剪枝和后剪枝)。特征选择的准则是信息增益或者信息增益比(基尼系数)。

ID3生成算法

从根节点开始,对结点结算所有可能的特征的信息增益,选择信息增益最大的特征作为结点特征,然后对子节点递归的调用这个方法,构建决策树。信息增益偏向于选择取值较多的特征,容易过拟合。

C4.5生成算法

与ID3算法相似,用信息增益率(偏好可取值数目较少)来选择特征。小技巧:先找出信息增益高于平均水平的属性,再从中选择增益率最高的。

CART生成算法

全称分类树与回归树,可用于分类也可用于回归。分类树用基尼系数(越小越好)进行特征选择,用最小二乘回归树生成算法生成回归树(结点下所有点的均值作为该结点的预测值)。

基尼指数

反映了从数据集中随机抽取两个样本,其类别标记不一致的概率。因此基尼指数越小,则数据集的纯度越高。

决策树的剪枝

通过极小化决策树整体的损失函数来进行剪枝。从树的叶节点开始向上回缩,假设回缩前树为Ta,回缩到父节点后树为Tb,计算两棵树的损失函数,如果回缩后损失函数变小,则剪枝,把父节点设为叶节点,这样迭代。

随机森林(样本随机性和特征随机性)

原理

由很多棵决策树组成,每棵决策树之间没有关联。每棵树的生成方法是,随机而且有放回地(如果没有放回那就每棵树都训练集完全不相交,太片面)从训练集选取N个(训练集大小为N)训练样本作为训练集,所以每棵树训练集都不一样,但包含重复样本,生成决策树选择特征时,从特征子集里面选择最优的特征用于分裂。得到森林后,输入样本让每棵决策树进行判断,输出结果为被最多决策树选择的分类。

与Bagging区别

与Bagging不一样的是会抽取与样本数目同样大小的样本来训练(Bagging一般少于n),且只用部分特征得到分类器(Bagging用全部特征)。

森林中任意两棵树的相关性

相关性越大,错误率越大。

森林中每棵树的分类能力

每棵树的分类能力越强,整个森林的错误率越低。

随机森林唯一的一个参数

特征个数m,减小m会降低树的相关性和分类能力,增加m两者也会随之增大。

集成学习

Bagging

对原数据有放回抽取,构建出多个样本数据集,训练出多个分类器。

Boosting

使用全部样本(可调权重)依次训练每个学习器, 迭代集成(平滑加权)。通过改变样本分布,对容易错分的数据加强学习,增加错分样本数据的权重。

两者区别:

样本选择不同

Bagging是有放回地抽取数据集,每轮训练集是独立的。而Boosting每一轮的训练集不变,但是训练集中每个样本的权重会发生变化,根据上一轮分类结果调整。

样本权重不同

Bagging每个样本权重相等,Boosting根据错误率不断调整样本的权重,被错分的样本权重会增加。

生成方式不同

Bagging各个分类器可以并行生成,而Boosting只能顺序生成。

优化目标有差异

Bagging减小的是方差,Boosting减小的是偏差。Bagging减小方差是因为对多个用不同训练集得到的分类器取了平均(取平均比单一的方差要小)。Boosting减小偏差是因为每次迭代都在之前误差的基础上进一步降低错误率,所以就是减小偏差,对于训练集的拟合程度好。

Boosting方法

AdaBoost

初始化样本权重,每个样本最开始的权重一样。训练弱分类器,若样本在这次训练中被正确分类,则降低它的权重,反之增加。这样多次训练得到多个弱分类器组成一个强分类器,误差率小的弱分类器拥有更大的权重。

提升树

提升树是迭代多棵回归树来共同决策, 当采用平方误差函数,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树,最后累加所有树的结果作为最终结果。

GBDT

梯度提升树。利用损失函数的负梯度在当前模型的值作为提升树算法的残差的近似值。因为当损失函数不是平方误差时,残差不是简单的真实值减去预测值,把目标函数对当前模型求梯度,就可以得到模型改进的方向,负梯度就可以近似成残差。

XGBoost

基于C++通过多线程实现了回归树的并行构建,并在原有GBDT基础上加以改进,在目标函数增加了正则化项,正则项里包括了树的叶子结点个数、每个叶子结点上输出分数的L2模的平方和,且对目标函数做了二阶泰勒展开,从而极大提升了模型的训练速度和预测精度。

XGBoost为什么要泰勒展开

二阶导数有利于梯度下降更快更准,使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算。简短来说,就是为了统一损失函数求导的形式以支持自定义损失函数。

GBDT和XGBoost的区别

基分类器的选择:GBDT以CART做基分类器,XGBoost还支持线性分类器。

GBDT在优化时只用到了一阶导数信息,XGBoost对目标函数进行了二阶泰勒展开,同时用到一阶和二阶导数。

XGBoost在目标函数里加入了正则项,控制模型的复杂度。

XGBoost可以为缺失值或者指定的值指定分支的默认方向,对特征值有缺失的样本可以自动学习出他的分裂方向。

XGBoost支持并行,可以在特征粒度上并行,在训练前对特征进行分块排序,在寻找最佳分裂点的时候可以并行化计算,大大提升速度。

RF和GBDT的区别

相同点

都是由多棵树组成,最终的结果都是由多棵树一起决定。

不同点

组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成;

组成随机森林的树可以并行生成,而GBDT是串行生成;

随机森林的结果是多棵树投票表决的,而GBDT则是多棵树累加之和;

随机森林对异常值不敏感,而GBDT对异常值比较敏感;

随机森林是减少模型的方差,而GBDT是减少模型的偏差;

XGBoost和LightGBM的区别

XGBoost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是XGBoost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是XGBoost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。

LightGBM使用了基于histogram的决策树算法,这一点不同与XGBoost中的exact算法,histogram算法在内存和计算代价上都有不小优势。

EM算法

定义:在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。

方法:最大期望算法经过两个步骤交替进行计算:第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值; 第二步是最大化(M),最大化在E步上求得的最大似然值来计算参数的值。M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行。

数据预处理

2.缺失值处理
  • 识别缺失值:使用统计方法找出缺失数据的比例和模式。
  • 处理缺失值
    • 删除:如果缺失值不多,可以考虑删除含有缺失值的记录。
    • 填充:使用均值、中位数、众数、前后值填充,或者使用模型预测缺失值。
    • # 填充缺失值

      # 填充缺失值
      df["column"].fillna(df["column"].mean(), inplace=True)  # 均值填充
      df["column"].fillna(df["column"].median(), inplace=True)  # 中位数填充
      df["column"].fillna(df["column"].mode()[0], inplace=True)  # 众数填充
      df["column"].fillna(method="ffill", inplace=True)  # 前值填充
      df["column"].fillna(method="bfill", inplace=True)  # 后值填充
      # 插值填充:根据相邻的非缺失值进行线性或多项式插值。
      df["column"].interpolate(method="linear", inplace=True)  # 线性插值
      df["column"].interpolate(method="polynomial", order=2, inplace=True)  # 二次多项式插值

3. 异常值处理
  • 识别异常值:使用箱线图、Z分数、IQR等方法识别异常值。
  • 处理异常值
    • 删除:如果异常值是错误数据,可以删除。
    • 转换:通过缩放、变换(如对数转换)等方法处理异常值。
4. 数据转换

2. 编码

3. 数据离散化

4. 数据平滑

5. 特征工程

6. 数据类型转换

7. 文本数据转换

这些方法可以根据数据的特性和分析目标进行选择和组合。在进行数据转换时,重要的是要记录下所做的每一步,以便在后续的分析中能够理解和复现这些转换。

  • 数据规范化:将数据缩放到一个范围,如0-1或-1到1之间。
  • 数据编码:将类别数据转换为数值数据,如使用独热编码、标签编码。
  • 数据离散化:将连续数据转换为分类数据,如分桶、分位数转换。
    1. 规范化/标准化 /归一化
  • 确保数据在不同尺度上具有一致性,以防止某些特征对模型的影响过大。

  • 最小-最大规范化(Min-Max Scaling):将数据缩放到一个指定的范围,通常是0到1。
    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()
    df['column_normalized'] = scaler.fit_transform(df[['column']])
    
  • Z分数标准化(Z-score Standardization):将数据转换为均值为0,标准差为1的分布。

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    df['column_standardized'] = scaler.fit_transform(df[['column']])
    
  • 标签编码(Label Encoding):将分类变量转换为数值变量。
    from sklearn.preprocessing import LabelEncoder
    encoder = LabelEncoder()
    df['column_encoded'] = encoder.fit_transform(df['column'])
    
  • 独热编码(One-Hot Encoding):将分类变量转换为一系列的二进制列。
    df = pd.get_dummies(df, columns=['column'])
    
  • 分位数转换:将连续变量转换为基于分位数的分类变量。
    df['column_binned'] = pd.qcut(df['column'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
    
  • 等宽分桶:将连续变量分割成固定宽度的区间。
    pd.cut(df['column'], bins=5)
    
  • 移动平均:计算数据点的平均值以平滑短期波动。
    df['column_smoothed'] = df['column'].rolling(window=5).mean()
    
  • 指数平滑:对数据进行加权平均,使得最近的数据点有更高的权重。
    from statsmodels.tsa.holtwinters import ExponentialSmoothing
    model = ExponentialSmoothing(df['column'], trend='add', seasonal='add', seasonal_periods=12)
    fit = model.fit()
    df['column_smoothed'] = fit.fittedvalues
    
  • 特征构造:根据现有数据创建新的特征。
    df['new_feature'] = df['feature1'] / df['feature2']
    
  • 多项式特征:生成多项式和交互特征。
    from sklearn.preprocessing import PolynomialFeatures
    poly = PolynomialFeatures(degree=2, include_bias=False)
    df_poly = poly.fit_transform(df[['column']])
    
  • 转换为类别型:将数值型数据转换为类别型数据。

    df['column'] = df['column'].astype('category')
    
  • 转换为数值型:将类别型数据转换为数值型数据。
    df['column'] = pd.to_numeric(df['column'], errors='coerce')
    
  • 文本清洗:去除文本数据中的无关字符。
    df['text_column'] = df['text_column'].str.replace(r'\W', ' ', regex=True)
    
  • 文本分词:将文本数据分解为单词或标记。

    df['text_column'] = df['text_column'].str.split()
    
5. 数据整合
  • 合并数据集:将来自不同来源的数据集合并,进行数据对齐。
  • 处理重复数据:识别并删除重复的记录。
6. 数据验证
  • 逻辑验证:确保数据符合业务逻辑和规则。
  • 数据质量报告:生成数据清洗的报告,记录清洗过程中的发现和处理方法。
7. 文本数据清洗(如果涉及)

3. 处理空白字符

4. 去除停用词

5. 词干提取

6. 词形还原

7. 处理缺失值

8. 文本分词

9. 处理非标准字符

示例:综合应用文本数据清洗方法
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
import string

# 下载必要的NLTK数据包
nltk.download('stopwords')
nltk.download('wordnet')
nltk.download('omw-1.4')

# 初始化工具
lemmatizer = WordNetLemmatizer()
stop_words = set(stopwords.words('english'))

def clean_text(text):
    # 转换为小写
    text = text.lower()
    # 去除标点符号
    text = text.translate(str.maketrans('', '', string.punctuation))
    # 去除数字
    text = ''.join([i for i in text if not i.isdigit()])
    # 去除特殊字符
    text = ''.join([char for char in text if char.isalnum() or char.isspace()])
    # 去除多余的空格
    text = ' '.join(text.split())
    # 去除停用词
    text = ' '.join([word for word in text.split() if word not in stop_words])
    # 词形还原
    text = ' '.join([lemmatizer.lemmatize(word) for word in text.split()])
    return text

# 应用清洗函数
cleaned_text = clean_text(raw_text)
正则表达式:

  • 去除无关字符:删除多余的空格、标点符号、特殊字符等。
  • 文本标准化:统一文本格式,如大小写转换、词干提取、词性标注等。
  • 1. 转换为统一格式
  • 转换为小写:将所有文本转换为小写,以消除大小写不一致的问题。
    text = text.lower()
    
  • 2. 去除无关字符
  • 去除标点符号:删除文本中的标点符号。

    import string
    text = text.translate(str.maketrans('', '', string.punctuation))
    
  • 去除数字:删除文本中的所有数字。

    text = ''.join([i for i in text if not i.isdigit()])
    
  • 去除特殊字符:删除文本中的特殊字符或不可见字符。

    text = ''.join([char for char in text if char.isalnum() or char.isspace()])
    
  • 去除多余的空格:删除文本中的多余空格,包括前导空格、尾随空格以及连续的空格。

    text = ' '.join(text.split())
    
  • 删除停用词:去除文本中常见的、不包含太多信息的停用词。
    from nltk.corpus import stopwords
    stop_words = set(stopwords.words('english'))
    text = ' '.join([word for word in text.split() if word not in stop_words])
    
  • 词干提取:将单词还原为基本形式,去除词尾变化。
    from nltk.stem import PorterStemmer
    stemmer = PorterStemmer()
    text = ' '.join([stemmer.stem(word) for word in text.split()])
    
  • 词形还原:将单词的不同形态还原为字典中的标准形式。
    from nltk.stem import WordNetLemmatizer
    lemmatizer = WordNetLemmatizer()
    text = ' '.join([lemmatizer.lemmatize(word) for word in text.split()])
    
  • 填充或删除缺失值:处理文本数据中的缺失值,可以选择填充或删除。
    df['text_column'].fillna(' ', inplace=True)
    
  • 分词:将文本分解为单词或标记。
    text = text.split()
    
  • 转换非标准字符:将非标准的字符转换为标准字符。
    text = unicodedata.normalize('NFKD', text).encode('ascii', 'ignore').decode('utf-8')
    
1. 匹配字符串

匹配邮箱地址

import re

text = "Please contact john.doe@example.com for more information."
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(email_pattern, text)
print(emails)  # 输出: ['john.doe@example.com']
2. 替换文本

3. 分割字符串

4. 提取信息

5. 验证字符串格式

6. 删除不需要的字符

7. 转换文本

在使用正则表达式时,请记住以下几点:

正则表达式的编写和调试可能比较复杂,可以使用在线工具如 regex101 来测试和调试你的正则表达式。

  • 替换电话号码格式

    text = "My phone number is 123-456-7890."
    phone_pattern = r'(\d{3})-(\d{3})-(\d{4})'
    formatted_phone = re.sub(phone_pattern, r'(\1) \2-\3', text)
    print(formatted_phone)  # 输出: My phone number is (123) 456-7890.
    
  • 分割日期

    text = "Today's date is 2023-04-01."
    date_pattern = r'[-]'
    date_parts = re.split(date_pattern, text)
    print(date_parts)  # 输出: ['Today's date is 2023', '04', '01.']
    
  • 提取HTML标签中的内容

    text = "<div>Hello, <a href='http://example.com'>click here</a></div>"
    tag_pattern = r'<a href="([^"]*)">.*?</a>'
    link = re.search(tag_pattern, text)
    if link:
        print(link.group(1))  # 输出: http://example.com
    
  • 验证IPv4地址

    ip_address = "192.168.1.1"
    ip_pattern = r'^(\d{1,3}\.){3}\d{1,3}$'
    if re.match(ip_pattern, ip_address):
        print("Valid IP address")  # 输出: Valid IP address
    
  • 删除字符串中的所有数字

    text = "The price is $100."
    no_digits = re.sub(r'\d+', '', text)
    print(no_digits)  # 输出: The price is $.
    
  • 将文本中的单词首字母大写

    text = "this is a test."
    capitalize_words = re.sub(r'\b(\w)', lambda m: m.group().upper(), text)
    print(capitalize_words)  # 输出: This Is A Test.
    
  • \b 表示单词边界。
  • [] 用于定义字符集。
  • () 用于分组,可以用于后续的引用或操作。
  • | 表示“或”操作。
  • *+? 分别表示匹配前面的字符0次或多次、1次或多次、0次或1次。
  • {m,n} 表示匹配前面的字符至少m次,至多n次。
具体工具和技术
  • 编程语言:Python(Pandas、NumPy、SciPy)、R等。
  • 数据处理库:Pandas库用于数据操作,SciPy和NumPy用于数学运算。
  • 可视化工具:Matplotlib、Seaborn等用于数据可视化,帮助识别异常值和模式

归一化处理

标准化:把特征值变为均值0,方差1

归一化:把每个特征向量的值放缩到相同数值范围,如[0,1]

归一化的作用

加快梯度下降求最优解的速度。因为若两个特征的值区间相差大,数据会呈扁长形,梯度下降很可能会走之字形路线(垂直等高线走)。

可能提高精度。有些分类器依赖于计算样本之间的距离,而区间大特征值对距离影响会更大,但若区间小的特征值才是真正重要的特征,则容易被忽略。

哪些机器学习算法需要归一化

利用梯度下降法求解的模型一般需要归一化,如线性回归、LR、SVM、KNN、神经网络等。树形模型一般不需要归一化,因为他们不关心变量的值(数值缩放不影响分裂位置),而是关心变量的分布,如决策树、随机森林。

如何进行特征选择

特征选择是一个重要的数据预处理过程,主要有两个原因:一是减少特征数量、降维,使模型泛化能力更强,减少过拟合;二是增强对特征和特征值之间的理解.

常见的特征选择方式

去除方差较小的特征;

正则化:L1正则化能够生成稀疏的模型;L2正则化的表现更加稳定,由于有用的特征往往对应系数非零;

稳定性选择:在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果。选择算法可以是回归、SVM或其他类似的方法。

样本不均匀

加权:不同类别分错的代价设为不同。

采样:上采样和下采样,上采样是把小众类复制多份,下采样是从大众类中选取部分样本。

上采样

上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动。

下采样

因为下采样会丢失信息,为了减少信息的损失,第一种方法可以利用模型融合的方法(bagging):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。第二种方法利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。

模型评价指标

TP:正类预测为正类

FN:正类预测为负类

FP:负类预测为正类

TN:负类预测为负类

精确率:预测为正的样本当中有多少预测正确了,P = TP/(TP+FP)

召回率:真正为正的样本当中有多少被预测,R = TP/(TP+FN)

F1值: 综合考虑了精确率和召回率,2/F1 = 1/R + 1/P

ROC:横轴是假阳性,FPR=FP/(FP+TN),真实的反例中,预测为正例的比例;纵轴是真阳性,TPR=TP/(TP+FN),真实的正例中,预测为正例的比例;绘制方法:假设已有一系列样本被分为正类的概率,按概率值从大到小排序,依次将该概率值作为阈值来预测分类,每个阈值都对应一对FPR、TPR,这样一来就能绘制出曲线。

AUC:ROC曲线的面积,AUC大的分类器效果更好。

常用计算距离的方法

欧氏距离:将样本的不同属性之间的差别等同对待,但实际上可能有些属性更重要。适用于各分量的度量标准统一的情况。

曼哈顿距离:两个点在标准坐标系上的绝对轴距之和。计算速度快

切比雪夫距离:国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要的步数叫切比雪夫距离。

聚类

常用方法有:层次的方法(hierarchical method)、划分方法(partitioning method)、基于密度的方法(density-based method)、基于网格的方法(grid-based method)、基于模型的方法(model-based method)等。

经典K-means(划分)算法流程

随机地选择k个对象,每个对象初始地代表了一个簇的中心;

对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;

重新计算每个簇的平均值,更新为新的簇中心;

不断重复ii、iii,直到准则函数收敛。

K个初始类簇点的选取还有两种方法

选择彼此距离尽可能远的K个点;

先对数据用层次聚类算法进行聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。

K值的选择

轮廓系数,求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

经典DBSCAN算法流程

DBSCAN通过检查数据集中每点的Eps邻域来搜索簇,如果点p的Eps邻域包含的点多于MinPts个,则创建一个以p为核心对象的簇;

然后,DBSCAN迭代地聚集从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并;

当没有新的点添加到任何簇时,该过程结束。

K-means与DBSCAN对比

和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点

DBSCAN的主要优点有

可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集;

可以在聚类的同时发现异常点,对数据集中的异常点不敏感;

聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

DBSCAN的主要缺点有

如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合;

如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进;

调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值