关于懒惰学习与渴求学习的一份介绍

在这篇文章中,我将介绍些懒惰学习与渴求学习的算法例子,会介绍其概念、优缺点以及其python的运用。

一、渴求学习

1.1概念

渴求学习(Eager Learning)是指在训练阶段构建出复杂的模型,然后在预测阶段运用这个构建出的模型来进行预测。(在西瓜书中,将其翻译为“急切学习”)

1.2 优缺点

优点:预测效率高(因为已经构建好,所以直接拿来用即可)、适用范围广泛、可解释性强。

缺点:训练时间长、对静态数据集有效(对于一个动态的数据集,渴求学习需要对其频繁计算与训练,这样在有些时候是不符合实际需求的)、模型更新能力弱。

1.3 常见渴求学习的算法

通常,像逻辑回归、决策树、逻辑森林、SVM、深度学习等都属于渴求学习。

二、懒惰学习

1.1 概念

懒惰学习(Lazy Learning)与传统的渴求学习对应,它是一种机器学习的范式。通常地,这类学习算法会在训练阶段做极少或压根不做计算,而在之后的预测阶段才进行计算。可以说这类学习算法不进行复杂运算而是转向简单的存储并用这些存储去做出决策。

仔细观察,我们会发现渴求学习与懒惰学习间实际反应了时间复杂度与空间复杂度间的权衡。在渴求学习中,我们在训练阶段就要去构建一个模型,此时的时间复杂度通常会很高,而到了预测阶段则会相对降低,因为此时我们直接使用了那个构建的模型,而在整个过程中,真正需要去存储的只有那个构建好的模型,而不是庞大的训练集;而懒惰学习则与之相反,它起先时间复杂度很低,而后变高,因为开始时只要存储数据即可,而到了之后的预测阶段才开始构建局部模型去预测,所以复杂度升高,在整个过程中,其空间复杂度都会很高,因为它需要存储的不是一个构建好的模型而是整个庞大的训练集。所以,在实际运用是可以根据需求找到对于时间与空间之间的平衡点而进行正确的决定。

1.2 优缺点

优点:适应性强、灵活性高、训练时间较少。

缺点:内存消耗大、可解释性弱。

1.3 常见懒惰学习的算法

1)KNN算法

之前,我有详细介绍过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_size=0.3, random_state=1, stratify=y)

# 标准化
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

# KNN实例化
knn = KNeighborsClassifier(n_neighbors=3, p=2, metric='minkowski')
knn.fit(X_train_std, y_train)

# 预测
y_pred = knn.predict(X_test_std)

# 计算准确率
accuracy = np.mean(y_pred == y_test)
print(f'Accuracy: {accuracy * 100:.2f}%')

# 可视化结果
# 训练集
plt.scatter(X_train_std[y_train==0, 0], X_train_std[y_train==0, 1], color='red', marker='o', label='setosa')
plt.scatter(X_train_std[y_train==1, 0], X_train_std[y_train==1, 1], color='blue', marker='x', label='versicolor')
plt.scatter(X_train_std[y_train==2, 0], X_train_std[y_train==2, 1], color='green', marker='s', label='virginica')
# 测试集
plt.scatter(X_test_std[y_test==0, 0], X_test_std[y_test==0, 1], color='lightcoral', marker='o', label='test setosa')
plt.scatter(X_test_std[y_test==1, 0], X_test_std[y_test==1, 1], color='lightblue', marker='x', label='test versicolor')
plt.scatter(X_test_std[y_test==2, 0], X_test_std[y_test==2, 1], color='lightgreen', marker='s', label='test virginica')
plt.xlabel('Petal length [standardized]')
plt.ylabel('Petal width [standardized]')
plt.legend(loc='upper 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, size=X.shape[0])

# LWR算法实现
def lw_regression(X_train, y_train, X_test, tau):# 带宽参数tau
    m = X_train.shape[0]
    weights = np.eye(m)

    for i in range(m):
        diff = X_train[i] - X_test
        weights[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, color='blue', label='Training data')
plt.plot(X, predictions, color='red', linewidth=2, label='LWR 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”。

除上述外,还有懒惰强化学习、懒惰实例基学习、懒惰决策规则等也属于懒惰学习的范畴,在此不一一叙述了。

此上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值