当前位置: 首页 > news >正文

广告推荐算法入门 day1 --项目选型

文章目录

  • 0 前言
  • 1 广告推荐的基本流程
  • 2 场景和baseline初步框定
    • 2.1召回场景
    • 2.2排场景
    • 2.3精排场景
  • 3 一个入门小例子感受--淘宝用户购物行为数据可视化分析
    • 3.1 数据集介绍
    • 3.2 数据分析目标
      • 1.时间维度
      • 2.产品维度
      • 3.行为维度
      • 4.用户维度
  • 4 基础项目选型
    • 4.1场景
  • 推荐资料
  • 后记

0 前言

一起学习吖~~
一个好的推荐项目,首先不能是宏大全面囊括的而应该是针对某场景问题针对性拓展的,因此我们应该有场景->baseline ->改进点->效果这几个部分。其中建议说出:每个部分为啥会work?为啥别的别的方法不行?优化方案的增量来自啥(对信息的挖掘还是引入新的信息)?虽然你选了baseline但是你还得了解最前沿是啥?

1 广告推荐的基本流程

我们其实可以分为:召回,精排,粗排这几个方向。
在这里插入图片描述

2 场景和baseline初步框定

2.1召回场景

召回要关注负样本的构造、双塔以及改进,工业用的都是双塔模型,我们的baseline可以选择规则召回/协同过滤。

2.2排场景

数据量不够大没必要加粗排,不建议在自己的项目加粗排。

2.3精排场景

排序侧重:特征交叉率、行为序列类、多目标类和trigger建模类选用传统的机器学习做baseline.
在这里插入图片描述

3 一个入门小例子感受–淘宝用户购物行为数据可视化分析

3.1 数据集介绍

数据获取 数据中有5个维度的字段,其分别表示用户id、商品id、用户行为类型、商品类别以及时间信息。 其中,行为类型分为浏览,收藏,加购物车,购买,对应1,2,3,4
在这里插入图片描述

3.2 数据分析目标

本次分析的目的是从多个维度分析用户数据、行为数据、商品数据,发现能够提升销售的建议。

1.时间维度

分析用户一天或者一周的销售分析,分析出一年内哪个时间段PV和uv值的情况趋势
分析出一年内哪个时间段PV和uv值的情况趋势
你提到的淘宝购物行为分析中涉及的 UVPV,是常用的用户行为统计指标,具体含义如下:


UV(Unique Visitor,独立访客数)

  • 定义:在一定时间范围内,访问某个网站、某个页面或某个商品的不同用户的数量
  • 特点:同一个用户多次访问只计为1,反映的是访问人数。
  • 应用:衡量用户覆盖面和人气,比如某个商品或类目有多少唯一用户关注。

PV(Page View,页面浏览量)

  • 定义:在一定时间范围内,某个网站或页面被访问的总次数
  • 特点:同一个用户多次访问都会被计数,反映的是访问量。
  • 应用:衡量页面的受欢迎程度和用户活跃度,比如商品页面被浏览了多少次。

在电商购物行为分析中的意义

  • UV代表有多少不同的用户对商品或网站产生过兴趣,是广度的指标。
  • PV代表用户浏览的频率和深度,反映用户粘性和活跃度。
  • 高UV+高PV意味着商品或页面既有较多用户关注,也有较高的访问频次,说明热度高。
  • 通过分析UV和PV的变化趋势,可以发现用户关注的时间段、热门商品、潜在用户行为等。


# 计算每天的PV(页面浏览量)
pv = data.groupby('date')['user_id'].count().reset_index()
pv = pv.rename(columns={'user_id': 'pv'})
print("\n每天的PV(前5行):")
print(pv.head())# 计算每天的UV(独立访客数)
uv = data.groupby('date')['user_id'].apply(lambda x: len(x.unique())).reset_index()
uv = uv.rename(columns={'user_id': 'uv'})
print("\n每天的UV(前5行):")
print(uv.head())# 可视化PV和UV趋势图
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(10,8))
pv.plot(x='date', y='pv', ax=axes[0], color='red', legend=False)
axes[0].set_title('每日PV')
uv.plot(x='date', y='uv', ax=axes[1], color='green', legend=False)
axes[1].set_title('每日UV')
plt.xticks(rotation=45)
plt.tight_layout()

在这里插入图片描述
按照月PV和UV我们发现12月12日是一个高PV和高UV的时间段,可能和营销活动有关。


# 计算每小时的PV
pv_hour = data.groupby('hour')['user_id'].count().reset_index()
pv_hour = pv_hour.rename(columns={'user_id': 'pv_hour'})
print("\n每小时PV:")
print(pv_hour)# 计算每小时的UV
uv_hour = data.groupby('hour')['user_id'].apply(lambda x: len(x.unique())).reset_index()
uv_hour = uv_hour.rename(columns={'user_id': 'uv_hour'})
print("\n每小时UV:")
print(uv_hour)# 每小时PV折线图
plt.figure(figsize=(10,5))
plt.plot(pv_hour['hour'], pv_hour['pv_hour'], color='blue', linewidth=1, linestyle='-')
plt.title('每小时PV情况分布')
plt.xlabel('小时')
plt.ylabel('PV')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

