10 种机器学习算法的要点(附 Python 和 R 代码)

2023-11-07

http://blog.jobbole.com/92021/

本文由  伯乐在线 -  Agatha 翻译, 唐尤华 校稿。未经许可,禁止转载!
英文出处: SUNIL RAY。欢迎加入 翻译组

前言

谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明、更个性化的技术。

也许我们生活在人类历史上最关键的时期:从使用大型计算机,到个人电脑,再到现在的云计算。关键的不是过去发生了什么,而是将来会有什么发生。

工具和技术的民主化,让像我这样的人对这个时期兴奋不已。计算的蓬勃发展也是一样。如今,作为一名数据科学家,用复杂的算法建立数据处理机器一小时能赚到好几美金。但能做到这个程度可并不简单!我也曾有过无数黑暗的日日夜夜。

谁能从这篇指南里受益最多?

我今天所给出的,也许是我这辈子写下的最有价值的指南。

这篇指南的目的,是为那些有追求的数据科学家和机器学习狂热者们,简化学习旅途。这篇指南会让你动手解决机器学习的问题,并从实践中获得真知。我提供的是几个机器学习算法的高水平理解,以及运行这些算法的 R 和 Python 代码。这些应该足以让你亲自试一试了。

我特地跳过了这些技术背后的数据,因为一开始你并不需要理解这些。如果你想从数据层面上理解这些算法,你应该去别处找找。但如果你想要在开始一个机器学习项目之前做些准备,你会喜欢这篇文章的。

广义来说,有三种机器学习算法

1、 监督式学习

工作机制:这个算法由一个目标变量或结果变量(或因变量)组成。这些变量由已知的一系列预示变量(自变量)预测而来。利用这一系列变量,我们生成一个将输入值映射到期望输出值的函数。这个训练过程会一直持续,直到模型在训练数据上获得期望的精确度。监督式学习的例子有:回归、决策树、随机森林、K – 近邻算法、逻辑回归等。

2、非监督式学习

工作机制:在这个算法中,没有任何目标变量或结果变量要预测或估计。这个算法用在不同的组内聚类分析。这种分析方式被广泛地用来细分客户,根据干预的方式分为不同的用户组。非监督式学习的例子有:关联算法和 K – 均值算法。

3、强化学习

工作机制:这个算法训练机器进行决策。它是这样工作的:机器被放在一个能让它通过反复试错来训练自己的环境中。机器从过去的经验中进行学习,并且尝试利用了解最透彻的知识作出精确的商业判断。 强化学习的例子有马尔可夫决策过程。

常见机器学习算法名单

这里是一个常用的机器学习算法名单。这些算法几乎可以用在所有的数据问题上:

  1. 线性回归
  2. 逻辑回归
  3. 决策树
  4. SVM
  5. 朴素贝叶斯
  6. K最近邻算法
  7. K均值算法
  8. 随机森林算法
  9. 降维算法
  10. Gradient Boost 和 Adaboost 算法

1、线性回归

线性回归通常用于根据连续变量估计实际数值(房价、呼叫次数、总销售额等)。我们通过拟合最佳直线来建立自变量和因变量的关系。这条最佳直线叫做回归线,并且用 Y= a *X + b 这条线性等式来表示。

理解线性回归的最好办法是回顾一下童年。假设在不问对方体重的情况下,让一个五年级的孩子按体重从轻到重的顺序对班上的同学排序,你觉得这个孩子会怎么做?他(她)很可能会目测人们的身高和体型,综合这些可见的参数来排列他们。这是现实生活中使用线性回归的例子。实际上,这个孩子发现了身高和体型与体重有一定的关系,这个关系看起来很像上面的等式。

在这个等式中:

  • Y:因变量
  • a:斜率
  • x:自变量
  • b :截距

系数 a 和 b 可以通过最小二乘法获得。

参见下例。我们找出最佳拟合直线 y=0.2811x+13.9。已知人的身高,我们可以通过这条等式求出体重。

线性回归的两种主要类型是一元线性回归和多元线性回归。一元线性回归的特点是只有一个自变量。多元线性回归的特点正如其名,存在多个自变量。找最佳拟合直线的时候,你可以拟合到多项或者曲线回归。这些就被叫做多项或曲线回归。

