【Python百宝箱】个性化推荐算法探幽:从协同过滤到深度学习,推荐系统库选择指南

个性化推荐:Surprise、LightFM、Implicit、Cornac、TuriCreate、Spotlight全方位解析

前言

在当今数字时代,推荐系统在引导用户发现个性化内容、产品和体验方面发挥着至关重要的作用。本文深入探讨了推荐系统领域的多个先进工具和库,为读者提供了全面而深刻的了解。无论您是开发人员、数据科学家还是对推荐技术感兴趣的业务专业人士,这篇文章将为您揭示推荐系统的最新趋势和最佳实践。

欢迎订阅专栏:Python库百宝箱:解锁编程的神奇世界

文章目录

  • 个性化推荐:Surprise、LightFM、Implicit、Cornac、TuriCreate、Spotlight全方位解析
    • 前言
      • 1. Surprise
        • 1.1 协同过滤
        • 1.2 基于模型的方法
        • 1.3 交叉验证技术
        • 1.4 网格搜索优化参数
        • 1.5 推荐新用户
      • 2. LightFM
        • 2.1 混合模型
        • 2.2 内容加权混合
        • 2.3 整合用户和物品特征
        • 2.4 内置评估指标
        • 2.5 多线程训练
        • 2.6 保存和加载模型
      • 3. Implicit
        • 3.1 隐式反馈
        • 3.2 矩阵分解
        • 3.3 交替最小二乘(ALS)算法
        • 3.4 超参数调优
        • 3.5 使用BM25加权
      • 4. Cornac
        • 4.1 评估指标
        • 4.2 神经推荐模型
        • 4.3 推荐系统中的时间动态
        • 4.4 多样性评估指标
        • 4.5 使用交叉验证
      • 5. TuriCreate
        • 5.1 数据预处理
        • 5.2 基于图的模型
        • 5.3 推荐系统的深度学习
        • 5.4 特征工程和标准化
        • 5.5 模型调参
      • 6. Spotlight
        • 6.1 序列感知推荐
        • 6.2 推荐中的时间效应
        • 6.3 用于序列数据的循环神经网络
    • 总结

1. Surprise

1.1 协同过滤

协同过滤是推荐系统中常用的方法,基于用户或物品的相似性来进行推荐。下面是使用Surprise库实现基于用户的协同过滤的简单示例:

python">from  surprise import Dataset, Reader
from surprise.model_selection import cross_validate
from surprise import KNNBasic

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)

# 使用KNNBasic算法进行基于用户的协同过滤
sim_options = {'name': 'cosine', 'user_based': True}
knn_model = KNNBasic(sim_options=sim_options)

# 交叉验证评估模型性能
cross_validate(knn_model, data, measures=['RMSE'], cv=5, verbose=True)
1.2 基于模型的方法

Surprise支持基于模型的方法,其中矩阵分解是一个常见的技术。以下是一个使用SVD(奇异值分解)的示例:

python">from surprise import SVD
from surprise.model_selection import train_test_split
from surprise import accuracy

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)
trainset, testset = train_test_split(data, test_size=0.2)

# 使用SVD进行矩阵分解
svd_model = SVD()
svd_model.fit(trainset)

# 预测并评估模型性能
predictions = svd_model.test(testset)
accuracy.rmse(predictions)
1.3 交叉验证技术

Surprise支持交叉验证来评估推荐算法的性能。以下是一个交叉验证的示例:

python">from surprise.model_selection import cross_validate
from surprise import KNNBasic

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)

# 使用KNNBasic算法进行交叉验证
sim_options = {'name': 'cosine', 'user_based': True}
knn_model = KNNBasic(sim_options=sim_options)

# 交叉验证评估模型性能
cross_validate(knn_model, data, measures=['RMSE'], cv=5, verbose=True)
1.4 网格搜索优化参数

Surprise库允许使用网格搜索优化模型参数,以提高推荐算法的性能。下面是一个网格搜索的示例,通过调整KNNBasic算法的邻居数量和相似性度量来找到最佳参数组合:

python">from surprise.model_selection import GridSearchCV

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)

# 定义参数网格
param_grid = {'k': [20, 30, 40], 'sim_options': {'name': ['cosine', 'pearson']}}

# 使用网格搜索优化参数
grid_search = GridSearchCV(KNNBasic, param_grid, measures=['RMSE'], cv=3)
grid_search.fit(data)