在这里插入图片描述

按照每日的小时划分,用户主要活跃在19-23这个期间。


# 选取2014-12-12这一天的数据
data_1212 = data[data['date'] == '2014-12-12']# 该日每小时PV
hour_1212 = data_1212.groupby('hour')['user_id'].count().reset_index()
hour_1212 = hour_1212.rename(columns={'user_id': 'hour_1212'})
print("\n2014-12-12 每小时PV:")
print(hour_1212)# 该日每小时UV
uv_hour_1212 = data_1212.groupby('hour')['user_id'].apply(lambda x: len(x.unique())).reset_index()
uv_hour_1212 = uv_hour_1212.rename(columns={'user_id': 'uv_hour_1212'})
print("\n2014-12-12 每小时UV:")
print(uv_hour_1212)# 绘制2014-12-12 每小时UV折线图
plt.figure(figsize=(10,5))
plt.plot(uv_hour_1212['hour'], uv_hour_1212['uv_hour_1212'], color='red')
plt.title('2014-12-12 每小时UV')
plt.xlabel('小时')
plt.ylabel('UV')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

在这里插入图片描述
单独查看双十二当天,发现在8:30出现跃升发,可能是活动影响。

2.产品维度

分为热搜产品和类别(浏览量前十的商品),热卖产品和类别(购买量前十的商品),分析商品推送是否有效 。

# 计算每种行为的 one-hot 编码列
one_hot_df = pd.get_dummies(data['behavior_type'])# 拼接 user_id, item_id 和 one-hot 编码
user_item_behavior_df = pd.concat([data[['user_id', 'item_id']], one_hot_df], axis=1)# 浏览量前十商品(行为类型1)
top1_10 = user_item_behavior_df.groupby('item_id')[1].sum().sort_values(ascending=False).head(10)
print("\n浏览量前十商品及数量:")
print(top1_10)# 购买量前十商品(行为类型4)
top4_10 = user_item_behavior_df.groupby('item_id')[4].sum().sort_values(ascending=False).head(10)
print("\n购买量前十商品及数量:")
print(top4_10)# 浏览量前十商品对应的购买量
pv_10_buy = []
for item_id in top1_10.index:buy_count = user_item_behavior_df.loc[user_item_behavior_df['item_id'] == item_id, 4].sum()pv_10_buy.append({'商品ID': item_id, '购买量': buy_count})print("\n浏览量前十商品对应购买量:")
print(pv_10_buy)# 购买量前十商品对应的浏览量
buy_10_pv = []
for item_id in top4_10.index:pv_count = user_item_behavior_df.loc[user_item_behavior_df['item_id'] == item_id, 1].sum()buy_10_pv.append({'商品ID': item_id, '浏览量': pv_count})print("\n购买量前十商品对应浏览量:")
print(buy_10_pv)

在这里插入图片描述
在这里插入图片描述

3.行为维度

行为维度主要是分析行为转化率 用户维度分为FRM分析模型对用户进行分解,分析出用户的购买时间,购买频数,购买金额。

# 按行为类型和小时统计用户数(PV)
behavior = data.groupby(['behavior_type', 'hour'])['user_id'].count().reset_index()
behavior = behavior.rename(columns={'user_id': 'count'})print("按行为类型和小时统计的行为计数:")
print(behavior.head())# 设置matplotlib 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']# 创建子图,2行1列,共享x轴
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(10, 8))# behavior_type==1的数据画在第一个子图(一般代表浏览)
sns.lineplot(x='hour', y='count', hue='behavior_type', data=behavior[behavior.behavior_type == 1], ax=axes[0])
axes[0].set_title('行为类型为1的小时分布')# behavior_type!=1的数据画在第二个子图
sns.lineplot(x='hour', y='count', hue='behavior_type', data=behavior[behavior.behavior_type != 1], ax=axes[1])
axes[1].set_title('行为类型不为1的小时分布')plt.tight_layout()
plt.show()# 计算各行为类型总计数
behavior_type = data.groupby('behavior_type')['user_id'].count()print("\n各行为类型计数:")
print(behavior_type)# 提取各行为数值(确保索引存在,否则会报错)
look_num = behavior_type.get(1, 0)
hide_num = behavior_type.get(2, 0)
add_num = behavior_type.get(3, 0)
buy_num = behavior_type.get(4, 0)# 计算转化率
look_hide = hide_num / look_num if look_num else 0
look_add = add_num / look_num if look_num else 0
look_buy = buy_num / look_num if look_num else 0
ha_buy = buy_num / (hide_num + add_num) if (hide_num + add_num) else 0print(f'浏览-收藏的转化率:{look_hide:.4f}')
print(f'浏览-加购的转化率:{look_add:.4f}')
print(f'浏览-购买的转化率:{look_buy:.4f}')
print(f'收藏加购-购买的转化率:{ha_buy:.4f}')# 选取2014-12-12这一天数据
data_1212 = data.loc[data['date'] == '2014-12-12']behavior_type_1212 = data_1212.groupby('behavior_type')['user_id'].count()
print("\n2014-12-12 各行为类型计数:")
print(behavior_type_1212)look_num = behavior_type_1212.get(1, 0)
hide_num = behavior_type_1212.get(2, 0)
add_num = behavior_type_1212.get(3, 0)
buy_num = behavior_type_1212.get(4, 0)look_hide = hide_num / look_num if look_num else 0
look_add = add_num / look_num if look_num else 0
look_buy = buy_num / look_num if look_num else 0
ha_buy = buy_num / (hide_num + add_num) if (hide_num + add_num) else 0print(f'2014-12-12 浏览-收藏的转化率:{look_hide:.4f}')
print(f'2014-12-12 浏览-加购的转化率:{look_add:.4f}')
print(f'2014-12-12 浏览-购买的转化率:{look_buy:.4f}')
print(f'2014-12-12 收藏加购-购买的转化率:{ha_buy:.4f}')