Python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import linear_model
 
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train = input_variables_values_training_datasets
y_train = target_variables_values_training_datasets
x_test = input_variables_values_test_datasets
 
# Create linear regression object
linear = linear_model.LinearRegression()
 
# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)
 
#Equation coefficient and Intercept
print ( 'Coefficient: n' , linear.coef_)
print ( 'Intercept: n' , linear.intercept_)
 
#Predict Output
predicted = linear.predict(x_test)

R代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train <- input_variables_values_training_datasets
y_train <- target_variables_values_training_datasets
x_test <- input_variables_values_test_datasets
x <- cbind(x_train,y_train)
 
# Train the model using the training sets and check score
linear <- lm(y_train ~ ., data = x)
summary(linear)
 
#Predict Output
predicted= predict(linear,x_test)

2、逻辑回归

别被它的名字迷惑了!这是一个分类算法而不是一个回归算法。该算法可根据已知的一系列因变量估计离散数值(比方说二进制数值 0 或 1 ,是或否,真或假)。简单来说,它通过将数据拟合进一个逻辑函数来预估一个事件出现的概率。因此,它也被叫做逻辑回归。因为它预估的是概率,所以它的输出值大小在 0 和 1 之间(正如所预计的一样)。

让我们再次通过一个简单的例子来理解这个算法。

假设你的朋友让你解开一个谜题。这只会有两个结果:你解开了或是你没有解开。想象你要解答很多道题来找出你所擅长的主题。这个研究的结果就会像是这样:假设题目是一道十年级的三角函数题,你有 70%的可能会解开这道题。然而,若题目是个五年级的历史题,你只有30%的可能性回答正确。这就是逻辑回归能提供给你的信息。

从数学上看,在结果中,几率的对数使用的是预测变量的线性组合模型。

1
2
3
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
ln(odds) = ln(p/(1-p))
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk

在上面的式子里,p 是我们感兴趣的特征出现的概率。它选用使观察样本值的可能性最大化的值作为参数,而不是通过计算误差平方和的最小值(就如一般的回归分析用到的一样)。

现在你也许要问了,为什么我们要求出对数呢?简而言之,这种方法是复制一个阶梯函数的最佳方法之一。我本可以更详细地讲述,但那就违背本篇指南的主旨了。

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#Import Library
from sklearn.linear_model import LogisticRegression
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create logistic regression object
model = LogisticRegression()
 
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
 
#Equation coefficient and Intercept
print ( 'Coefficient: n' , model.coef_)
print ( 'Intercept: n' , model.intercept_)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
logistic <- glm(y_train ~ ., data = x,family='binomial')
summary(logistic)
 
#Predict Output
predicted= predict(logistic,x_test)

更进一步:

你可以尝试更多的方法来改进这个模型:

  • 加入交互项
  • 精简模型特性
  • 使用正则化方法
  • 使用非线性模型

3、决策树

这是我最喜爱也是最频繁使用的算法之一。这个监督式学习算法通常被用于分类问题。令人惊奇的是,它同时适用于分类变量和连续因变量。在这个算法中,我们将总体分成两个或更多的同类群。这是根据最重要的属性或者自变量来分成尽可能不同的组别。想要知道更多,可以阅读:简化决策树

来源: statsexchange

在上图中你可以看到,根据多种属性,人群被分成了不同的四个小组,来判断 “他们会不会去玩”。为了把总体分成不同组别,需要用到许多技术,比如说 Gini、Information Gain、Chi-square、entropy。

理解决策树工作机制的最好方式是玩Jezzball,一个微软的经典游戏(见下图)。这个游戏的最终目的,是在一个可以移动墙壁的房间里,通过造墙来分割出没有小球的、尽量大的空间。

因此,每一次你用墙壁来分隔房间时,都是在尝试着在同一间房里创建两个不同的总体。相似地,决策树也在把总体尽量分割到不同的组里去。