# 输出最佳参数和性能指标
print(f'Best RMSE Score: {grid_search.best_score["rmse"]}')
print(f'Best Parameters: {grid_search.best_params["rmse"]}')
1.5 推荐新用户

在推荐系统中,当面临新用户时,需要一种方法来为其生成推荐。Surprise库提供了build_anti_testset方法,该方法可以为新用户生成未评分的项目列表。以下是一个示例:

python">from  surprise.model_selection import train_test_split
from surprise import SVD, Dataset, Reader

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)
trainset, testset = train_test_split(data, test_size=0.2)

# 使用SVD进行矩阵分解
svd_model = SVD()
svd_model.fit(trainset)

# 生成新用户的未评分项目列表
new_user_id = 1000
new_user_items = data.build_anti_testset(fill=0)['user_id'] == new_user_id

# 针对新用户进行预测
predictions = svd_model.test(new_user_items)

# 输出推荐结果
print(f'Recommendations for New User {new_user_id}: {predictions}')

通过以上拓展,我们介绍了网格搜索优化参数和为新用户生成推荐的方法,为读者提供更全面的Surprise库使用指南。接下来,我们将深入探讨LightFM库的关键特性。

2. LightFM

2.1 混合模型

LightFM支持混合模型,结合了协同过滤和内容过滤的优势。以下是一个示例:

python">from lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 训练混合模型
model.fit(data['train'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], k=5).mean()
print(f'Precision: {precision}')
2.2 内容加权混合

在LightFM中,您可以使用物品的内容信息对推荐进行加权。以下是一个简单的示例:

python">from  lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 将物品内容信息加入模型
model = model.fit(data['train'], item_features=data['item_features'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], item_features=data['item_features'], k=5).mean()
print(f'Precision: {precision}')
2.3 整合用户和物品特征

LightFM能够整合用户和物品的特征进行推荐。以下是一个示例:

python">from  lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 将用户和物品特征加入模型
model = model.fit(data['train'], user_features=data['user_features'], item_features=data['item_features'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], user_features=data['user_features'], item_features=data['item_features'], k=5).mean()
print(f'Precision: {precision}')
2.4 内置评估指标

LightFM提供了多种内置的评估指标,用于评估模型的性能。以下是一个使用AUC指标的示例:

python">from lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import auc_score

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 训练模型
model = model.fit(data['train'], epochs=30, num_threads=2)

# 使用AUC指标评估模型性能
auc = auc_score(model, data['test'], num_threads=2).mean()
print(f'AUC Score: {auc}')
2.5 多线程训练

为了提高训练速度,LightFM支持多线程训练。以下是一个使用两个线程进行训练的示例:

python">from lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 多线程训练模型
model = model.fit(data['train'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], k=5, num_threads=2).mean()
print(f'Precision: {precision}')
2.6 保存和加载模型

LightFM允许用户保存训练好的模型以备将来使用。以下是保存和加载模型的示例:

python">from  lightfm import LightFM
from lightfm.datasets import fetch_movielens

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 训练模型
model = model.fit(data['train'], epochs=30, num_threads=2)

# 保存模型
model.save('saved_model')

# 加载模型
loaded_model = LightFM()
loaded_model = loaded_model.load('saved_model')

通过这些补充,我们更深入地探讨了LightFM库的特性,包括内容加权混合、整合用户和物品特征、内置评估指标、多线程训练以及保存和加载模型等方面。在接下来,我们将深入研究Implicit库的功能和应用。

3. Implicit

3.1 隐式反馈

Implicit库专注于处理隐式反馈数据的推荐系统。以下是一个简单的使用示例:

python">import implicit
import numpy as np
import scipy.sparse as sparse 

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用ALS算法进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
model.fit(sparse_data)

# 进行推荐
user_id = 0
recommendations = model.recommend(user_id, sparse_data)
print(f'Recommendations for User {user_id}: {recommendations}')
3.2 矩阵分解

Implicit库支持矩阵分解技术,其中ALS(Alternating Least Squares)是其中之一。以下是一个示例:

python">import implicit
import numpy as np
import scipy.sparse as sparse

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用ALS算法进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
model.fit(sparse_data)

# 获取物品的潜在特征向量
item_id = 2
item_vector = model.item_factors[item_id]
print(f'Latent Feature Vector for Item {item_id}: {item_vector}')
3.3 交替最小二乘(ALS)算法