在这里插入图片描述
从以上两个图可以看出四条行为类型的的趋势项接近,浏览量高的时候,购买和加购收藏的也逐渐提高, 四条线都是10-16处于平稳,无论是点击量,加购收藏量,还是购买量都在这个时间段处于不怎么波动状态。 而18-23点可以明显感觉到点击量上涨的很快,同样加购收藏也随之增多,购买量也有一定的上升坡度。
在这里插入图片描述

4.用户维度


import pandas as pd
import matplotlib.pyplot as plt# 假设 data 已经加载,包含至少列 ['user_id', 'behavior_type', 'date']# 计算每个用户的购买次数(行为类型为4代表购买)
user_buy_num = data[data.behavior_type == 4].groupby('user_id')['behavior_type'].count().reset_index()
user_buy_num = user_buy_num.rename(columns={'behavior_type': 'count'})print("用户购买次数统计(前5条):")
print(user_buy_num.head())plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体# 用户购买次数分布图(用户id作为x轴,购买次数作为y轴)
user_buy_num.plot(x='user_id', y='count', kind='bar', color='blue', figsize=(12, 5), legend=False)
plt.title('用户购买次数情况')
plt.xlabel('用户ID')
plt.ylabel('购买频次')
plt.tight_layout()
plt.show()# 计算不同用户购物的天数(去重日期)
user_buy_n = data[data.behavior_type == 4].groupby('user_id')['date'].apply(lambda x: len(x.unique())).reset_index()
user_buy_n = user_buy_n.rename(columns={'date': 'count'})print("\n各用户购买天数统计(前5条):")
print(user_buy_n.head())# 计算复购用户数量比例(购买天数大于1的用户比例)
d_rate = (user_buy_n['count'] > 1).sum() / user_buy_n['count'].count()
print(f"\n复购用户比例:{d_rate:.4f}")# 计算用户每日购买次数(行为类型为4)
data1 = data.copy()
data1['action'] = 1  # 把每条行为标记为1,方便count计数user_buy_d = data1[data1.behavior_type == 4].groupby(['user_id', 'date'])['action'].count().reset_index()
print("\n用户每日购买次数(前5条):")
print(user_buy_d.head())# 计算每个用户复购的间隔天数
# 这里 date 需要转换为 datetime 类型,如果还没转换:
user_buy_d['date'] = pd.to_datetime(user_buy_d['date'])user_buy_p = user_buy_d.groupby('user_id')['date'].apply(lambda x: x.sort_values().diff().dropna())
print("\n复购间隔天数示例(部分):")
print(user_buy_p.head())# 绘制复购周期分布图
plt.rcParams['font.sans-serif'] = ['SimHei']
user_buy_p.value_counts().sort_index().plot(kind='bar', figsize=(10, 5))
plt.xlabel('复购间隔天数')
plt.ylabel('用户数量')
plt.title('复购周期分布')
plt.tight_layout()
plt.show()# 重置索引,准备合并
user_buy_p = user_buy_p.reset_index()
user_buy_p = user_buy_p.drop(columns='level_1')
user_buy_p = user_buy_p.rename(columns={'date': 'date_diff'})print("\n处理后的复购周期数据(前5条):")
print(user_buy_p.head())# 合并购买次数和复购间隔
rfm = pd.merge(user_buy_num, user_buy_p, on='user_id')
print("\n合并后的RFM数据(前5条):")
print(rfm.head())# 给复购间隔和购买次数打分,分成两组,qcut分位数切分
# 复购间隔是 Timedelta,需要转换成天数
rfm['date_days'] = rfm['date_diff'].dt.days# 对复购间隔打分,天数越少分越高(这里labels倒过来)
rfm['score_date'] = pd.qcut(rfm['date_days'], 2, labels=['1', '0'])
# 对购买次数打分,次数越多分越高
rfm['score_count'] = pd.qcut(rfm['count'], 2, labels=['0', '1'])# 合并打分,形成rfm标签
rfm['rfm'] = rfm['score_count'].astype(str) + rfm['score_date'].astype(str)print("\nRFM打分示例(前5条):")
print(rfm[['user_id', 'count', 'date_days', 'score_count', 'score_date', 'rfm']].head())# 根据rfm标签映射用户类型
rfm = rfm.assign(user_type=rfm['rfm'].map({'11': '重要客户','01': '保持客户','10': '发展客户','00': '挽留客户'
}))# 汇总用户类型数量
type_sum = rfm.groupby('user_type')['rfm'].count().reset_index(name='count')
print("\n用户类型统计:")
print(type_sum)# 绘制用户类型柱状图
type_sum.plot(x='user_type', y='count', kind='bar', legend=False, figsize=(8, 5))
plt.xlabel('用户类型')
plt.ylabel('用户数量')
plt.title('用户分类统计')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()# 计算用户每日各行为次数
user_day_buy = data1.groupby(['date', 'user_id', 'behavior_type'])['action'].count().reset_index()
user_day_buy = user_day_buy.rename(columns={'action': 'count'})print("\n用户每日各行为次数(前5条):")
print(user_day_buy.head())# 计算ARPU(每日购买总数 / 当日活跃用户数)
ARPU = user_day_buy.groupby('date').apply(lambda x: x[x['behavior_type'] == 4]['count'].sum() / x['user_id'].nunique()
).reset_index(name='rate')print("\nARPU(前5条):")
print(ARPU.head())ARPU.plot(x='date', y='rate', color='pink', figsize=(10, 5))
plt.title('每日收益转化效率(ARPU)')
plt.xlabel('日期')
plt.ylabel('ARPU值')
plt.tight_layout()
plt.show()# 计算每日消费用户人数和下单率
user_day_buy1 = data[data.behavior_type == 4].groupby(['date', 'user_id'])['behavior_type'].count().reset_index()
user_day_buy1 = user_day_buy1.rename(columns={'behavior_type': 'count'})buy_rate = user_day_buy1.groupby('date').apply(lambda x: x['count'].sum() / x['user_id'].count()  # 总购买次数 / 购买用户数,代表平均购买频次
).reset_index(name='rate')print("\n每日平均购买频次(下单率)前5条:")
print(buy_rate.head())plt.rcParams['font.sans-serif'] = ['SimHei']
buy_rate.plot(x='date', y='rate', color='pink', figsize=(10, 5))
plt.title('每日下单率')
plt.xlabel('日期')
plt.ylabel('平均购买频次')
plt.tight_layout()
plt.show()