更多信息请见:决策树算法的简化

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import tree
 
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create tree object
model = tree.DecisionTreeClassifier(criterion = 'gini' ) # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini 
 
# model = tree.DecisionTreeRegressor() for regression
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
8
9
library(rpart)
x <- cbind(x_train,y_train)
 
# grow tree
fit <- rpart(y_train ~ ., data = x,method="class")
summary(fit)
 
#Predict Output
predicted= predict(fit,x_test)

4、支持向量机

这是一种分类方法。在这个算法中,我们将每个数据在N维空间中用点标出(N是你所有的特征总数),每个特征的值是一个坐标的值。

举个例子,如果我们只有身高和头发长度两个特征,我们会在二维空间中标出这两个变量,每个点有两个坐标(这些坐标叫做支持向量)。

现在,我们会找到将两组不同数据分开的一条直线。两个分组中距离最近的两个点到这条线的距离同时最优化。

 上面示例中的黑线将数据分类优化成两个小组,两组中距离最近的点(图中A、B点)到达黑线的距离满足最优条件。这条直线就是我们的分割线。接下来,测试数据落到直线的哪一边,我们就将它分到哪一类去。

更多请见:支持向量机的简化

将这个算法想作是在一个 N 维空间玩 JezzBall。需要对游戏做一些小变动:

  • 比起之前只能在水平方向或者竖直方向画直线,现在你可以在任意角度画线或平面。
  • 游戏的目的变成把不同颜色的球分割在不同的空间里。
  • 球的位置不会改变。

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#Import Library
from sklearn import svm
 
#Assumed you have, X (predic
tor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
8
9
library(e1071)
x <- cbind(x_train,y_train)
 
# Fitting model
fit <-svm(y_train ~ ., data = x)
summary(fit)
 
#Predict Output
predicted= predict(fit,x_test)

5、朴素贝叶斯

在预示变量间相互独立的前提下,根据贝叶斯定理可以得到朴素贝叶斯这个分类方法。用更简单的话来说,一个朴素贝叶斯分类器假设一个分类的特性与该分类的其它特性不相关。举个例子,如果一个水果又圆又红并且直径大约是 3 英寸,那么这个水果可能会是苹果。即便这些特性互相依赖或者依赖于别的特性的存在,朴素贝叶斯分类器还是会假设这些特性分别独立地暗示这个水果是个苹果。

朴素贝叶斯模型易于建造,且对于大型数据集非常有用。虽然简单,但是朴素贝叶斯的表现却超越了非常复杂的分类方法。

贝叶斯定理提供了一种从P(c)、P(x)和P(x|c) 计算后验概率 P(c|x) 的方法。请看以下等式:

在这里,

  • P(c|x) 是已知预示变量(属性)的前提下,类(目标)的后验概率
  • P(c) 是类的先验概率
  • P(x|c) 是可能性,即已知类的前提下,预示变量的概率
  • P(x) 是预示变量的先验概率

例子:让我们用一个例子来理解这个概念。在下面,我有一个天气的训练集和对应的目标变量“Play”。现在,我们需要根据天气情况,将会“玩”和“不玩”的参与者进行分类。让我们执行以下步骤。

步骤1:把数据集转换成频率表。

步骤2:利用类似“当Overcast可能性为0.29时,玩耍的可能性为0.64”这样的概率,创造 Likelihood 表格。

步骤3:现在,使用朴素贝叶斯等式来计算每一类的后验概率。后验概率最大的类就是预测的结果。

问题:如果天气晴朗,参与者就能玩耍。这个陈述正确吗?

我们可以使用讨论过的方法解决这个问题。于是 P(会玩 | 晴朗)= P(晴朗 | 会玩)* P(会玩)/ P (晴朗)

我们有 P (晴朗 |会玩)= 3/9 = 0.33,P(晴朗) = 5/14 = 0.36, P(会玩)= 9/14 = 0.64

现在,P(会玩 | 晴朗)= 0.33 * 0.64 / 0.36 = 0.60,有更大的概率。

朴素贝叶斯使用了一个相似的方法,通过不同属性来预测不同类别的概率。这个算法通常被用于文本分类,以及涉及到多个类的问题。

