数据挖掘与机器学习:数据挖掘算法原理与实践:数据预处理

news2024/11/27 0:47:19

目录

第一关:标准化

任务描述:

相关知识:

一、为什么要进行标准化

二、Z-score标准化

三、Min-max标准化

四、MaxAbs标准化

编程要求:

测试说明:

第二关:非线性转换

任务描述:

相关知识:

一、为什么要非线性转换:

二、映射到均匀分布:

三、映射到高斯分布:

编程要求:

测试说明:

第三关:归一化

任务描述:

相关知识:

一、为什么使用归一化:

二、L1范式归一化:

三、L2范式归一化:

编程要求:

测试说明:

 第四关:离散值编码

任务描述:

相关知识:

一、LabelEncoder:

二、 OneHotEncoder:

编程要求:

测试说明:

第五关:生成多项式特征

任务描述:

相关知识:

一、为什么需要多项式特征:

二、PolynomialFeatures:

编程要求:

测试说明:

第六关:估算缺失值

任务描述:

相关知识:

1.为什么要估算缺失值:

2.Imputer:

编程要求:

测试说明:


第一关:标准化

任务描述:

本关任务:利用sklearn对数据进行标准化。

相关知识:

为了完成本关任务,你需要掌握:1.为什么要进行标准化,2.Z-score标准化,3.Min-max标准化,4.MaxAbs标准化。

一、为什么要进行标准化

对于大多数数据挖掘算法来说,数据集的标准化是基本要求。这是因为,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。实际上,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理。在一个机器学习算法的目标函数里的很多元素所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习。

二、Z-score标准化

这种方法基于原始数据的均值mean和标准差standard deviation进行数据的标准化。将特征A的原始值x使用z-score标准化到x’z-score标准化方法适用于特征A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在0附近,方差值为1。数学公式如下:

 

  1. from sklearn import preprocessing
  2. import numpy as np
  3. X_train = np.array([[ 1., -1., 2.],
  4. [ 2., 0., 0.],
  5. [ 0., 1., -1.]])
  6. X_scaled = preprocessing.scale(X_train)
  7. >>>X_scaled
  8. array([[ 0. ..., -1.22..., 1.33...],
  9. [ 1.22..., 0. ..., -0.26...],
  10. [-1.22..., 1.22..., -1.06...]])

经过缩放后的数据具有零均值以及标准方差:

  1. >>> X_scaled.mean(axis=0)
  2. array([ 0., 0., 0.])
  3. >>> X_scaled.std(axis=0)
  4. array([ 1., 1., 1.])

三、Min-max标准化

 

  1. X_train = np.array([[ 1., -1., 2.],
  2. [ 2., 0., 0.],
  3. [ 0., 1., -1.]])
  4. min_max_scaler = preprocessing.MinMaxScaler()
  5. X_train_minmax = min_max_scaler.fit_transform(X_train)
  6. >>> X_train_minmax
  7. array([[ 0.5 , 0. , 1. ],
  8. [ 1. , 0.5 , 0.33333333],
  9. [ 0. , 1. , 0. ]])

四、MaxAbs标准化

 

编程要求:

在右侧编辑器Begin-End处补充Python代码,实现数据标准化方法,我们会使用实现好的方法对数据进行处理。

测试说明:

我们会调用你实现的方法对数据进行处理,如使用Z-score方法,则处理后数据均值0方差1,如使用minmax方法,则处理后数据最小值0最大值1,如使用maxabs方法,则处理后数据最大值1。我们会对结果进行检测,完全正确则视为通关。

# -*- coding: utf-8 -*-

from sklearn.preprocessing import scale,MaxAbsScaler,MinMaxScaler