①购买频次
在这里插入图片描述

②复购率 = 复购用户数量 / 有购买行为的用户数量
复购间隔是用户最新一次购买时间和上一次购买时间的间隔。复购间隔=最新一次购物时间-上一次购物时间
在这里插入图片描述
③RFM思想是用时间(Recency)、频次(Frequency)、金额(Monetary)三个指标,量化用户行为,分层划分客户价值,从而帮助企业精准营销和客户管理的一种经典模型和方法。
在这里插入图片描述

在这里插入图片描述
④计算平台的每日活跃用户对每日收益的转化效率,APRU=日总的购买次数/日登录次数
在这里插入图片描述

⑤下单率=日购买的用户数总数/日总的登录次数
在这里插入图片描述
根据上图的下单率可知在1212那天有一个下单高峰,其他大部分时间下单率处于2.25-2.50之间。

4 基础项目选型

4.1场景

开源项目?目前比较火的开源的新闻推荐系统,但是我更偏向的是电商系统。尚硅谷有个电商推荐系统 ,但是我感觉偏向于开发而不是算法,之前有尝试过开发,因此不想将时间花费在开发环境配置上面。
比赛项目?这大概是最可取的,但是比赛的场景有点过于极端,我最开始就是选取的有个OTTO比赛,后来发现确实展现不了个人思考。
自己手搓一个?我更倾向于这个,那应该会很有意思。结合我自己的背景(对LLama模型较为熟悉且组里有足够的资源),或许能否选一个合适的场景,合适的数据集;然后自己实验LLMma等替换获得更好的效果呢??
所以,接下来:我们需要多看论文,选定场景和数据集和baseline!✌

推荐资料

https://github.com/Doragd/Algorithm-Practice-in-Industry

后记

”越知道知识的广阔,越觉察自己的浅陋”
学习新的知识往往是又惊喜又伤心的(物理层面上表现为热泪盈眶),惊喜是我又发现了一个个宝藏,伤心的是居然有这么庞大的知识我一无所知之前还和别人侃侃而谈,而且这么多知识啥时候才能统统入脑呢?往往会想到苏轼”寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。知不可乎骤得,托遗响于悲风。“,对我来说,解决这种彷徨无措的方法只有一个:实践,干就完了。像胡适说的”怕什么真理无穷,进一寸有进一寸的欢喜“