Python代码

1
2
3
4
5
6
7
8
9
10
#Import Library
from sklearn.naive_bayes import GaussianNB
 
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
# Train the model using the training sets and check score
model.fit(X, y)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
8
9
library(e1071)
x <- cbind(x_train,y_train)
 
# Fitting model
fit <-naiveBayes(y_train ~ ., data = x)
summary(fit)
 
#Predict Output
predicted= predict(fit,x_test)

6、KNN(K – 最近邻算法)

该算法可用于分类问题和回归问题。然而,在业界内,K – 最近邻算法更常用于分类问题。K – 最近邻算法是一个简单的算法。它储存所有的案例,通过周围k个案例中的大多数情况划分新的案例。根据一个距离函数,新案例会被分配到它的 K 个近邻中最普遍的类别中去。

这些距离函数可以是欧式距离、曼哈顿距离、明式距离或者是汉明距离。前三个距离函数用于连续函数,第四个函数(汉明函数)则被用于分类变量。如果 K=1,新案例就直接被分到离其最近的案例所属的类别中。有时候,使用 KNN 建模时,选择 K 的取值是一个挑战。

更多信息:K – 最近邻算法入门(简化版)

我们可以很容易地在现实生活中应用到 KNN。如果想要了解一个完全陌生的人,你也许想要去找他的好朋友们或者他的圈子来获得他的信息。

在选择使用 KNN 之前,你需要考虑的事情:

  • KNN 的计算成本很高。
  • 变量应该先标准化(normalized),不然会被更高范围的变量偏倚。
  • 在使用KNN之前,要在野值去除和噪音去除等前期处理多花功夫。

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
#Import Library
from sklearn.neighbors import KNeighborsClassifier
 
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create KNeighbors classifier object model
KNeighborsClassifier(n_neighbors = 6 ) # default value for n_neighbors is 5
 
# Train the model using the training sets and check score
model.fit(X, y)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
8
9
library(knn)
x <- cbind(x_train,y_train)
 
# Fitting model
fit <-knn(y_train ~ ., data = x,k=5)
summary(fit)
 
#Predict Output
predicted= predict(fit,x_test)

7、K 均值算法

K – 均值算法是一种非监督式学习算法,它能解决聚类问题。使用 K – 均值算法来将一个数据归入一定数量的集群(假设有 k 个集群)的过程是简单的。一个集群内的数据点是均匀齐次的,并且异于别的集群。

还记得从墨水渍里找出形状的活动吗?K – 均值算法在某方面类似于这个活动。观察形状,并延伸想象来找出到底有多少种集群或者总体。

K – 均值算法怎样形成集群:

  1. K – 均值算法给每个集群选择k个点。这些点称作为质心。
  2. 每一个数据点与距离最近的质心形成一个集群,也就是 k 个集群。
  3. 根据现有的类别成员,找出每个类别的质心。现在我们有了新质心。
  4. 当我们有新质心后,重复步骤 2 和步骤 3。找到距离每个数据点最近的质心,并与新的k集群联系起来。重复这个过程,直到数据都收敛了,也就是当质心不再改变。

如何决定 K 值:

K – 均值算法涉及到集群,每个集群有自己的质心。一个集群内的质心和各数据点之间距离的平方和形成了这个集群的平方值之和。同时,当所有集群的平方值之和加起来的时候,就组成了集群方案的平方值之和。

我们知道,当集群的数量增加时,K值会持续下降。但是,如果你将结果用图表来表示,你会看到距离的平方总和快速减少。到某个值 k 之后,减少的速度就大大下降了。在此,我们可以找到集群数量的最优值。

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
#Import Library
from sklearn.cluster import KMeans
 
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
# Create KNeighbors classifier object model
k_means = KMeans(n_clusters = 3 , random_state = 0 )
 
# Train the model using the training sets and check score
model.fit(X)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution

8、随机森林

随机森林是表示决策树总体的一个专有名词。在随机森林算法中,我们有一系列的决策树(因此又名“森林”)。为了根据一个新对象的属性将其分类,每一个决策树有一个分类,称之为这个决策树“投票”给该分类。这个森林选择获得森林里(在所有树中)获得票数最多的分类。