#实现数据预处理方法
def Preprocessing(x,y):
    '''
    x(ndarray):处理 数据
    y(str):y等于'z_score'使用z_score方法
           y等于'minmax'使用MinMaxScaler方法
           y等于'maxabs'使用MaxAbsScaler方法
    '''
    #********* Begin *********#
    if y == 'z_score':        
        x = scale(x)
        return x
    elif y == 'minmax':
        min_max_scaler  = MinMaxScaler()
        x = min_max_scaler.fit_transform(x)
        return x
    elif y == 'maxabs':
        maxabs = MaxAbsScaler()
        x = maxabs.fit_transform(x)
        return x


    #********* End *********#

第二关:非线性转换

任务描述:

本关任务:利用sklearn对数据进行非线性转换。

相关知识:

为了完成本关任务,你需要掌握:1.为什么要非线性转换,2.映射到均匀分布,3.映射到高斯分布。

一、为什么要非线性转换:

在上一关中已经提到,对于大多数数据挖掘算法来说,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。非线性转换就是将我们的特征映射到均匀分布或者高斯分布(即正态分布)。

二、映射到均匀分布:

相比线性缩放,该方法不受异常值影响,它将数据映射到了零到一的均匀分布上,将最大的数映射为1,最小的数映射为0。其它的数按从小到大的顺序均匀分布在01之间,如有相同的数则取平均值,如数据为np.array([[1],[2],[3],[4],[5]])则经过转换为:np.array([[0],[0.25],[0.5],[0.75],[1]]),数据为np.array([[1],[2],[9],[10],[2]])则经过转换为:np.array([[0],[0.375],[0.75],[1.0],[0.375]])。第二个例子具体过程如下图:

 在sklearn中使用QuantileTransformer方法实现,用法如下:

  1. from sklearn.preprocessing import QuantileTransformer
  2. import numpy as np
  3. data = np.array([[1],[2],[3],[4],[5]])
  4. quantile_transformer = QuantileTransformer(random_state=666)
  5. data = quantile_transformer.fit_transform(data)
  6. >>>data
  7. array([[0. ],
  8. [0.25],
  9. [0.5 ],
  10. [0.75],
  11. [1. ]])

三、映射到高斯分布:

 

from sklearn.preprocessing import PowerTransformer
import numpy as np
data = np.array([[1],[2],[3],[4],[5]])
pt = PowerTransformer(method='box-cox', standardize=False)
data = pt.fit_transform(data)

学习平台使用的是sklearn 0.19.x,通过对QuantileTransformer设置参数output_distribution='normal'实现映射高斯分布,用法如下:

 

  1. from sklearn.preprocessing import QuantileTransformer
  2. import numpy as np
  3. data = np.array([[1],[2],[3],[4],[5]])
  4. quantile_transformer = QuantileTransformer(output_distribution='normal',random_state=666)
  5. data = quantile_transformer.fit_transform(data)
  6. data = np.around(data,decimals=3)
  7. >>>data
  8. array([[-5.199],
  9. [-0.674],
  10. [ 0. ],
  11. [ 0.674],
  12. [ 5.199]])

编程要求:

根据提示,在右侧编辑器Begin-End处补充Python代码,实现数据非线性转换方法,我们会使用实现好的方法对数据进行处理。

测试说明:

我们会调用你实现好的方法对数据进行处理,如输入数据为:

  1. np.array([[1],[2],[3],[4],[5]])

映射到均匀分布,则处理后结果为:

  1. np.array([[0. ], [0.25],[0.5 ],[0.75],[1. ]])

映射到高斯分布,则处理后结果为:

  1. np.array([[-5.199],[-0.674],[ 0. ],[ 0.674],[ 5.199]])
# -*- coding: utf-8 -*-
from sklearn.preprocessing import QuantileTransformer

#实现非线性转换方法
def non_linear_transformation(x,y):
    '''
    x(ndarray):待处理数据
    y(int):y等于0映射到均匀分布
           y等于1映射到高斯分布
    '''
    #********* Begin *********#
    if y == 0:
        transformer = QuantileTransformer(random_state=666)
        x = transformer.fit_transform(x)
        return x
    elif y == 1:
        transformer = QuantileTransformer(output_distribution='normal',random_state=666)
        x = transformer.fit_transform(x)
        return x

    #********* End *********#

