网站建设要做哪些,建设部网站证书查询,工信部2017网站备案,c语言必背100代码在这篇文章中#xff0c;我将介绍些懒惰学习与渴求学习的算法例子#xff0c;会介绍其概念、优缺点以及其python的运用。
一、渴求学习
1.1概念
渴求学习#xff08;Eager Learning#xff09;是指在训练阶段构建出复杂的模型#xff0c;然后在预测阶段运用这个构建出的…在这篇文章中我将介绍些懒惰学习与渴求学习的算法例子会介绍其概念、优缺点以及其python的运用。
一、渴求学习
1.1概念
渴求学习Eager Learning是指在训练阶段构建出复杂的模型然后在预测阶段运用这个构建出的模型来进行预测。在西瓜书中将其翻译为“急切学习”
1.2 优缺点
优点预测效率高因为已经构建好所以直接拿来用即可、适用范围广泛、可解释性强。
缺点训练时间长、对静态数据集有效对于一个动态的数据集渴求学习需要对其频繁计算与训练这样在有些时候是不符合实际需求的、模型更新能力弱。
1.3 常见渴求学习的算法
通常像逻辑回归、决策树、逻辑森林、SVM、深度学习等都属于渴求学习。
二、懒惰学习
1.1 概念
懒惰学习Lazy Learning与传统的渴求学习对应它是一种机器学习的范式。通常地这类学习算法会在训练阶段做极少或压根不做计算而在之后的预测阶段才进行计算。可以说这类学习算法不进行复杂运算而是转向简单的存储并用这些存储去做出决策。
仔细观察我们会发现渴求学习与懒惰学习间实际反应了时间复杂度与空间复杂度间的权衡。在渴求学习中我们在训练阶段就要去构建一个模型此时的时间复杂度通常会很高而到了预测阶段则会相对降低因为此时我们直接使用了那个构建的模型而在整个过程中真正需要去存储的只有那个构建好的模型而不是庞大的训练集而懒惰学习则与之相反它起先时间复杂度很低而后变高因为开始时只要存储数据即可而到了之后的预测阶段才开始构建局部模型去预测所以复杂度升高在整个过程中其空间复杂度都会很高因为它需要存储的不是一个构建好的模型而是整个庞大的训练集。所以在实际运用是可以根据需求找到对于时间与空间之间的平衡点而进行正确的决定。
1.2 优缺点
优点适应性强、灵活性高、训练时间较少。
缺点内存消耗大、可解释性弱。
1.3 常见懒惰学习的算法
1KNN算法
之前我有详细介绍过KNN算法所以在这里我只放一份代码有需要的可以看我以往的文章。代码如下
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt# 加载数据集并分割
iris load_iris()
X iris.data[:, [2, 3]] # 只使用花瓣长度和宽度
y iris.target
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state1, stratifyy)# 标准化
sc StandardScaler()
sc.fit(X_train)
X_train_std sc.transform(X_train)
X_test_std sc.transform(X_test)# KNN实例化
knn KNeighborsClassifier(n_neighbors3, p2, metricminkowski)
knn.fit(X_train_std, y_train)# 预测
y_pred knn.predict(X_test_std)# 计算准确率
accuracy np.mean(y_pred y_test)
print(fAccuracy: {accuracy * 100:.2f}%)# 可视化结果
# 训练集
plt.scatter(X_train_std[y_train0, 0], X_train_std[y_train0, 1], colorred, markero, labelsetosa)
plt.scatter(X_train_std[y_train1, 0], X_train_std[y_train1, 1], colorblue, markerx, labelversicolor)
plt.scatter(X_train_std[y_train2, 0], X_train_std[y_train2, 1], colorgreen, markers, labelvirginica)
# 测试集
plt.scatter(X_test_std[y_test0, 0], X_test_std[y_test0, 1], colorlightcoral, markero, labeltest setosa)
plt.scatter(X_test_std[y_test1, 0], X_test_std[y_test1, 1], colorlightblue, markerx, labeltest versicolor)
plt.scatter(X_test_std[y_test2, 0], X_test_std[y_test2, 1], colorlightgreen, markers, labeltest virginica)
plt.xlabel(Petal length [standardized])
plt.ylabel(Petal width [standardized])
plt.legend(locupper left)
plt.show()
其绘制出的图表为
2局部加权回归LRW
局部加权回归的思路是 在训练阶段不进行计算只存储数据然后到了预测阶段则对于每一个新的输入数据点都根据周围附近的数据点来构建一个局部线性回归模型并对这个输入数据点去预测预测完则作废。
其代码如下
import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据
np.random.seed(42)
X np.linspace(0, 10, 100).reshape(-1, 1)
y np.sin(X).ravel() np.random.normal(0, 0.1, sizeX.shape[0])# LWR算法实现
def lw_regression(X_train, y_train, X_test, tau):# 带宽参数taum X_train.shape[0]weights np.eye(m)for i in range(m):diff X_train[i] - X_testweights[i, i] np.exp(-diff * diff.T / (2.0 * tau * tau))theta np.linalg.solve(X_train.T.dot(weights.dot(X_train)), X_train.T.dot(weights.dot(y_train)))return X_test.dot(theta)# 预测
predictions []
tau 0.1
for point in X:predictions.append(lw_regression(X, y, point, tau))
predictions np.array(predictions)# 可视化结果
plt.figure(figsize(10, 6))
plt.scatter(X, y, colorblue, labelTraining data)
plt.plot(X, predictions, colorred, linewidth2, labelLWR fit)
plt.xlabel(Feature)
plt.ylabel(Target)
plt.title(Locally Weighted Regression (LWR))
plt.legend()
plt.show()
然后代码做出的图表如下 在这里我给出代码的流程图如下 这个流程图就是LWR的主要流程至于整个代码则是分为了三部分生成模拟数据、预测以及可视化。其中关于生成模拟数据的过程中我先设置了随机数种子然后生成了0到10均匀分布的100个点接着将之reshape成一列最后生成正弦波形数据并添加一些正态分布的噪声。
最后我再解释下生成的图像其中蓝色的点是生成的数据点然后红色的曲线是加权回归算法的拟合结果。可以看出局部加权回归算法生成的拟合曲线相当平滑。这是因为算法通过给每个训练样本分配权重并根据权重构建局部线性模型从而减少了噪声的影响。其中关于参数tau是指带宽它控制着参数下降的速度较小的tau值意味着权重随距离的增加而迅速下降这会导致模型更加关注附近的点可能产生过拟合。较大的tau值会使权重衰减得更慢模型会考虑到更远的点可能导致欠拟合。 3懒惰朴素贝叶斯
虽然朴素贝叶斯通常属于渴求学习但是让我们将其所有训练数据保存下来然后在预测时计算每个类别的条件概率而不是预先计算并存储概率分布。那么此时它就属于懒惰学习了。
4懒惰SVM
在训练阶段我们只让它去存储训练数据与支持向量而不去构建决策边界然后在预测阶段根据输入数据与支持向量的关系再去做分类决策那么此时的支持向量机就可以被称为“懒惰SVM”。
除上述外还有懒惰强化学习、懒惰实例基学习、懒惰决策规则等也属于懒惰学习的范畴在此不一一叙述了。
此上