每棵树是像这样种植养成的:

  1. 如果训练集的案例数是 N,则从 N 个案例中用重置抽样法随机抽取样本。这个样本将作为“养育”树的训练集。
  2. 假如有 M 个输入变量,则定义一个数字 m<<M。m 表示,从 M 中随机选中 m 个变量,这 m 个变量中最好的切分会被用来切分该节点。在种植森林的过程中,m 的值保持不变。
  3. 尽可能大地种植每一棵树,全程不剪枝。

若想了解这个算法的更多细节,比较决策树以及优化模型参数,我建议你阅读以下文章:

  1. 随机森林入门—简化版
  2. 将 CART 模型与随机森林比较(上)
  3. 将随机森林与 CART 模型比较(下)
  4. 调整你的随机森林模型参数

Python

1
2
3
4
5
6
7
8
9
10
11
12
#Import Library
from sklearn.ensemble import RandomForestClassifier
 
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Random Forest object
model = RandomForestClassifier()
 
# Train the model using the training sets and check score
model.fit(X, y)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
8
9
library(randomForest)
x <- cbind(x_train,y_train)
 
# Fitting model
fit <- randomForest(Species ~ ., x,ntree=500)
summary(fit)
 
#Predict Output
predicted= predict(fit,x_test)

9、降维算法

在过去的 4 到 5 年里,在每一个可能的阶段,信息捕捉都呈指数增长。公司、政府机构、研究组织在应对着新资源以外,还捕捉详尽的信息。

举个例子:电子商务公司更详细地捕捉关于顾客的资料:个人信息、网络浏览记录、他们的喜恶、购买记录、反馈以及别的许多信息,比你身边的杂货店售货员更加关注你。

作为一个数据科学家,我们提供的数据包含许多特点。这听起来给建立一个经得起考研的模型提供了很好材料,但有一个挑战:如何从 1000 或者 2000 里分辨出最重要的变量呢?在这种情况下,降维算法和别的一些算法(比如决策树、随机森林、PCA、因子分析)帮助我们根据相关矩阵,缺失的值的比例和别的要素来找出这些重要变量。

想要知道更多关于该算法的信息,可以阅读《降维算法的初学者指南》

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Import Library
from sklearn import decomposition
 
#Assumed you have training and test data set as train and test
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
# For Factor analysis
#fa= decomposition.FactorAnalysis()
# Reduced the dimension of training dataset using PCA
train_reduced = pca.fit_transform(train)
 
#Reduced the dimension of test dataset
test_reduced = pca.transform(test)
 
#For more detail on this, please refer  this link.

R Code

1
2
3
4
library(stats)
pca <- princomp(train, cor = TRUE)
train_reduced  <- predict(pca,train)
test_reduced  <- predict(pca,test)

10、Gradient Boosting 和 AdaBoost 算法

当我们要处理很多数据来做一个有高预测能力的预测时,我们会用到 GBM 和 AdaBoost 这两种 boosting 算法。boosting 算法是一种集成学习算法。它结合了建立在多个基础估计值基础上的预测结果,来增进单个估计值的可靠程度。这些 boosting 算法通常在数据科学比赛如 Kaggl、AV Hackathon、CrowdAnalytix 中很有效。

更多:详尽了解 Gradient 和 AdaBoost

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
#Import Library
from sklearn.ensemble import GradientBoostingClassifier
 
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Gradient Boosting Classifier object
model = GradientBoostingClassifier(n_estimators = 100 , learning_rate = 1.0 , max_depth = 1 , random_state = 0 )
 
# Train the model using the training sets and check score
model.fit(X, y)
 
#Predict Output
predicted = model.predict(x_test)

R代码

1
2
3
4
5
6
7
library(caret)
x <- cbind(x_train,y_train)
 
# Fitting model
fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
predicted= predict(fit,x_test,type= "prob")[,2]

GradientBoostingClassifier 和随机森林是两种不同的 boosting 树分类器。人们常常问起这两个算法之间的区别。

结语