相关文章:

广告推荐算法入门 day1 --项目选型

文章目录 0 前言1 广告推荐的基本流程2 场景和baseline初步框定2.1召回场景2.2排场景2.3精排场景 3 一个入门小例子感受--淘宝用户购物行为数据可视化分析3.1 数据集介绍3.2 数据分析目标1.时间维度2.产品维度3.行为维度4.用户维度 4 基础项目选型4.1场景 推荐资料后记 0 前言 …...

【Qt】之音视频编程2:QtAV的使用篇

QtAV 基本播放控制功能实现&#xff08;C & QML&#xff09; QtAV 提供了完整的播放控制 API&#xff0c;支持 播放、暂停、停止、快进快退、截屏 等功能。以下是具体实现方法&#xff1a; 1. C 控制方式 基本播放控制 #include <QtAV> #include <QtAV/AVPlaye…...

技术视角下的TikTok店铺运营:从0到1的5个关键点

在当今数字化时代&#xff0c;TikTok Shop作为新兴的电商平台&#xff0c;为众多商家带来了新的机遇。从技术运营的角度来看&#xff0c;以下5个关键点是每个TikTok店铺运营者都需要注意的&#xff1a; 1、规则先行&#xff0c;技术助力合规开店 地区选择&#xff1a;技术分析显…...

机器学习 --- 特征工程(一)

机器学习 — 特征工程&#xff08;一&#xff09; 文章目录 机器学习 --- 特征工程&#xff08;一&#xff09;一&#xff0c;特征工程概念二&#xff0c;特征工程API三&#xff0c;DictVectorizer 字典列表特征提取四&#xff0c;CountVectorizer 文本特征提取4.1 API4.2 英文…...

cocos creator 3.8 下的 2D 改动

在B站找到的系统性cocos视频教程,纯2D开发入门,链接如下: zzehz黑马程序员6天实战游戏开发微信小程序&#xff08;Cocos2d的升级版 CocosCreator JavaScript&#xff09;_哔哩哔哩_bilibili黑马程序员6天实战游戏开发微信小程序&#xff08;Cocos2d的升级版 CocosCreator Ja…...

2025-05-13 表征学习

表征学习 表征学习&#xff08;Representation Learning&#xff09;&#xff0c;又称特征学习&#xff0c;是机器学习领域中的一类技术&#xff0c;旨在自动的从原始数据中学习处有效的特征表示&#xff0c;使得后续的机器学习任务&#xff08;分类、聚类、预测&#xff09;能…...

【WebApi】YiFeiWebApi接口安装说明

YiFeiWebApi接口安装说明 一、 数据库配置文件修改二、 IIS环境配置(建议IIS7.0)三、 安装.NET 8.0 运行时四、 IIS配置站点五、 发布系统六、 测试接口七、测试服务器站点接口八、其他问题查看日志解决九、ApiPost项目文档 一、 数据库配置文件修改 说明&#xff1a; DSCSYSSq…...

亚马逊云科技:开启数字化转型的无限可能

在数字技术蓬勃发展的今天&#xff0c;云计算早已突破单纯技术工具的范畴&#xff0c;成为驱动企业创新、引领行业变革的核心力量。亚马逊云科技凭借前瞻性的战略布局与持续的技术深耕&#xff0c;在全球云计算领域树立起行业标杆&#xff0c;为企业和个人用户提供全方位、高品…...

爬虫请求频率应控制在多少合适?

爬虫请求频率的控制是一个非常重要的问题&#xff0c;它不仅关系到爬虫的效率&#xff0c;还涉及到对目标网站服务器的影响以及避免被封禁的风险。合理的请求频率需要根据多个因素来综合考虑&#xff0c;以下是一些具体的指导原则和建议&#xff1a; 一、目标网站的政策 查看网…...

Rimworld Mod教程 武器Weapon篇 近战章 第二讲:生物可用的近战来源

本讲分析的是在原版&#xff08;coreall dlc&#xff09;环境下&#xff0c;一个Pawn可以用的Tools的所有来源。 重点要分析的是RimWorld.Pawn_MeleeVerbs下的方法GetUpdatedAvailableVerbsList&#xff0c;我把它贴在下面&#xff1a; public List<VerbEntry> GetUpdat…...

SAP汽配解决方案:无锡哲讯科技助力企业数字化转型

汽配行业面临的挑战与机遇 随着汽车行业的快速发展&#xff0c;汽配企业面临着激烈的市场竞争、供应链复杂化、成本压力增大等多重挑战。传统的管理模式已难以满足现代汽配企业对高效生产、精准库存、快速响应的需求。在此背景下&#xff0c;数字化转型成为汽配企业的必然选…...

day19-线性表(顺序表)(链表I)