ALS算法是Implicit库中的一种矩阵分解方法。以下是一个示例:

python">import implicit
import numpy as np
import scipy.sparse as sparse

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用ALS算法进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
model.fit(sparse_data)

# 获取用户的潜在特征向量
user_id = 1
user_vector = model.user_factors[user_id]
print(f'Latent Feature Vector for User {user_id}: {user_vector}')
3.4 超参数调优

在Implicit库中,您可以通过调整超参数以优化模型性能。以下是一个使用Grid Search调优ALS算法的示例:

python">import implicit
import numpy as np
import scipy.sparse as sparse
from implicit.evaluation import train_test_split, precision_at_k

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 拆分训练集和测试集
train_data, test_data = train_test_split(sparse_data)

# 定义超参数网格
param_grid = {'factors': [20, 50, 100], 'regularization': [0.01, 0.1, 1.0]}

# 使用Grid Search调优ALS算法
best_precision = 0
best_params = None
for factors in param_grid['factors']:
    for regularization in param_grid['regularization']:
        model = implicit.als.AlternatingLeastSquares(factors=factors, regularization=regularization)
        model.fit(train_data)
        precision = precision_at_k(model, test_data, K=5).mean()
        if precision > best_precision:
            best_precision = precision
            best_params = {'factors': factors, 'regularization': regularization}

print(f'Best Precision: {best_precision}')
print(f'Best Parameters: {best_params}')
3.5 使用BM25加权

在Implicit库中,您可以使用BM25加权来提升推荐性能。以下是一个示例:

python">import implicit
import numpy as np
import scipy.sparse as sparse 

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用BM25加权进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
weighted_data = (sparse_data * 5).astype('double')  # 通过乘以权重来加权
model.fit(weighted_data)

# 进行推荐
user_id = 0
recommendations = model.recommend(user_id, sparse_data)
print(f'Recommendations for User {user_id}: {recommendations}')

通过以上拓展,我们更深入地介绍了Implicit库的功能,包括超参数调优、使用BM25加权等方面。接下来,我们将深入研究Cornac库,了解其评估指标和神经推荐模型。

4. Cornac

4.1 评估指标

Cornac库提供多种评估指标,用于评估推荐系统性能。以下是一个示例:

python">from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.evaluation import BaseMethod, RatioSplit
from cornac.eval_methods import BaseMethod
from cornac.models import MostPop, BPR

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估指标
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0)
most_pop_model = MostPop()
bpr_model = BPR()

# 评估最流行模型
most_pop_results = most_pop_model.evaluate(eval_method)
print(f'Most Popular Model Results: {most_pop_results}')

# 评估BPR模型
bpr_results = bpr_model.evaluate(eval_method)
print(f'BPR Model Results: {bpr_results}')
4.2 神经推荐模型

Cornac支持使用神经网络的推荐模型。以下是一个简单的示例:

python">from cornac.models import NeuMF
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import BaseMethod, RatioSplit

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0)

# 创建NeuMF模型
neumf_model = NeuMF(
    num_factors=8,
    layers=[16, 8, 4],
    act_fn='tanh',
    learner='adam',
    early_stopping=True,
    verbose=True
)

# 训练和评估模型
neumf_model.fit(eval_method)
results = neumf_model.evaluate(eval_method, metric=['precision', 'recall', 'ndcg'])
print(f'NeuMF Model Results: {results}')
4.3 推荐系统中的时间动态

Cornac能够处理推荐系统中的时间动态。以下是一个示例:

python">from cornac.models import TimeSVDpp
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import BaseMethod, RatioSplit

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0, timestamp=True)

# 创建TimeSVD++模型
time_svdpp_model = TimeSVDpp(
    factors=15,
    svdpp_steps=10,
    n_epochs=20,
    init_mean=0,
    init_std_dev=0.1,
    lr_all=0.007,
    reg_all=0.02
)

# 训练和评估模型
time_svdpp_model.fit(eval_method)
results = time_svdpp_model.evaluate(eval_method, metric=['precision', 'recall', 'ndcg'])
print(f'TimeSVD++ Model Results: {results}')
4.4 多样性评估指标

Cornac库还支持多样性评估指标,用于度量推荐结果的多样性。以下是一个示例:

python">from cornac.models import ItemKNN
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import BaseMethod, RatioSplit
from cornac.metrics import Diversity

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0)