现在我能确定,你对常用的机器学习算法应该有了大致的了解。写这篇文章并提供 Python 和 R 语言代码的唯一目的,就是让你立马开始学习。如果你想要掌握机器学习,那就立刻开始吧。做做练习,理性地认识整个过程,应用这些代码,并感受乐趣吧!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10 种机器学习算法的要点(附 Python 和 R 代码) 的相关文章

  • css设置背景图片大小_如何使用CSS设置背景图片大小?

    css设置背景图片大小 Introduction 介绍 As we all know that the images are a very responsive yet very creative way to display your w
  • WIN10去除磁盘写保护(只读属性)的步骤

    WIN10去除磁盘写保护 只读属性 的步骤 1 使用管理员权限进入win10的命令模式 使用系统搜索cmd 然后使用管理员模式打开 如下图 点击搜索 2 输入cmd 3 使用鼠标点击使用管理员身份打开 4 打开之后切换到C盘根目录 cd 这
  • 信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(一):为什么要关注损耗?

    一个具有极快上升沿的信号输入到真实传输线中 在从传输线输出的时候上升时间会很长 例如 一个上升时间为50ps的信号 在经过一段36inch长 50Ohm传输线后 上升时间增加到1ns 上升时间的退化是由于传输线的损耗 这也是引起码间干扰 i
  • TypeScript中的泛型(泛型函数、接口、类、泛型约束)

    一 泛型函数 TypeScript泛型是一种可以使代码具有更高的可重用性和泛化能力的特性 通过泛型 我们可以定义一种通用的类型或函数 使其能够应对多种类型的输入 泛型在类 函数 接口等多种场景下都可以使用 具体来说 在定义泛型函数时 我们可
  • 2022年SaaS发展趋势——私有本地化部署

    据麦肯锡 物联网 抓住加速机遇 报告预测 到2030年 物联网将在全球创造最高可达12 6万亿美元的经济价值 随着亚马逊 阿里云等云计算巨头不断加码投入 公有云IoT物联网平台因其低成本 易上手 高可靠等好处而被中小企业决策者广泛认可 然而
  • Vue中全局使用Spin组件

    如何全局使用 1 在man js引入Spin import Spin from ivew 2 将Spin挂载到Vue对象原型上 Vue prototype Spin Spin 3 在子组件调用 this Spin show
  • Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程

    https zhuanlan zhihu com p 24283040 IO密集型任务 VS 计算密集型任务 所谓IO密集型任务 是指磁盘IO 网络IO占主要的任务 计算量很小 比如请求网页 读写文件等 当然我们在Python中可以利用sl
  • prometheus - node_exporter - CPU利用率(入门基础)

    node exporter CPU 一 获取 各种状态 CPU 的使用率 二 所用函数 1 increase time 增量函数 2 sum 叠加函数 3 by 拆分函数 二 计算 CPU 每分钟的 使用率 思路 步骤如下 1 计算CPU的
  • TCP三次握手与四次挥手

    本文主要讲述的是 1 面试官在问到TCP IP三次握手原理 以及为什么要三次握手 两次握手带来的不利后果 2 面试官问TCP IP四次挥手原理 为什么要四次挥手 TCP IP三次握手原理 首先 给张图片 建立TCP IP三次握手的直观印象
  • 计算机专业毕业设计题目大全文库,计算机专业毕业设计论文题目.doc

    计算机专业毕业设计论文题目 doc 由会员分享 可在线阅读 更多相关 计算机专业毕业设计论文题目 doc 43页珍藏版 请在金锄头文库上搜索 1 计计 算算 机机 专专 业业 毕毕 业业 设设 计计 论论 文文 目目 录录 ASP 类计算机
  • 最大股票收益问题(数组最大差问题)

    最大股票收益问题 数组最大差问题 问题描述 给定一个数组 存储着按照时间排序的股票价格 第 i i个位置的元素为第ii次交易时的股票价格 现假设只允许你进行一次买 然后在某一时刻卖出 单只股票 请设计算法 求解你可能获得的最大收益 如果股价
  • Windows下安装Redis

    打开redis中文官方网站 发现都需要安装在linux上 Windows版本的前往github上下载 地址 https github com microsoftarchive redis releases 由于需要外网比较难下载 所以放一个
  • 使用Fragment实现底部菜单的切换

    在做android项目的时候 经常会遇到底部有几个菜单 点击之后 页面上面部分需要展示不同的内容 如下图 在我的这个例子里面 采用了Fragment来展示点击下面菜单之后的不同数据 开发步骤 1 分析页面布局 页面分成底部菜单和上面的展示区
  • 哈工大计算机网络MOOC作业题解答

    第一周 如图所示网络 A在t 0时刻开始向C发送一个2Mbits的文件 B在t 0 1 e秒 e为无限趋近于0的小正实数 向D发送一个1Mbits的文件 忽略传播延迟和结点处理延迟 请回答下列问题 如果图中网络采用存储 转发方式的报文交换
  • conda SSL错误 SSLError,爬虫应用总结

    1 conda SSL错误 SSLError Can t connect to HTTPS URL because the SSL module is not available 解决办法 使用conda环境来运行爬虫程序 因为无法使用电脑
  • 通过小皮面板启动后端php项目和数据库

    1 启动php项目开启后端网站 可去官网下载 下载后就能使用了 官网地址 小皮面板 phpstudy 让天下没有难配的服务器环境 下载完成后打开 php项目需要启动apache或nginx 目前我用的是nginx 可以更改一些配置 先下载后
  • Linux 定期清理内存脚本

    bin bash 清理内存脚本 释放 PageCache echo echo 1 gt proc sys vm drop caches sudo sh 释放 dentries 和 inodes echo echo 2 gt proc sys
  • 5个用于图像处理的Python库

    图像处理是操纵图像以从中提取特征的现象 在当今计算机视觉和深度学习的世界中 大量使用不同的图像处理算法对图像数据集进行边缘检测 识别和分类 有时 这些算法也会逐帧应用于视频 以从中提取特征 在今天的文章中 我们将介绍5个最好的Python库
  • 如何计算单个region server能支持的最大region数

    虽理论上说单个region server能支持最多1000个region 但实际上是不太可能的 RegionServer维护Master分配给它的region 处理对这些region的IO请求 负责切分在运行过程中变得过大的region r