一、补充 安装软件命令&#xff1a; sudo apt-get install (软件名) 安装格式化对齐&#xff1a;sudo apt-get install clang-format内存泄漏检测工具&#xff1a; sudo apt-get install valgrind 编译后&#xff0c;使用命令 valgrind ./a.out 即可看内存是…...

里氏替换原则:Java 面向对象设计的基石法则

一、原则起源与核心定义 20 世纪 80 年代&#xff0c;计算机科学家芭芭拉・里氏&#xff08;Barbara Liskov&#xff09;在一篇论文中首次提出了里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;&#xff0c;这成为面向对象设计的重要理论基…...

GBK与UTF-8编码问题(2)

1. 问题现象 在python代码中&#xff0c;用open函数打开文本文件并显示文本内容&#xff0c;中文显示乱码&#xff0c;代码如下。 from tkinter import * import tkinter.filedialogroot Tk() # 给窗口的可视化起名字 root.title(Open File Test)# 设定窗口的大小(长 * 宽) r…...

项目三 - 任务6:回文日期判断

本任务通过判断回文日期&#xff0c;深入学习了Java中日期和字符串处理的相关知识。通过输入年、月、日&#xff0c;生成8位日期字符串&#xff0c;利用StringBuffer的reverse()方法反转字符串&#xff0c;比较原字符串与反转后的字符串是否一致&#xff0c;从而判断是否为回文…...

从零开始掌握FreeRTOS(1)移植到STM32

目录 提前准备 源码文件移植 修改 stm32f10x_it.c 修改 FreeRTOS.h 本章思维导图。 提前准备 学习 FreeRTOS 的第一步就是有一份最工程能够跑在 STM32 上。本篇将记录本人从0搭建一个最基础的移植工程Demo。 要完成这份 Demo&#xff0c;首先我们需要预先准备以下东西&…...

esp32硬件支持AT指令

步骤1&#xff1a;下载AT固件 从乐鑫官网或Git鑫GitHub仓库&#xff08;https://github.com/espressif/esp-at&#xff09;获取对应ESP32型号的AT固件&#xff08;如ESP32-AT.bin&#xff09;。 步骤2&#xff1a;安装烧录工具 使用 esptool.py&#xff08;命令行工具&#…...

【神经网络与深度学习】局部最小值和全局最小值

引言 在机器学习和优化问题中&#xff0c;目标函数的优化通常是核心任务。优化过程可能会产生局部最小值或全局最小值&#xff0c;而如何区分它们并选择合适的优化策略&#xff0c;将直接影响模型的性能和稳定性。 在深度学习等复杂优化问题中&#xff0c;寻找全局最小值往往…...

部署安装git-2.49.0.tar.xz

实验环境 git主机&#xff1a;8.10 所需软件 git-2.49.0.tar.xz 实验开始 实验目的&#xff1a;安装升级git2.49.0 编译安装 yum remove git -y --卸载旧版git cd /usr/local/src/ wget https://www.kernel.org/pub/software/scm/git/git-2.49.0.tar.xz …...

SpringBoot的单体和分布式的任务架构

在Spring Boot生态中&#xff0c;定时任务框架的选择需根据架构类型&#xff08;单体或分布式&#xff09;和功能需求进行权衡。以下从框架特性、适用场景及Spring Boot集成方式等角度&#xff0c;详细梳理主流的定时任务框架及其分类&#xff1a; 一、单体架构下的定时任务框架…...

第四章 部件篇之按钮矩阵部件

第四章 部件篇之按钮矩阵部件 在 LVGL中&#xff0c; 按钮矩阵部件相当于一系列伪按钮的集合&#xff0c;它按一定的序列来排布这些按钮。值得注意的是&#xff0c;这些伪按钮并不是真正的按钮部件&#xff08;lv_btn&#xff09; &#xff0c; 它们只是具有按钮外观的图形&…...

二分查找算法的思路

二分查找思路总结 明确目标与单调性特点&#xff1a; 核心目标&#xff1a;寻找满足某种条件的答案&#xff08;如最小/最大值&#xff09;。单调性要求&#xff1a;需要证明你的判断函数具有单调性——即如果某个答案 T 可行&#xff0c;那么大于 T 的答案通常也是可行的&…...

Shell脚本与Xshell的使用、知识点、区别及原理

Shell脚本与Xshell的使用、知识点、区别及原理 Shell脚本 基本概念 Shell脚本是一种为Shell编写的脚本程序&#xff0c;通常用于自动化执行一系列命令。它是在Unix/Linux系统下的命令行解释器与用户交互的接口。 主要知识点 脚本结构&#xff1a;以#!/bin/bash开头&#xf…...

【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现

1 限流的重要性 在高并发系统中&#xff0c;保护系统稳定运行的关键技术有缓存、降级和限流。 缓存通过在内存中存储常用数据&#xff0c;减少对数据库的访问&#xff0c;提升系统响应速度&#xff0c;如浏览器缓存、CDN缓存等多种应用层面。降级则是在系统压力过大或部分服务…...