第三关:归一化

任务描述:

本关任务:利用sklearn对数据进行归一化。

相关知识:

为了完成本关任务,你需要掌握:1.为什么使用归一化,2.L1范式归一化,3.L2范式归一化。

一、为什么使用归一化:

归一化是缩放单个样本以具有单位范数的过程。归一化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化的前提。归一化能够加快模型训练速度统一特征量纲避免数值太大。值得注意的是,归一化是对每一个样本做转换,所以是对数据的每一行进行变换。而之前我们讲过的方法是对数据的每一列做变换。

二、L1范式归一化:

 

三、L2范式归一化:

 

编程要求:

根据提示,在右侧编辑器Begin-End处补充Python代码,实现数据归一化方法,我们会使用实现好的方法对数据进行处理。

测试说明:

我们会调用你实现的方法对数据进行处理,如数据为:

  1. data = np.array([[-1,0,1],
  2. [1,0,1],
  3. [1,2,3]])

使用L1归一化则输出为:

  1. array([[-0.5 , 0. , 0.5 ],
  2. [ 0.5 , 0. , 0.5 ],
  3. [ 0.167, 0.333, 0.5 ]])

使用L2归一化则输出为:

  1. array([[-0.707, 0. , 0.707],
  2. [ 0.707, 0. , 0.707],
  3. [ 0.267, 0.535, 0.802]])
# -*- coding: utf-8 -*-

from sklearn.preprocessing import normalize

#实现数据归一化方法
def normalization(x,y):
    '''
    x(ndarray):待处理数据
    y(int):y等于1则使用"l1"归一化
           y等于2则使用"l2"归一化
    '''
    #********* Begin *********#
    if y == 1:
        x = normalize(x,norm='l1')
        return x
    elif y == 2:
        x = normalize(x,norm='l2')
        return x

    #********* End *********#

 第四关:离散值编码

任务描述:

本关任务:利用sklearn对标签进行OneHot编码。

相关知识:

为了完成本关任务,你需要掌握:1. LabelEncoder;2. OneHotEncoder

一、LabelEncoder:

在数据挖掘中,特征经常不是数值型的而是分类型的。举个例子,一个人可能有["male", "female"]["from Europe", "from US", "from Asia"]["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]等分类的特征。这些特征能够被有效地编码成整数,比如["male", "from US", "uses Internet Explorer"]可以被表示为[0, 1, 3]["female", "from Asia", "uses Chrome"]表示为[1, 2, 1]

sklearn中,通过LabelEncoder来实现:

  1. from sklearn.preprocessing import LabelEncoder
  2. label = ['male','female']
  3. int_label = LabelEncoder()
  4. label = int_label.fit_transform(label)
  5. >>>label
  6. array([1, 0])

 

 

二、 OneHotEncoder:

 

import numpy as np
from sklearn.preprocessing import OneHotEncoder
label = np.array([1,0])
label = np.array(label).reshape(len(label),1)#先将X组织成(sample,feature)的格式
onehot_label = OneHotEncoder()
label = onehot_label.fit_transform(label).toarray()
>>>label
array([[0., 1.],
       [1., 0.]])

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,实现OneHot编码方法。

测试说明:

我们会调用你实现的方法对标签进行处理,如标签为:

  1. label = ['male','female']

则经过OneHot编码后的数据为:

  1. array([[0., 1.],
  2. [1., 0.]])
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

def onehot_label(label):
    '''
    input:label(list):待处理标签
    output:lable(ndarray):onehot处理后的标签
    '''
    #********* Begin *********#
    int_label = LabelEncoder()
    label = int_label.fit_transform(label)
    label = np.array(label).reshape(len(label),1)
    onehot_label = OneHotEncoder()
    label = onehot_label.fit_transform(label).toarray()
    return label
   
    #********* End *********#

第五关:生成多项式特征

任务描述:

本关任务:利用sklearn生成多项式特征。

相关知识:

为了完成本关任务,你需要掌握:1.为什么需要多项式特征;2.PolynomialFeatures

一、为什么需要多项式特征:

在数据挖掘中,获取数据的代价经常是非常高昂的。所以有时就需要人为的制造一些特征,并且有的特征之间是有关联的。生成多项式特征可以轻松的为我们获取更多的数据,并获得特征的更高维度和互相间关系的项且引入了特征之间的非线性关系,可以有效的增加模型的复杂度。

二、PolynomialFeatures:

sklearn中通过PolynomialFeatures方法来生成多项式特征,使用方法如下:

  1. import numpy as np
  2. from sklearn.preprocessing import PolynomialFeatures
  3. data = np.arange(6).reshape(3, 2)
  4. poly = PolynomialFeatures(2)#生成二项式特征
  5. data = poly.fit_transform(data)
  6. >>>data
  7. array([[ 1., 0., 1., 0., 0., 1.],
  8. [ 1., 2., 3., 4., 6., 9.],
  9. [ 1., 4., 5., 16., 20., 25.]])

 

  1. import numpy as np
  2. from sklearn.preprocessing import PolynomialFeatures
  3. data = np.arange(6).reshape(3, 2)
  4. poly = PolynomialFeatures(degree=2, interaction_only=True)#degree=n表示生成n项式特征,只需要特征之间交互
  5. data = poly.fit_transform(data)
  6. >>>data
  7. array([[ 1., 0., 1., 0.],
  8. [ 1., 2., 3., 6.],
  9. [ 1., 4., 5., 20.]])

 

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,实现生成多项式特征方法。

测试说明:

我们会调用你实现的方法,将数据生成多项式特征,如数据为:

  1. data = np.arange(6).reshape(3, 2)

则生成二项式特征为:

  1. array([[ 1., 0., 1., 0., 0., 1.],
  2. [ 1., 2., 3., 4., 6., 9.],
  3. [ 1., 4., 5., 16., 20., 25.]])

生成二项式只交互特征为:

  1. array([[ 1., 0., 1., 0.],
  2. [ 1., 2., 3., 6.],
  3. [ 1., 4., 5., 20.]])
# -*- coding: utf-8 -*-
from sklearn.preprocessing import PolynomialFeatures
def polyfeaturs(x,y):
    '''
    x(ndarray):待处理特征
    y(int):y等于0生成二项式特征
           y等于1生成二项式特征,只需要特征之间交互
    '''
    #********* Begin *********#
    if y==0:
        poly = PolynomialFeatures(2)#生成二项式特征
        x = poly.fit_transform(x)
        return x
    elif y==1:
        poly = PolynomialFeatures(degree=2, interaction_only=True)#生成二项式特征,只需要特征之间交互
        x = poly.fit_transform(x)
        return x

    #********* End *********#
        


第六关:估算缺失值

任务描述:

本关任务:利用sklearn对数据估算缺失值。

相关知识:

为了完成本关任务,你需要掌握:1.为什么要估算缺失值,2.Imputer

1.为什么要估算缺失值:

由于各种原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaNs,或者是其他的占位符。但是这样的数据集并不能被sklearn学习算法兼容,因为大多的学习算法都默认假设数组中的元素都是数值,因而所有的元素都有自己的意义。 使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价。 处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值。

2.Imputer:

sklearn中使用Imputer方法估算缺失值,使用方法如下:

  1. from sklearn.preprocessing import Imputer
  2. data = [[np.nan, 2], [6, np.nan], [7, 4],[np.nan,4]]
  3. imp = Imputer(missing_values='NaN', strategy='mean', axis=0)#缺失值为nan,沿着每一列,使用平均值来代替缺失值
  4. data = imp.fit_transform(data)
  5. >>>data
  6. array([[6.5 , 2. ],
  7. [6. , 3.33333333],
  8. [7. , 4. ],
  9. [6.5 , 4. ]])

其中strategy参数用来选择代替缺失值方法:

  1. `mean`表示使用平均值代替缺失值
  2. `median`表示使用中位数代替缺失值
  3. `most_frequent`表示使用出现频率最多的值代替缺失值

missing_values参数表示何为缺失值:

  1. `NaN`表示`np.nan`为缺失值
  2. `0`表示`0`为缺失值

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,实现估算缺失值方法。

测试说明:

我们会调用你实现的估算缺失值方法对数据进行处理,如输入数据为:

  1. data = [[np.nan, 2], [6, np.nan], [7, 4],[np.nan,4]]

则用取平均值方法处理后数据为:

  1. array([[6.5 , 2. ],
  2. [6. , 3.33333333],
  3. [7. , 4. ],
  4. [6.5 , 4. ]])

用取中位数方法处理后数据为:

  1. array([[6.5, 2. ],
  2. [6. , 4. ],
  3. [7. , 4. ],
  4. [6.5, 4. ]])

用出现频率最多的值代替缺失值方法处理后数据为:

  1. array([[6., 2.],
  2. [6., 4.],
  3. [7., 4.],
  4. [6., 4.]])
# -*- coding: utf-8 -*-
from sklearn.preprocessing import Imputer

def imp(x,y):
    '''
    x(ndarray):待处理数据
    y(str):y为'mean'则用取平均方式补充缺失值
           y为'meian'则用取中位数方式补充缺失值
           y为'most_frequent'则用出现频率最多的值代替缺失值        
    '''
    #********* Begin *********#
    if y == 'mean':
        im = Imputer(missing_values='NaN', strategy='mean', axis=0)
        x = im.fit_transform(x)
        return x
    elif y == 'median':
        im = Imputer(missing_values='NaN', strategy='median', axis=0)
        x = im.fit_transform(x)
        return x
    elif y == 'most_frequent':
        im = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
        x = im.fit_transform(x)
        return x


    #********* End *********#

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

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

相关文章

【LeetCode】878. 第 N 个神奇数字

题目描述 一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b ,返回第 n 个神奇的数字。因为答案可能很大,所以返回答案 对 109 7 取模 后的值。 示例 1: 输入:n 1, a 2, b 3 输出&#xff…

stm32cubemx hal学习记录:FreeRTOS互斥量

一、互斥量 1、互斥量用于互锁,可以充当资源保护的令牌,当一个任务希望访问某个资源时,它必须先获取令牌,当任务使用完资源后,必须返还令牌,以便其他任务可以访问该资源。 2、互斥量一般用于临界资源保护…

[附源码]计算机毕业设计JAVA教师档案管理系统

[附源码]计算机毕业设计JAVA教师档案管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

LabVIEW通信-CAN

文章目录CANcan总线特点位定位与同步标识符检验滤波报文传输类型CAN CAN属于OSI的物理层与数据链路层 can总线特点 网络各节点之间的数据通信实时性强 开发周期短 结构简单(只有两根线与外部相连,内部继承了错误探测和管理模块) 数据通信没…

Spring IOC

一、为什么要使用Spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。 为…

RPA案例|云扩助力保险行业开启超自动化运营新阶段

近五年,全球平均保险深度总体呈小幅平稳下降趋势,2021年中国保险深度为4.15%,全球平均保险深度为5.96%,而美国、英国等发达国家的保险深度则保持在10%以上,中国保险深度仍然具有很大的上升空间。 为进一步拓展增量空间…

软考是什么?---2023年软考最全解析

软考是什么? 软考全称为:计算机技术与软件专业技术资格(水平)考试,发证机构为国家人力资源和社会保障部、工业和信息化部,简称为:人社部和工信部。中日韩三国互认,证书的含金量很高…

Navicat操作数据库与Mysql常见命令操作实战

一:Navicat下载与安装 官网下载链接:Navicat 下载完后直接安装即可 二:数据库的连接 1.打开Navicat软件,点击左上角连接按钮,选择mysql数据库 输入完成后双击连接名,连接成功后,小海豚变绿色 …

Advances in Graph Neural Networks笔记5:Dynamic Graph Neural Networks

诸神缄默不语-个人CSDN博文目录 本书网址:https://link.springer.com/book/10.1007/978-3-031-16174-2 本文是本书第五章的笔记。 懒得看了!反正我也不是做这个的。以后要是真的去做动态图了也不是没资源找,这个我懒得看了,就写一…

CentOS 7安装Redis+Springboot整合Redis

1、虚拟环境条件: 已安装VMwareVMware Tools 使用的是视图界面并配置了基本开发环境,参照超详细VMware安装CentOs图文教程_Sq夏颜的博客-CSDN博客 2、直接把已经下载好的redis安装包拖进来,下载地址:CRUG网站 3、解压 tar -zxv…

美国fba海运清关基本流程

美国fba海运清关是美国物流运输的重要组成部分,准备好清关材料和正确流程是确保货物安全快速进口到美国的关键。虽然很多客户会选择双清包税的方式,但是当跨境电商越来越大的时候,双清包税的成本也会相应增加。选择自税不包清关,按…

react配置项目路径别名@

为什么有的项目引入路径写可以,自己的不行呢? 因为别人的项目是配置过路径别名的,就表示src目录,因此我们也需要配置一遍,以下是react项目示范,vue项目同理。 ts对指向src目录的提示是不支持的&#xff0…

Linux命令学习之原来最简单的ls命令这么复杂

ls命令的使用格式如下 ls [选项] [具体的文件] # [] 表示可选 直接在命令行输入ls将当前目录下的列出当前目录下的文件和目录。 1 2 $ls LICENSE README.md hello.c 也可以指定具体的目录和文件 1 2 3 $ls / bin dev home lib32 libx32 mnt proc run srv tmp …

Kotlin 基础学习笔记第七章——运算符重载及其他约定

如你所知,java在标准库中有一些与特定的类相关联的语言特性。例如,实现java.lang.Iterable接口的对象可以在for循环中使用;实现了java.lang.AutoCloseable接口的对象可以在try-with-resource语句中使用。 一、重载算术运算符 1、重载二元运算…

IIC的使用

借鉴于:蓝桥杯嵌入式快速通关篇,IIC通讯及EEPROM_穿上我的格子衫的博客-CSDN博客 IIC原理超详细讲解---值得一看_Z小旋的博客-CSDN博客_iic 总线空闲:SDA 1,SCL 1; 启动信号:SCL 1,SDA 1 -> 0; 停止信号:SCL …

【王道计算机网络笔记】物理层-通信基础

文章目录物理层接口特性典型的数据通信模型数据通信相关术语三种通信方式(交互方式)串行传输&并行传输(数据传输方式)同步传输&异步传输码元速率带宽失真失真的一种现象——码间串扰奈氏准则(奈奎斯特定理&…

矩阵股份上市首日跌破发行价:振幅达10%,王冠为实际控制人

11月22日,矩阵纵横设计股份有限公司(下称“矩阵股份”,SZ:301365)在深圳证券交易所创业板上市。本次上市,矩阵股份的发行价为34.72元/股,发行数量为3000万股,募资总额约为10.42亿元,…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.15 SpringBoot 整合 task

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.15 SpringBoot 整合 task5.15.1 SpringBoot 整合 …

对zygote的理解

一、 zygote的作用 启动SystemServer SystemServer需要用于zygote准备好的一些系统资源,比如常用类、注册的JNI函数、主题资源、共享库等等,直接从zygote那继承过来,SystemServer就不用重新再加载一遍,这样对性能有很大的提升。 …

CRM系统中联系人管理的十大好处

联系人管理通常是你的CRM策略中的一个关键部分。它是存储和组织联系人数据以便于访问的做法。简而言之,就是管理联系人数据的过程。如今联系人管理已内置到 CRM 系统中。因此,我们可以考虑利用系统软件将以下优点应用于联系人管理中。 1、更好、更持久的…