随机推荐

  • git提交代码弹出windows安全中心

    不知道有没有uu和我一样 第一次用git提交代码到码云时 前面都挺好的 突然最后一步来个windows安全中心 我就上网搜 说啥都都有 就是一个用户名密码呗 我想 然后按照网上的方法是github的用户名和密码 我当时还奇怪了这和githu
  • Java设计模式——状态模式

    文章目录 介绍状态模式 状态模式 介绍状态模式 核心思想就是 当对象的状态改变时 同时改变其行为 也就是行为由其状态决定 介绍 意图 允许对象在内部状态发生改变时改变它的行为 对象看起来好像修改了它的类 主要解决 对象的行为依赖于它的状态
  • Java中的8种基本数据类型

    Java基本类型共有八种 基本类型可以分为三类 字符类型char 布尔类型boolean以及数值类型byte short int long float double 数值类型又可以分为整数类型byte short int long和浮点数类
  • 梯度下降算法对比

    损失函数为凸函数时 梯度下降一定可以得到全局最优解
  • Linux shell 暂停执行脚本

    bin bash current path pwd echo 当前路径 current path echo webapps path current path webapps echo 当前路径webapps子目录 webapps path
  • 玩具城

    官园小商品批发市场 路线 地铁2号线 车公庄 红桥市场路线 地铁5号线 天坛东门 来自 ITPUB博客 链接 http blog itpub net 118838 viewspace 625828 如需转载 请注明出处 否则将追究法律责任
  • 【系统】win11怎么退回win10

    根据微软官方提供的回滚方案显示 在升级Win11之后的10天之内 用户可以通过系统恢复选项将Win11还原Win10 操作方式也比较简单 大家可以打开系统设置 找到相应选项 选择并确认后即可轻松将Win11回退早期版本 详细操作步骤如下 一
  • C++学习(四六六)Multiple parse contexts are available for this file

    Note Multiple parse contexts are available for this file Choose the preferred one from the editor menu 参考 Multiple parse
  • Linux基础篇学习——常见系统命令:ls,pwd,cd,date,hwclock,passwd,su,clear,who,w,uname,uptime,last,dmesg,free,ps,top

    ls 显示指定目录中的内容 ls OPTION FILE OPTION a all 显示所有文件包括隐藏文件 l 列出长属性 显示出文件的属性与权限等数据信息 i 列出inode节点号 结合 l使用 d 显示目录本身 且不列出目录中的列表文
  • MD5算法分析及逆向详解

    题外话 最近在看加密与解密 看到加密算法部分 感觉对于初次接触的新手还是有些难度的 故写下该篇文章 算作一个引导吧 新手飘过 老鸟勿笑 基本原理 MD5的典型应用是对一段信息 Message 产生信息摘要 Message Digest 以防
  • springsecurity 获取token流程分析

    一 oauth token password模式获取token源码主要操作 1 定义请求参数 增加请求头 Authorization 否则 在请求参数使用 client id 注意 此头为base64拼接格式为 client id clie
  • 光耦隔离继电器驱动

    一 前言 因为吃亏了 而且不小 发个贴记录下 以后长记性 问题是由于不做光耦隔离 电路不稳定 做了光耦隔离 上电和断电瞬间被隔离器件上电抖动一下 明显不可以 错误的示范我就不发图了 二 环境 12V电源 stm32 驱动舵机 功率不大也不小
  • 一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    原创文章 经验总结 从校招到A厂一路阳光一路沧桑 详情请戳www coderccc com 1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线
  • 在ISO/OSI参考模型中,网络层的主要功能是()----百度2016研发工程师笔试题(六)

    在ISO OSI参考模型中 网络层的主要功能是 正确答案 A 你的答案 A 正确 路由选择 拥塞控制与网络互连 提供可靠的端一端服务 透明地传送报文 数据格式变换 数据加密与解密 数据压缩与恢复 在通信实体之间传送以帧为单位的数据 添加笔记
  • Dynamics 365 安装后续

    之前说到Dynamics365安装时遇到的错误 这里将讲述最后一个错误的解决办法 这里指的是蓝色条选中的错误 根据错误的提示 我们需要去对Reporting Services进行安装和配置 首先说Reporting Services的安装
  • 树莓派Linux内核源码

    前期工作 配置好交叉编译工具链 交叉编译工具链详细教程 树莓派Linux内核源码下载 查看树莓派操作版本命令 uname r 源码下载 一 嵌入式裸机和带操作系统启动过程了解 C51 stm32启动过程 c直接操控底层寄存器实现相关业务 业
  • python代码编写规范

    最近两年的工作都是和运维相关 有时运维人员也会写一些python程序 但基本上都没有遵循相应的代码规范 一向粗暴 能用就行 既不考虑可读性也不考虑可维护性 作为一个开发人员有时候看他们写代码就很不舒服 今天就谈谈python写代码时的一些规
  • beforefieldinit释义

    首先让我们认识什么是 当字段被标记为beforefieldinit类型时 该字段初始化可以发生在任何时候任何字段被引用之前 这句话听起了有点别扭 接下来让我们通过具体的例子介绍
  • 黑苹果oc清除nvram_黑苹果完善之路-英特尔蓝牙「开启/关闭」功能完善教程

    小编开篇提醒 玩转黑苹果有风险 建议随时备份好自己的重要数据 很多机友安装黑苹果之后 打开蓝牙选项却发现 关闭蓝牙 选项是灰色的 无法进行选择 但是一些具有强迫症的机友内心可能会接受不了 所以就此出一期关于英格尔蓝牙驱动相关的详细教程 博通
  • 10 种机器学习算法的要点(附 Python 和 R 代码)

    http blog jobbole com 92021 本文由 伯乐在线 Agatha 翻译 唐尤华 校稿 未经许可 禁止转载 英文出处 SUNIL RAY 欢迎加入 翻译组 前言 谷歌董事长施密特曾说过 虽然谷歌的无人驾驶汽车和机器人受到