【递归、搜索与回溯】专题一:递归(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人递归&#xff0c;搜索与回溯算法的学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码…...

【Linux】操作系统入门:冯诺依曼体系结构

引言&#xff1a;从一次QQ聊天说起 你是否好奇&#xff0c;当你在键盘上敲下一行文字发送给好友时&#xff0c;计算机内部发生了什么&#xff1f;为什么鼠标点击后程序就能瞬间响应&#xff1f;这一切的答案&#xff0c;都藏在计算机的“心脏”——冯诺依曼体系结构中。 一、硬…...

量化感知训练与 PyTorch 的哪些事

大家好呀&#xff01;今天咱们要来聊聊一个超厉害的技术——量化感知训练&#xff08;Quantization-Aware Training&#xff0c;简称 QAT&#xff09; 在神经网络的世界里&#xff0c;我们总是想方设法地让模型变得更准确、更高效&#xff0c;毕竟谁不想自己的模型在边缘设备上…...

【Mac 从 0 到 1 保姆级配置教程 15】- Python 环境一键安装与配置,就是这么的丝滑

文章目录 前言安装 Python 环境VSCode 配置Python 环境NeoVim 配置 Python 环境&#xff08;选看&#xff09;1. Python LSP 配置2. 打开 python 语言支持 最后参考资料系列教程 Mac 从 0 到 1 保姆级配置教程目录&#xff0c;点击即可跳转对应文章&#xff1a; 【Mac 从 0 到 …...

前端学习(3)—— CSS实现热搜榜

效果展示 具体的展示效果如下&#xff0c;可以直接在浏览器显示&#xff1a; 页面分为两部分&#xff0c;一部分是 body 标签里的 html 结构&#xff0c;一部分是 style 标签里的CSS代码&#xff08;页面布局的部分数据直接在代码里显示了&#xff09; 一&#xff0c;html结…...

大数据——解决Matplotlib 字体不足问题(Linux\mac\windows)

1、将下载好的字体文件放到文件夹中 谷歌官方字体 import matplotlib print(matplotlib.matplotlib_fname())cp NotoSansSC-Regular.ttf /data/home/miniconda3/envs/python3128/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/cp wqy-zenhei.ttc /data/home/m…...

嵌入式培训之数据结构学习(二)顺序表与单向链表

目录 一、顺序表 &#xff08;一&#xff09;顺序表的基本操作 1、创建顺序表 2、销毁顺序表 3、遍历顺序表 4、尾插&#xff0c;在顺序表的最后插入元素 5、判断表是否满 6、判断表是否空 7、按指定位置插入元素 8、查找元素&#xff0c;根据名字 9、根据名字修改指…...

PyInstaller 打包后 Excel 转 CSV 报错解决方案:“excel file format cannot be determined“

一、问题背景 在使用 Python 开发 Excel 转 CSV 工具时,直接运行脚本(python script.py)可以正常工作,但通过 PyInstaller 打包成可执行文件后,出现以下报错: excel file format cannot be determined, you must specify an engine manually 该问题通常发生在使用pandas…...

鸿蒙 PC 发布之后,想在技术上聊聊它的未来可能

最近鸿蒙 PC 刚发布完&#xff0c;但是发布会没公布太多技术细节&#xff0c;基本上一些细节都是通过自媒体渠道获取&#xff0c;首先可以确定的是&#xff0c;鸿蒙 PC 本身肯定是无法「直接」运行 win 原本的应用&#xff0c;但是可以支持手机上「原生鸿蒙」的应用&#xff0c…...

HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(一、开篇,项目介绍)

诗词&#xff0c;作为中国传统文化的瑰宝&#xff0c;承载着中华民族几千年的思想智慧和审美情趣。然而&#xff0c;在现代社会快节奏的生活压力下&#xff0c;诗词文化却逐渐被忽视&#xff0c;更多的人感到诗词艰涩深奥&#xff0c;难以亲近。与此同时&#xff0c;虽然市场上…...

实物工厂零件画图案例(上)

文章目录 滑台气缸安装板旋转气缸安装板张紧调节块长度调节块双轴气缸安装板步进电机安装板梯形丝杆轴承座 简介&#xff1a;案例点击此处下载&#xff0c;这次的这几个案例并没有很大的难度&#xff0c;练习这几个案例最为重要的一点就是知道&#xff1a;当你拿到一个实物的时…...

js中的同步方法及异步方法

目录 1.代码说明 2.async修饰的方法和非async修饰的方法的区别 3.不使用await的场景 4.总结 1.代码说明 const saveTem () > {// 校验处理const res check()if (!res) {return}addTemplateRef.value.openModal() } 这段代码中&#xff0c;check方法返回的是true和fal…...

C 语言_基础语法全解析_深度细化版

一、C 语言基本结构 1.1 程序组成部分 一个完整的 C 程序由以下部分组成: 预处理指令:以#开头,在编译前处理 #include <stdio.h> // 引入标准库 #define PI 3.14159 // 定义常量全局变量声明:在所有函数外部定义的变量 int globalVar = 10; // 全局变量函数定义…...

【Linux系列】dd 命令的深度解析与应用实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

ETL背景介绍_1:数据孤岛仓库的介绍

1 ETL介绍 1.1 数据孤岛 随着企业内客户数据大量的涌现&#xff0c;单个数据库已不再足够。为了储存这些数据&#xff0c;公司通常会建立多个业务部门组织的数据库来保存数据。比如&#xff0c;随着数据量的增长&#xff0c;公司通常可能会构建数十个独立运行的业务数据库&am…...

【周输入】510周阅读推荐-1

本号一年了&#xff0c;有一定的成长&#xff0c;也有很多读者和点赞。自觉更新仍然远远不够&#xff0c;需要继续努力。 但是还是要坚持2点&#xff1a; 在当前这个时代&#xff0c;信息大爆炸&#xff0c;层次不齐&#xff0c;不追加多&#xff0c; 信息输入可以很多&#x…...

Games101作业四

作业0到作业3的代码 这次是实现 de Casteljau 算法&#xff0c;以及绘制 Bezier 曲线,比上次简单 核心思想就是递归,原理忘了就去看第十一节课,从15:00开始的 GAMES101-现代计算机图形学入门-闫令琪 代码 先实现贝塞尔曲线 cv::Point2f recursive_bezier(const std::…...

从Aurora 架构看数据库计算存储分离架构

单就公有云来说&#xff0c;现在云数据面临的挑战有以下 5 个&#xff1a; 跨 AZ 的可用性与数据安全性。 现在都提多 AZ 部署&#xff0c;亚马逊在全球有 40 多个 AZ&#xff0c; 16 个 Region&#xff0c;基本上每一个 Region 之内的那些关键服务都是跨 3 个 AZ。你要考虑整个…...

ElasticSearch深入解析(十一):分页

在Elasticsearch中&#xff0c;常用的分页方案有from size、search_after和scroll三种&#xff0c;适用于不同场景。from size基于偏移量分页&#xff0c;是全局排序后的切片查询&#xff0c;适用于小数据量、浅分页场景&#xff0c;但深度分页性能差&#xff0c;且有默认上限…...

【MySQL】MySQL数据库结构与操作

目录 一. 数据库的概念 二. 数据库的分类 三. 初始MySQL数据库 四. 数据库操作 1&#xff09;创建数据库 2) 查看数据库 3&#xff09;选中数据库 4&#xff09;删除数据库 五. SQL数据类型 1&#xff09;整型和浮点型 2&#xff09;字符串类型 3&#xff09;时间…...

Vue框架的基本介绍

目录 一.Vue 1.概述 2.三大主流框架 3.优点: 二.Vue搭建 三.语法 1.基本框架 2.插值表达式 3.Vue指令 1.v-text: 2.v-html: ​编辑3.v-model: 4.v-on: 5.v-show: 6.v-if: 7.v-else: 8.v-bind: 9.v-for: 一.Vue 1.概述 Vue是一款用于构建用户界面的渐进式的…...

Web 架构之攻击应急方案

文章目录 一、引言二、常见 Web 攻击类型及原理2.1 SQL 注入攻击2.2 跨站脚本攻击&#xff08;XSS&#xff09;2.3 分布式拒绝服务攻击&#xff08;DDoS&#xff09; 三、攻击检测3.1 日志分析3.2 入侵检测系统&#xff08;IDS&#xff09;/入侵防御系统&#xff08;IPS&#x…...

xss-labs靶场基础8-10关(记录学习)

前言&#xff1a; 内容&#xff1a; 第八关 关卡资源网站&#xff0c;html编码网站&#xff08;两个网站&#xff0c;一个是实体编号转义&#xff08;只对特殊字符有效&#xff0c;字母无效&#xff09;、实体符号转义&#xff09; 在线Html实体编码解码-HTML Entity Encodi…...

arctanx 导数 泰勒展开式证明

你提供的推导内容非常清晰&#xff0c;条理分明。下面是对 d d x arctan ⁡ x 1 1 x 2 \frac{d}{dx} \arctan x \frac{1}{1 x^2} dxd​arctanx1x21​ 的总结与适当补充&#xff1a; ✅ 结论 d d x arctan ⁡ x 1 1 x 2 \frac{d}{dx} \arctan x \frac{1}{1 x^2} dxd​a…...

基于Java的家政服务平台设计与实现(代码+数据库+LW)

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本家政服务平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…...

SpringBoot的外部化配置

一、什么是外部化配置 外部化配置是指把应用程序中各种可配置的参数、属性等信息&#xff0c;从代码内部提取出来&#xff0c;放置在外部的配置文件、数据库或配置中心等地方&#xff08;比如使用.properties、.yml 或.xml 等格式的文件&#xff09;进行管理。提高应用程序的可…...