# 创建ItemKNN模型
item_knn_model = ItemKNN(k=50, similarity='cosine', name='ItemKNN')

# 训练和评估模型
item_knn_model.fit(eval_method)
results = item_knn_model.evaluate(eval_method, metrics=[Diversity('diversity')])
print(f'ItemKNN Model Diversity: {results["diversity"]}')
4.5 使用交叉验证

Cornac支持交叉验证来评估推荐算法的性能。以下是一个示例:

python">from cornac.models import MostPop
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import CrossValidation

# 数据准备
reader = Reader()
data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = CrossValidation(data=data, num_folds=5, rating_threshold=4.0)

# 创建Most Popular模型
most_pop_model = MostPop()

# 交叉验证评估模型
results = most_pop_model.evaluate(eval_method)
print(f'Most Popular Model Cross-Validation Results: {results}')

通过以上拓展,我们更深入地介绍了Cornac库的功能,包括评估指标、神经推荐模型、推荐系统中的时间动态、多样性评估指标以及使用交叉验证等方面。接下来,我们将深入研究TuriCreate库,了解其数据预处理和基于图的模型。

5. TuriCreate

5.1 数据预处理

TuriCreate提供了方便的数据预处理工具,可用于简化数据准备过程。以下是一个示例:

python">import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 拆分数据集为训练集和测试集
train_data, test_data = tc.recommender.util.random_split_by_user(data, 'userId', 'movieId')    

# 查看数据
print(train_data.head())
5.2 基于图的模型

TuriCreate支持基于图的模型,其中可以使用用户和物品之间的关系进行推荐。以下是一个示例:

python">import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建图对象
graph = tc.SGraph()

# 添加边(用户-物品关系)
graph = graph.add_edges(data, src_field='userId', dst_field='movieId')

# 创建基于图的推荐模型
model = tc.recommender.create(graph, user_id='userId', item_id='movieId', target='rating')
5.3 推荐系统的深度学习

TuriCreate具备深度学习功能,可以用于构建更复杂的推荐系统。以下是一个简单的深度学习推荐模型示例:

python">import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建深度学习推荐模型
model = tc.recommender.create(data, user_id='userId', item_id='movieId', target='rating',
                               ranking_factorization_model='deep', max_iterations=50) 
5.4 特征工程和标准化

TuriCreate支持特征工程和标准化,以提高推荐模型的性能。以下是一个示例:

python">import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建特征
data['interaction'] = data['rating'] * 0.1

# 创建特征工程模型
feature_engineering_model = tc.feature_engineering.create(data, 'interaction')

# 获取转换后的数据
transformed_data = feature_engineering_model.transform(data)

# 标准化数据
normalized_data = tc.toolkits._internal_utils._normalize(transformed_data, ['interaction'])
5.5 模型调参

TuriCreate允许用户调整推荐模型的参数以优化性能。以下是一个示例:

python">import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建深度学习推荐模型
model = tc.recommender.create(data, user_id='userId', item_id='movieId', target='rating',
                               ranking_factorization_model='deep', max_iterations=50, 
                               linear_regularization=0.01, ranking_regularization=0.1)

通过这些补充,我们更深入地介绍了TuriCreate库的功能,包括数据预处理、基于图的模型、推荐系统的深度学习、特征工程和标准化以及模型调参等方面。在接下来,我们将深入研究Spotlight库,了解其序列感知推荐和推荐中的时间效应。

6. Spotlight

6.1 序列感知推荐

Spotlight库适用于考虑用户行为序列的推荐场景。以下是一个示例:

python">from spotlight.interactions import Interactions
from spotlight.cross_validation import random_train_test_split
from spotlight.evaluation import sequence_mrr_score
from spotlight.sequence.implicit import ImplicitSequenceModel

# 读取数据
data = Interactions.from_csv('sequence_data.csv', sep=',')

# 拆分训练集和测试集
train, test = random_train_test_split(data)

# 创建序列感知推荐模型
model = ImplicitSequenceModel(n_iter=3, representation='lstm', loss='bpr')
model.fit(train, verbose=True)

# 评估模型性能
mrr = sequence_mrr_score(model, test)
print(f'Mean Reciprocal Rank (MRR): {mrr}')
6.2 推荐中的时间效应

Spotlight允许在推荐中考虑时间效应。以下是一个带有时间效应的示例:

python">from  spotlight.interactions import Interactions
from spotlight.cross_validation import random_train_test_split
from spotlight.evaluation import precision_recall_score
from spotlight.sequence.implicit import ImplicitSequenceModel

# 读取带时间信息的数据
data = Interactions.from_csv('temporal_data.csv', sep=',', time_col='timestamp')

# 拆分训练集和测试集
train, test = random_train_test_split(data)

# 创建带时间效应的推荐模型
model = ImplicitSequenceModel(n_iter=3, representation='lstm', loss='bpr', use_timestamps=True)
model.fit(train, verbose=True)

# 评估模型性能
precision, recall = precision_recall_score(model, test)
print(f'Precision: {precision}, Recall: {recall}')
6.3 用于序列数据的循环神经网络

Spotlight支持使用循环神经网络(RNN)处理序列数据。以下是一个示例:

python">from   spotlight.interactions import Interactions
from spotlight.cross_validation import random_train_test_split
from spotlight.evaluation import precision_recall_score
from spotlight.sequence.implicit import ImplicitSequenceModel

# 读取序列数据
data = Interactions.from_csv('sequence_data.csv', sep=',')

# 拆分训练集和测试集
train, test = random_train_test_split(data)

# 创建使用RNN的序列推荐模型
model = ImplicitSequenceModel(n_iter=3, representation='rnn', loss='bpr')
model.fit(train, verbose=True)

# 评估模型性能
precision, recall = precision_recall_score(model, test)
print(f'Precision: {precision}, Recall: {recall}')

总结

推荐系统的不断演进为用户提供了更加个性化、智能化的体验。Surprise、LightFM、Implicit、Cornac、TuriCreate和Spotlight等工具的介绍为读者提供了在构建和优化推荐系统时的多种选择。无论是基于协同过滤、深度学习还是考虑时间动态,本文提供的示例代码将帮助读者深入了解并应用这些先进的推荐技术。


http://www.niftyadmin.cn/n/5290418.html

相关文章

Vue 自定义ip地址输入组件

实现效果&#xff1a; 组件代码 <template><div class"ip-input flex flex-space-between flex-center-cz"><input type"text" v-model"value1" maxlength"3" ref"ip1" :placeholder"placeholder"…

计算机网络(第八版)期末复习(第二章物理层)

重要已用加粗表示&#xff0c;这些是复习内容所以并没有包括许多细节&#xff0c;仅包括重要知识点方便快速过。 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体确定与传输媒体的接口的一些特性: 机械特性电气特性功能…

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

守护青山绿水 千巡翼Q20无人机变身护林员

守护青山绿水 千巡翼Q20无人机变身护林员 无人机目前在林业上的应用主要在森林资源调查、森林资源监测、森林火灾监测、森林病虫害监测防治、野生动物监测等方面。传统手段在森林资源调查中需要耗费大量人力物力&#xff0c;利用无人机技术可快速获得所需区域高精度信息&#…

判断电话号码是否重复-excel

有时候重复的数据不需要或者很烦人&#xff0c;就需要采取措施&#xff0c;希望以下的方法能帮到你。 1.判断是否重复 方法一&#xff1a; 1&#xff09;针对第一个单元格输入等号&#xff0c;以及公式countif(查找记录数的范围&#xff0c;需要查找的单元格&#xff09; 2…

私有部署ELK,搭建自己的日志中心(二)-- filebeat的介绍与安装

一、背景 在搭建ELK系统之前&#xff0c;你有必要去了解下&#xff0c;为何大家在agent端普遍青睐filebeat&#xff0c;而把logstash放置于更加靠后端。 轻量级的filebeat&#xff0c;作为agent角色&#xff0c;是安装在每台虚拟机上。 filebeat的学习分为两大部分&#xff1…

快速排序:高效分割与递归,排序领域的王者算法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 快速排序这个名词&#xff0c;快排之所以叫快排肯定是有点东西的。他在处理大规模数据集时表现及其…

网络同步时钟系统的校时方式,您了解多少?

LED电子时钟相信大家应该都很熟悉&#xff0c;在我们生活中随处可见&#xff0c;尤其是在学校、商场、办公楼、高铁站、机场、高速服务器、医院等场所。但是网络时钟系统的校时方式&#xff0c;就没有多少人知道了&#xff0c;下面就给大家介绍网络同步时钟的几种校时方式&…