(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合_2025年五一数学建模c题
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合,专为本次赛题设计,旨在帮助您深入理解数学建模的每一个环节。
本次五一数学建模竞赛C题可以做如下考虑 (部分公式和代码因为排版问题显示不完整,文中代码仅有部分,完整论文格式标准,包含全部代码)
(部分代码在本帖子里格式混乱,下载后格式正常)
本题的第一个问题是:
问题1. 基于用户与博主历史交互数据(观看、点赞、评论、关注)的统计分析,能够有效揭示用户行为特征,为内容优化和交互提升提供决策依据。根据附件1提供的数据,请建立数学模型,预测各博主在2024.7.21当天新增的关注数,并根据预测结果,在表1中填写当日新增关注数最多的5位博主ID及其对应的新增关注数。
问题1的数学建模思路
为了预测各博主在2024.7.21当天新增的关注数,我们需要基于附件1中的历史交互数据(观看、点赞、评论、关注)进行分析和建模。以下是建模的详细步骤:
1. 数据预处理
- 数据清洗:检查附件1中的数据是否存在缺失值或异常值,并进行处理。
- 时间处理:将时间列转换为适合分析的格式(如日期、小时等)。
- 行为分类:根据用户行为列(1: 观看, 2: 点赞, 3: 评论, 4: 关注)对数据进行分类。
2. 特征提取
从历史数据中提取以下特征:
- 博主特征:
- 历史总关注数(截止到2024.7.20)。
- 历史平均每日关注数。
- 历史点赞数、评论数、观看数的统计量(如均值、方差等)。
- 博主的内容质量指标(如点赞率、评论率等)。
- 用户特征:
- 用户的历史行为频率(如每日平均观看、点赞、评论次数)。
- 用户对博主的偏好(如用户是否经常与某博主互动)。
- 时间特征:
- 用户行为的时间分布(如用户在哪些时间段更活跃)。
- 博主的关注增长趋势(如关注数是否随时间递增)。
3. 建立预测模型
可以采用以下模型进行预测:
- 时间序列模型(如ARIMA、Prophet):
- 基于博主历史关注数的时间序列数据,预测2024.7.21的关注数。
- 回归模型(如线性回归、随机森林回归):
- 以博主特征、用户特征、时间特征为输入变量,以新增关注数为目标变量,建立回归模型。
- 分类模型(如逻辑回归、XGBoost):
- 将问题转化为分类问题,预测某博主是否会在2024.7.21获得新关注。
4. 模型训练与验证
- 数据集划分:将附件1的数据划分为训练集和测试集(如按时间划分,2024.7.11-2024.7.19为训练集,2024.7.20为测试集)。
- 模型训练:在训练集上训练模型。
- 模型验证:在测试集上验证模型的预测效果,使用评价指标(如均方误差、准确率等)评估模型性能。
5. 预测与结果生成
- 预测2024.7.21的新增关注数:使用训练好的模型对2024.7.21的新增关注数进行预测。
- 生成表1:根据预测结果,找出新增关注数最多的5位博主ID及其对应的新增关注数。
6. 模型优化
- 特征工程:尝试提取更多有用的特征(如用户与博主的互动频率、博主的粉丝增长率等)。
- 模型调参:通过交叉验证等方法优化模型参数。
- 集成学习:结合多个模型的预测结果,提高预测精度。
数学公式示例
以回归模型为例,假设使用线性回归模型:
y=β0+β1x1+β2x2+⋯+βnxn+ϵy = \\beta_0 + \\beta_1 x_1 + \\beta_2 x_2 + \\dots + \\beta_n x_n + \\epsilony=β0+β1x1+β2x2+⋯+βnxn+ϵ
其中:
- y y y:博主在2024.7.21的新增关注数(目标变量)。
- x1,x2,…,xn x_1, x_2, \\dots, x_n x1,x2,…,xn:博主特征、用户特征、时间特征(输入变量)。
- β0,β1,…,βn \\beta_0, \\beta_1, \\dots, \\beta_n β0,β1,…,βn:模型参数。
- ϵ \\epsilon ϵ:误差项。
最终结果
将预测结果填入表1:
(注:以上结果为示例,实际结果需根据模型预测生成。)
通过上述建模过程,可以有效预测博主的新增关注数,并为平台的推荐系统提供决策依据。
问题1的数学模型与公式
为了预测各博主在2024.7.21当天新增的关注数,我们可以基于历史数据(附件1)建立以下数学模型:
1. 关注行为的时间序列模型
假设每个博主的新增关注数与其历史关注行为存在时间相关性,我们可以使用时间序列模型(如ARIMA模型)来预测未来的关注数。
设 yty_tyt 为博主在时间 ttt 的新增关注数,则ARIMA模型可以表示为:
yt=c+ϕ1yt−1+ϕ2yt−2+⋯+ϕpyt−p+θ1ϵt−1+θ2ϵt−2+⋯+θqϵt−q+ϵty_t = c + \\phi_1 y_{t-1} + \\phi_2 y_{t-2} + \\dots + \\phi_p y_{t-p} + \\theta_1 \\epsilon_{t-1} + \\theta_2 \\epsilon_{t-2} + \\dots + \\theta_q \\epsilon_{t-q} + \\epsilon_tyt=c+ϕ1yt−1+ϕ2yt−2+⋯+ϕpyt−p+θ1ϵt−1+θ2ϵt−2+⋯+θqϵt−q+ϵt
其中:
- ccc 是常数项,
- ϕ1,ϕ2,…,ϕp\\phi_1, \\phi_2, \\dots, \\phi_pϕ1,ϕ2,…,ϕp 是自回归系数,
- θ1,θ2,…,θq\\theta_1, \\theta_2, \\dots, \\theta_qθ1,θ2,…,θq 是移动平均系数,
- ϵt\\epsilon_tϵt 是白噪声误差项。
2. 特征工程与回归模型
除了时间序列模型,我们还可以基于用户与博主的历史交互数据构建特征,并使用回归模型(如线性回归或随机森林回归)来预测新增关注数。
设 XXX 为特征矩阵,包含以下特征:
- 历史观看次数 www,
- 历史点赞次数 lll,
- 历史评论次数 ccc,
- 历史关注次数 fff,
- 时间特征(如星期几、小时等)。
则回归模型可以表示为:
y=β0+β1w+β2l+β3c+β4f+β5t+ϵy = \\beta_0 + \\beta_1 w + \\beta_2 l + \\beta_3 c + \\beta_4 f + \\beta_5 t + \\epsilony=β0+β1w+β2l+β3c+β4f+β5t+ϵ
其中:
- yyy 是新增关注数,
- β0,β1,…,β5\\beta_0, \\beta_1, \\dots, \\beta_5β0,β1,…,β5 是回归系数,
- ϵ\\epsilonϵ 是误差项。
3. 模型训练与预测
通过历史数据训练上述模型,并使用训练好的模型预测2024.7.21当天各博主的新增关注数。最终,根据预测结果,选择新增关注数最多的5位博主ID及其对应的新增关注数,填入表1。
4. 结果展示
预测结果将以表格形式展示如下:
其中,B1,B2,…,B5B1, B2, \\dots, B5B1,B2,…,B5 是博主ID,N1,N2,…,N5N1, N2, \\dots, N5N1,N2,…,N5 是对应的新增关注数。
通过上述模型与公式,我们可以有效地预测博主在2024.7.21当天的新增关注数,并为平台的内容优化和交互提升提供决策依据。
要解决这个问题,我们可以使用Python进行数据处理和建模。以下是解决问题的步骤和相应的Python代码:
步骤1:数据预处理
首先,我们需要加载附件1的数据,并进行必要的预处理,包括数据清洗、时间处理等。
步骤2:特征工程
基于历史交互数据,我们可以提取一些特征,如用户与博主的互动频率、互动类型等。
步骤3:模型选择与训练
我们可以选择使用回归模型(如线性回归、随机森林回归等)来预测博主在2024.7.21当天新增的关注数。
步骤4:预测与结果输出
使用训练好的模型进行预测,并输出新增关注数最多的5位博主ID及其对应的新增关注数。
Python代码实现
import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.metrics import mean_squared_error# 步骤1:数据预处理# 假设附件1的数据已经加载到一个DataFrame中data = pd.read_csv(\'attachment1.csv\')# 将时间列转换为datetime格式data[\'时间\'] = pd.to_datetime(data[\'时间\'])# 提取日期列data[\'日期\'] = data[\'时间\'].dt.date# 步骤2:特征工程# 计算每个博主在历史数据中的互动次数interaction_counts = data.groupby([\'博主ID\', \'用户行为\']).size().unstack(fill_value=0)interaction_counts.columns = [\'观看次数\', \'点赞次数\', \'评论次数\', \'关注次数\']# 计算每个博主的总互动次数interaction_counts[\'总互动次数\'] = interaction_counts.sum(axis=1)# 计算每个博主的历史关注次数historical_follows = data[data[\'用户行为\'] == 4].groupby(\'博主ID\').size().reset_index(name=\'历史关注次数\')# 合并特征features = interaction_counts.merge(historical_follows, on=\'博主ID\', how=\'left\').fillna(0)# 步骤3:模型选择与训练# 假设我们要预测2024.7.21的新增关注数# 我们可以使用2024.7.11-2024.7.20的数据作为训练集train_data = data[data[\'日期\'] < pd.to_datetime(\'2024-07-21\').date()]# 计算训练集中每个博主的新增关注数train_follows = train_data[train_data[\'用户行为\'] == 4].groupby(\'博主ID\').size().reset_index(name=\'新增关注数\')# 合并训练集特征train_features = features.merge(train_follows, on=\'博主ID\', how=\'left\').fillna(0)# 划分训练集和测试集X = train_features.drop(columns=[\'新增关注数\', \'博主ID\'])y = train_features[\'新增关注数\']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用随机森林回归模型model = RandomForestRegressor(n_estimators=100, random_state=42)model.fit(X_train, y_train)# 步骤4:预测与结果输出# 预测2024.7.21的新增关注数predictions = model.predict(features.drop(columns=[\'博主ID\']))# 将预测结果添加到特征DataFrame中features[\'预测新增关注数\'] = predictions# 按照预测新增关注数排序,取前5名top_5_bloggers = features.sort_values(by=\'预测新增关注数\', ascending=False).head(5)# 输出结果print(\"表1 问题1结果\")print(\"| 排名 | 博主ID | 新增关注数 |\")print(\"|------|--------|------------|\")for i, row in top_5_bloggers.iterrows(): print(f\"| {i+1} | {row[\'博主ID\']} | {int(row[\'预测新增关注数\'])} |\")
代码解释
- 数据预处理:我们首先将时间列转换为
datetime
格式,并提取日期列。 - 特征工程:我们计算了每个博主在历史数据中的互动次数,并合并了历史关注次数。
- 模型训练:我们使用随机森林回归模型来预测博主的新增关注数。
- 预测与结果输出:我们使用训练好的模型进行预测,并输出新增关注数最多的5位博主ID及其对应的新增关注数。
注意事项
- 代码中的
attachment1.csv
需要替换为实际的数据文件路径。 - 模型的选择和参数可以根据实际情况进行调整。
- 如果数据量较大,可以考虑使用更高效的算法或分布式计算。
通过
第二个问题是:
问题2. 附件2提供了2024.7.22当天用户进行观看、点赞、评论的行为数据,结合附件1中用户的历史行为数据,请建立数学模型,预测用户在2024.7.22产生的新关注行为,并将指定用户在2024.7.22新关注的博主ID填入表2。
表2 问题2结果
注:若用户在2024.7.22关注多名博主,均填入表2;若用户在2024.7.22未新关注博主,无需填写。
问题2:预测用户在2024.7.22产生的新关注行为
1. 问题分析
我们需要基于用户在2024.7.22的观看、点赞、评论行为数据(附件2),结合用户的历史行为数据(附件1),预测用户在2024.7.22是否会产生新的关注行为,并确定新关注的博主ID。
2. 数据预处理
- 附件1:包含用户与博主的历史交互数据(观看、点赞、评论、关注)。
- 附件2:包含用户在2024.7.22的观看、点赞、评论行为数据。
首先,我们需要将附件1和附件2的数据进行整合,提取出用户的历史行为特征和2024.7.22当天的行为特征。
3. 特征提取
对于每个用户,我们可以提取以下特征:
-
历史行为特征:
- 每个用户的总观看次数、总点赞次数、总评论次数、总关注次数。
- 每个用户对每个博主的历史观看次数、点赞次数、评论次数、关注次数。
- 用户的历史活跃时间段(例如,用户在哪些时间段内更活跃)。
-
2024.7.22当天的行为特征:
- 用户在2024.7.22的观看次数、点赞次数、评论次数。
- 用户在2024.7.22的活跃时间段。
4. 模型选择
我们可以采用分类模型来预测用户是否会在2024.7.22产生新的关注行为。常用的分类模型包括:
- 逻辑回归(Logistic Regression)
- 随机森林(Random Forest)
- 支持向量机(SVM)
- 梯度提升树(Gradient Boosting)
由于用户行为数据可能存在一定的非线性关系,随机森林或梯度提升树可能更适合。
5. 模型训练与预测
- 训练集:使用附件1的数据作为训练集,提取用户的历史行为特征,并标注是否有关注行为。
- 测试集:使用附件2的数据作为测试集,提取用户在2024.7.22的行为特征,预测是否会产生新的关注行为。
6. 模型评估
使用交叉验证或留出法评估模型的性能,常用的评估指标包括准确率、召回率、F1分数等。
7. 结果输出
对于指定的用户(U7, U6749, U5769, U14990, U52010),根据模型的预测结果,输出他们在2024.7.22新关注的博主ID。如果用户没有新关注任何博主,则无需填写。
8. 模型优化
可以通过调整模型参数、增加特征(如用户与博主的相似度、博主的活跃度等)来进一步优化模型性能。
9. 结果示例
假设模型预测结果如下:
10. 总结
通过提取用户的历史行为和当天的行为特征,使用分类模型可以有效地预测用户是否会在2024.7.22产生新的关注行为。模型的性能可以通过进一步的特征工程和参数调优来提升。
以上是对问题2的数学建模方法,通过特征提取、模型选择、训练与预测,最终得到用户在2024.7.22新关注的博主ID。
问题2的数学模型
为了预测用户在2024.7.22产生的新关注行为,我们可以基于用户的历史行为数据(附件1)和2024.7.22当天的行为数据(附件2),构建一个概率模型。具体步骤如下:
1. 数据预处理
首先,我们需要对附件1和附件2的数据进行预处理,提取出用户的历史互动行为和2024.7.22当天的互动行为。设:
- UUU 为用户集合,BBB 为博主集合。
- u∈Uu \\in Uu∈U 表示一个用户,b∈Bb \\in Bb∈B 表示一个博主。
- HuH_uHu 为用户 uuu 的历史行为数据,包括观看、点赞、评论和关注行为。
- AuA_uAu 为用户 uuu 在2024.7.22当天的行为数据,包括观看、点赞和评论行为。
2. 特征提取
基于历史行为数据 HuH_uHu 和当天行为数据 AuA_uAu,我们可以提取以下特征:
- fu,bf_{u,b}fu,b:用户 uuu 对博主 bbb 的历史互动频率,定义为用户 uuu 对博主 bbb 的互动次数除以用户 uuu 的总互动次数。
- gu,bg_{u,b}gu,b:用户 uuu 对博主 bbb 的当天互动频率,定义为用户 uuu 对博主 bbb 的当天互动次数除以用户 uuu 的当天总互动次数。
- hu,bh_{u,b}hu,b:用户 uuu 对博主 bbb 的历史关注概率,定义为用户 uuu 是否关注博主 bbb(1表示关注,0表示未关注)。
3. 概率模型
我们可以使用逻辑回归模型来预测用户 uuu 在2024.7.22当天是否会关注博主 bbb。设 P(u,b)P(u,b)P(u,b) 为用户 uuu 关注博主 bbb 的概率,则:
P(u,b)=σ(θ0+θ1fu,b+θ2gu,b+θ3hu,b)P(u,b) = \\sigma(\\theta_0 + \\theta_1 f_{u,b} + \\theta_2 g_{u,b} + \\theta_3 h_{u,b})P(u,b)=σ(θ0+θ1fu,b+θ2gu,b+θ3hu,b)
其中,σ(x)=11+e−x\\sigma(x) = \\frac{1}{1 + e^{-x}}σ(x)=1+e−x1 是逻辑函数,θ0,θ1,θ2,θ3\\theta_0, \\theta_1, \\theta_2, \\theta_3θ0,θ1,θ2,θ3 是模型参数。
4. 参数估计
使用最大似然估计法来估计模型参数 θ0,θ1,θ2,θ3\\theta_0, \\theta_1, \\theta_2, \\theta_3θ0,θ1,θ2,θ3。设 DDD 为训练数据集,包含用户的历史关注行为,则似然函数为:
L(θ)=∏(u,b)∈DP(u,b)yu,b(1−P(u,b))1−yu,bL(\\theta) = \\prod_{(u,b) \\in D} P(u,b)^{y_{u,b}} (1 - P(u,b))^{1 - y_{u,b}}L(θ)=(u,b)∈D∏P(u,b)yu,b(1−P(u,b))1−yu,b
其中,yu,by_{u,b}yu,b 表示用户 uuu 是否关注博主 bbb(1表示关注,0表示未关注)。通过最大化似然函数,可以得到参数 θ\\thetaθ 的估计值。
5. 预测新关注行为
对于每个用户 uuu,计算其对所有博主 bbb 的关注概率 P(u,b)P(u,b)P(u,b),并选择概率最大的博主作为预测结果。若 P(u,b)P(u,b)P(u,b) 大于某个阈值(如0.5),则认为用户 uuu 会关注博主 bbb。
6. 结果填入表2
根据上述预测结果,将用户在2024.7.22新关注的博主ID填入表2。
总结
通过上述步骤,我们可以构建一个基于用户历史行为和当天行为的概率模型,预测用户在2024.7.22当天的新关注行为,并将结果填入表2。
要解决第二个问题,我们需要结合附件1中的历史行为数据和附件2中2024.7.22的用户行为数据,预测用户在2024.7.22当天可能产生的新关注行为。以下是使用Python进行数据分析和预测的代码示例。
1. 导入必要的库
import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score
2. 加载数据
假设附件1和附件2的数据已经分别存储为CSV文件attachment1.csv
和attachment2.csv
。
# 加载附件1数据df1 = pd.read_csv(\'attachment1.csv\')# 加载附件2数据df2 = pd.read_csv(\'attachment2.csv\')
3. 数据预处理
我们需要将历史行为数据和当天的行为数据进行合并,并提取特征。
# 合并数据df = pd.concat([df1, df2], ignore_index=True)# 特征工程df[\'time\'] = pd.to_datetime(df[\'time\'])df[\'hour\'] = df[\'time\'].dt.hourdf[\'day\'] = df[\'time\'].dt.day# 将用户行为转换为特征df = pd.get_dummies(df, columns=[\'user_behavior\'], prefix=\'behavior\')# 提取特征和目标变量X = df.drop(columns=[\'userID\', \'bloggerID\', \'time\', \'day\'])y = df[\'bloggerID\']
4. 训练模型
我们可以使用随机森林分类器来预测用户是否会关注某个博主。
# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练随机森林模型model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)# 预测y_pred = model.predict(X_test)# 评估模型accuracy = accuracy_score(y_test, y_pred)print(f\'模型准确率: {accuracy:.2f}\')
5. 预测新关注行为
使用训练好的模型预测指定用户在2024.7.22的新关注行为。
# 提取指定用户在2024.7.22的行为数据specified_users = [\'U7\', \'U6749\', \'U5769\', \'U14990\', \'U52010\']df_specified = df2[df2[\'userID\'].isin(specified_users)]# 预测新关注行为df_specified[\'predicted_bloggerID\'] = model.predict(df_specified.drop(columns=[\'userID\', \'bloggerID\', \'time\']))# 提取预测结果new_follows = df_specified[df_specified[\'predicted_bloggerID\'] != 0][[\'userID\', \'predicted_bloggerID\']]# 将结果填入表2table2 = pd.DataFrame(columns=[\'用户ID\', \'新关注博主ID\'])for user in specified_users: follows = new_follows[new_follows[\'userID\'] == user][\'predicted_bloggerID\'].tolist() if follows: for blogger in follows: table2 = table2.append({\'用户ID\': user, \'新关注博主ID\': blogger}, ignore_index=True)# 输出表2print(table2)
6. 保存结果
将结果保存为CSV文件以便提交。
table2.to_csv(\'table2_results.csv\', index=False)
代码说明:
- 数据加载:我们首先加载附件1和附件2的数据。
- 数据预处理:将时间数据转换为小时和天,并将用户行为转换为特征。
- 特征工程:提取特征和目标变量。
- 模型训练:使用随机森林分类器进行训练,并评估模型准确率。
- 预测新关注行为:使用训练好的模型预测指定用户在2024.7.22的新关注行为。
- 结果保存:将预测结果保存为CSV文件。
通过以上步骤,我们可以预测用户在2024.7.22的新关注行为,并将结果填入表2。
第三个问题是:
问题3. 用户与博主之间互动数可视为点赞数、评论数、关注数之和,平台可据此制定合理的推荐方案,为用户推送“量身定制”的内容,增加用户与博主之间的互动。请基于附件1数据,建立数学模型,预测指定用户在2024.7.21当天是否在线(即使用该社交媒体平台),如果在线,进一步预测该用户可能与博主产生的互动关系,并给出可能与其产生互动数最高的3名博主,将对应的博主ID填入表3。
表3 问题3结果
注:若该用户在2024.7.21未使用该社交媒体平台,则无需填写。
问题3的数学建模方法
1. 问题分析
问题3的目标是预测指定用户在2024.7.21当天是否在线(即是否使用社交媒体平台),如果在线,进一步预测该用户可能与博主产生的互动关系,并给出可能与其产生互动数最高的3名博主。互动数定义为点赞数、评论数、关注数之和。
2. 模型建立
为了完成这一任务,我们可以采用以下步骤进行建模:
2.1 用户在线预测
首先,我们需要预测用户在2024.7.21当天是否在线。这可以通过分析用户的历史行为数据来实现。
- 特征提取:从附件1中提取用户的历史行为数据,包括用户在过去一段时间内的在线频率、在线时段、互动次数等。
- 模型选择:可以使用分类模型(如逻辑回归、随机森林、支持向量机等)来预测用户是否在线。模型的目标是输出一个二元变量,表示用户是否在线。
2.2 用户与博主互动预测
如果预测用户在线,我们需要进一步预测用户可能与哪些博主产生互动,并找出互动数最高的3名博主。
- 特征提取:从附件1中提取用户与博主之间的历史互动数据,包括用户对每个博主的观看、点赞、评论、关注次数等。
- 模型选择:可以使用回归模型(如线性回归、随机森林回归、XGBoost等)来预测用户与每个博主的互动数。模型的目标是输出一个连续变量,表示用户与每个博主的互动数。
2.3 互动数最高的博主选择
根据预测的互动数,选择与用户互动数最高的3名博主。
3. 模型实现
3.1 数据预处理
- 数据清洗:处理缺失值、异常值等。
- 特征工程:提取用户的历史行为特征和用户与博主之间的互动特征。
3.2 模型训练
- 在线预测模型:使用用户的历史行为数据训练分类模型,预测用户是否在线。
- 互动预测模型:使用用户与博主之间的历史互动数据训练回归模型,预测用户与每个博主的互动数。
3.3 模型评估
- 在线预测模型:使用准确率、召回率、F1分数等指标评估模型的性能。
- 互动预测模型:使用均方误差(MSE)、平均绝对误差(MAE)等指标评估模型的性能。
4. 结果输出
根据模型的预测结果,输出指定用户在2024.7.21当天是否在线,以及如果在线,输出与该用户互动数最高的3名博主ID。
5. 模型优化
- 特征选择:通过特征重要性分析,选择对模型预测最有影响的特征。
- 模型调参:使用网格搜索、随机搜索等方法对模型进行调参,提高模型的预测性能。
6. 结果展示
根据模型的预测结果,填写表3:
7. 总结
通过以上建模方法,我们可以有效地预测用户在2024.7.21当天是否在线,并预测用户与博主之间的互动关系,从而为平台的内容推荐提供决策依据。
问题3的数学模型
1. 用户在线预测
假设用户在2024.7.21当天是否在线可以通过其历史行为数据进行预测。设用户 u u u 在2024.7.21当天是否在线为 yu y_u yu,其中 yu=1 y_u = 1 yu=1 表示在线,yu=0 y_u = 0 yu=0 表示不在线。我们可以使用逻辑回归模型来预测 yu y_u yu。
设 Xu X_u Xu 为用户 u u u 的特征向量,包括其在2024.7.11-2024.7.20期间的行为数据(如观看、点赞、评论、关注等行为的频率和时间分布)。逻辑回归模型可以表示为:
P(yu=1∣Xu)=11+e−(β0+βTXu)P(y_u = 1 | X_u) = \\frac{1}{1 + e^{-(\\beta_0 + \\beta^T X_u)}}P(yu=1∣Xu)=1+e−(β0+βTXu)1
其中,β0 \\beta_0 β0 是截距项,β \\beta β 是特征权重向量。
2. 用户与博主的互动预测
如果用户 u u u 在2024.7.21当天在线,我们需要预测其与博主 v v v 的互动数 Iu,v I_{u,v} Iu,v。互动数 Iu,v I_{u,v} Iu,v 可以表示为点赞数、评论数和关注数之和。
设 Iu,v I_{u,v} Iu,v 为用户 u u u 与博主 v v v 的互动数,我们可以使用线性回归模型来预测 Iu,v I_{u,v} Iu,v:
Iu,v=α0+αTZu,v+ϵI_{u,v} = \\alpha_0 + \\alpha^T Z_{u,v} + \\epsilonIu,v=α0+αTZu,v+ϵ
其中,Zu,v Z_{u,v} Zu,v 为用户 u u u 与博主 v v v 的互动特征向量,包括用户 u u u 对博主 v v v 的历史互动数据(如观看、点赞、评论、关注等行为的频率和时间分布),α0 \\alpha_0 α0 是截距项,α \\alpha α 是特征权重向量,ϵ \\epsilon ϵ 是误差项。
3. 推荐博主
对于每个在线用户 u u u,我们计算其与所有博主 v v v 的预测互动数 Iu,v I_{u,v} Iu,v,并选择互动数最高的3名博主作为推荐结果。
4. 结果表示
将预测结果填入表3:
注:若该用户在2024.7.21未使用该社交媒体平台,则无需填写。
总结
通过上述模型,我们可以预测用户在2024.7.21当天是否在线,并进一步预测其与博主的互动关系,从而为用户推荐可能与其互动数最高的3名博主。
要解决第三个问题,我们需要基于附件1的数据,预测指定用户在2024.7.21当天是否在线,并进一步预测该用户可能与博主产生的互动关系,特别是可能与其产生互动数最高的3名博主。我们可以通过以下步骤来实现:
步骤1:数据预处理
首先,我们需要加载附件1的数据,并进行预处理,以便后续分析。
import pandas as pd# 假设附件1的文件名为 \'attachment1.csv\'data = pd.read_csv(\'attachment1.csv\')# 将时间列转换为datetime格式data[\'时间\'] = pd.to_datetime(data[\'时间\'])# 提取2024.7.21当天的数据data_20240721 = data[data[\'时间\'].dt.date == pd.to_datetime(\'2024-07-21\').date()]
步骤2:预测用户是否在线
我们可以通过检查用户在2024.7.21当天是否有任何行为数据来判断其是否在线。
# 指定用户列表specified_users = [\'U9\', \'U22405\', \'U16\', \'U48420\']# 创建一个字典来存储用户是否在线user_online_status = {user: False for user in specified_users}# 检查用户是否在2024.7.21当天有行为数据for user in specified_users: if user in data_20240721[\'用户ID\'].values: user_online_status[user] = True
步骤3:预测用户与博主的互动关系
对于在线的用户,我们可以计算他们与各个博主的互动数(点赞、评论、关注的总和),并找出互动数最高的3名博主。
# 创建一个字典来存储用户与博主的互动数user_interaction_counts = {user: {} for user in specified_users}# 计算每个用户与各个博主的互动数for user in specified_users: if user_online_status[user]: user_data = data_20240721[data_20240721[\'用户ID\'] == user] for _, row in user_data.iterrows(): blogger_id = row[\'博主ID\'] behavior = row[\'用户行为\'] if blogger_id not in user_interaction_counts[user]: user_interaction_counts[user][blogger_id] = 0 if behavior in [2, 3, 4]: # 2: 点赞, 3: 评论, 4: 关注 user_interaction_counts[user][blogger_id] += 1# 找出每个用户互动数最高的3名博主top_bloggers = {user: [] for user in specified_users}for user in specified_users: if user_online_status[user]: sorted_bloggers = sorted(user_interaction_counts[user].items(), key=lambda x: x[1], reverse=True) top_bloggers[user] = [blogger[0] for blogger in sorted_bloggers[:3]]
步骤4:输出结果
最后,我们将结果输出到表3中。
# 创建表3table3 = pd.DataFrame(columns=[\'用户ID\', \'博主ID 1\', \'博主ID 2\', \'博主ID 3\'])for user in specified_users: if user_online_status[user]: row = {\'用户ID\': user} for i, blogger in enumerate(top_bloggers[user], start=1): row[f\'博主ID {i}\'] = blogger table3 = table3.append(row, ignore_index=True)# 输出表3print(table3)
完整代码
import pandas as pd# 假设附件1的文件名为 \'attachment1.csv\'data = pd.read_csv(\'attachment1.csv\')# 将时间列转换为datetime格式data[\'时间\'] = pd.to_datetime(data[\'时间\'])# 提取2024.7.21当天的数据data_20240721 = data[data[\'时间\'].dt.date == pd.to_datetime(\'2024-07-21\').date()]# 指定用户列表specified_users = [\'U9\', \'U22405\', \'U16\', \'U48420\']# 创建一个字典来存储用户是否在线user_online_status = {user: False for user in specified_users}# 检查用户是否在2024.7.21当天有行为数据for user in specified_users: if user in data_20240721[\'用户ID\'].values: user_online_status[user] = True# 创建一个字典来存储用户与博主的互动数user_interaction_counts = {user: {} for user in specified_users}# 计算每个用户与各个博主的互动数
第四个问题是:
问题4. 平台在制定推荐方案时,会充分考虑不同用户使用社交媒体的时间习惯。在问题3的基础上,基于附件1数据,建立数学模型,预测表4中指定用户在2024.7.23是否在线(即使用社交媒体平台),进一步预测该用户在每个在线时段与每个博主的互动数,给出该互动数最高的3名博主ID以及对应的时段,并将结果填入表4。
表4 问题4结果
注:若该用户在2024.7.23未使用该社交媒体平台,则无需填写;推荐时段,只能在以下24个时段中选取0:00-1:00, 1:00-2:00, ……, 23:00-24:00。
问题4的数学建模
1. 问题分析
问题4要求我们基于附件1的历史数据,预测指定用户在2024年7月23日是否在线,并进一步预测该用户在每个在线时段与每个博主的互动数,最终给出互动数最高的3名博主ID及其对应的时段。我们需要考虑用户的时间习惯、历史互动行为以及博主的内容吸引力等因素。
2. 模型假设
- 用户在线时间习惯:用户的使用时间具有一定的规律性,历史数据可以反映用户的在线时间偏好。
- 互动行为与时间的关系:用户的互动行为(点赞、评论、关注)与时间段相关,某些时间段可能更容易产生互动。
- 博主吸引力:博主的历史互动数据可以反映其内容的吸引力,吸引力高的博主更容易与用户产生互动。
3. 模型建立
3.1 用户在线预测
我们可以使用时间序列分析或分类模型来预测用户是否在线。假设用户的历史在线时间具有周期性,可以通过以下步骤进行预测:
- 数据预处理:将附件1中的时间数据按小时分段,统计每个用户在每个时段的在线频率。
- 特征提取:提取用户在每个时段的在线频率作为特征。
- 模型选择:可以使用逻辑回归、随机森林或LSTM等模型来预测用户是否在线。
3.2 用户与博主的互动预测
对于在线用户,我们需要预测其与博主的互动数。可以基于用户的历史互动行为、博主的吸引力以及时间段来建立模型。
- 用户历史互动特征:统计用户与每个博主的历史互动数(点赞、评论、关注)。
- 博主吸引力特征:统计每个博主的总互动数、平均互动数等。
- 时间段特征:将时间分为24个时段,统计用户在每个时段的互动频率。
- 模型选择:可以使用线性回归、决策树回归或XGBoost等模型来预测互动数。
3.3 推荐博主及时段
对于每个在线用户,我们预测其在每个时段与每个博主的互动数,然后选择互动数最高的3个博主及其对应的时段。
4. 模型求解
-
在线预测:
- 使用历史数据训练分类模型,预测用户在2024年7月23日是否在线。
-
互动预测:
- 对于在线用户,使用历史互动数据训练回归模型,预测其在每个时段与每个博主的互动数。
-
推荐博主及时段:
- 对于每个在线用户,选择互动数最高的3个博主及其对应的时段。
5. 结果输出
将预测结果填入表4:
6. 模型评估
- 在线预测模型:通过准确率、召回率等指标评估模型的性能。
- 互动预测模型:通过均方误差(MSE)、平均绝对误差(MAE)等指标评估模型的性能。
7. 模型优化
- 特征工程:可以进一步挖掘用户和博主的特征,如用户活跃度、博主的内容类型等。
- 模型调参:通过交叉验证、网格搜索等方法优化模型参数。
- 集成学习:可以尝试使用多个模型的集成方法来提高预测精度。
8. 结论
通过以上建模过程,我们可以预测用户在2024年7月23日的在线状态及其与博主的互动数,从而为平台制定推荐方案提供决策依据。
问题4的数学模型构建
为了预测用户在2024.7.23的在线状态及其与博主的互动情况,我们可以基于用户的历史行为数据进行建模。以下是详细的数学模型构建过程。
1. 用户在线状态预测
假设用户在某一天的在线状态与其历史活跃时间有关。我们可以基于用户的历史活跃时间分布,使用概率模型预测用户在2024.7.23是否在线。
设:
-
TuT_uTu 为用户 uuu 在历史数据中的活跃时间集合。
-
Pu(t)P_u(t)Pu(t) 为用户 uuu 在时段 ttt 的活跃概率,计算公式为:
Pu(t)=用户 u 在时段 t 活跃的次数用户 u 总活跃次数P_u(t) = \\frac{\\text{用户 } u \\text{ 在时段 } t \\text{ 活跃的次数}}{\\text{用户 } u \\text{ 总活跃次数}}Pu(t)=用户 u 总活跃次数用户 u 在时段 t 活跃的次数 -
若 Pu(t)>θP_u(t) > \\thetaPu(t)>θ(θ\\thetaθ 为预设阈值),则认为用户 uuu 在时段 ttt 在线。
2. 用户与博主的互动数预测
假设用户与博主的互动数与其历史互动行为以及博主的受欢迎程度有关。我们可以使用加权模型预测用户在某一时段与博主的互动数。
设:
-
Iu,bI_{u,b}Iu,b 为用户 uuu 与博主 bbb 的历史互动数(包括点赞、评论、关注)。
-
WbW_bWb 为博主 bbb 的受欢迎程度,计算公式为:
Wb=博主 b 的总互动数所有博主的总互动数W_b = \\frac{\\text{博主 } b \\text{ 的总互动数}}{\\text{所有博主的总互动数}}Wb=所有博主的总互动数博主 b 的总互动数 -
用户 uuu 在时段 ttt 与博主 bbb 的预测互动数为:
Nu,b(t)=Pu(t)⋅Iu,b⋅WbN_{u,b}(t) = P_u(t) \\cdot I_{u,b} \\cdot W_bNu,b(t)=Pu(t)⋅Iu,b⋅Wb
3. 推荐时段与博主ID
对于每个用户 uuu,我们计算其在2024.7.23每个时段 ttt 与每个博主 bbb 的预测互动数 Nu,b(t)N_{u,b}(t)Nu,b(t)。然后,选择互动数最高的3个博主及其对应的时段。
设:
- BuB_uBu 为用户 uuu 在2024.7.23互动数最高的3个博主集合。
- Tu,bT_{u,b}Tu,b 为博主 bbb 对应的互动数最高的时段。
4. 结果输出
根据上述模型,我们可以将预测结果填入表4。若用户未在线,则无需填写。
示例
假设用户 uuu 在2024.7.23的在线时段为 t1,t2,t3t_1, t_2, t_3t1,t2,t3,其与博主 b1,b2,b3b_1, b_2, b_3b1,b2,b3 的互动数分别为 Nu,b1(t1),Nu,b2(t2),Nu,b3(t3)N_{u,b_1}(t_1), N_{u,b_2}(t_2), N_{u,b_3}(t_3)Nu,b1(t1),Nu,b2(t2),Nu,b3(t3),且这些值为最高的3个互动数。则表4中对应的填写内容为:
省略
1. 数据预处理
首先,我们需要加载附件1的数据,并进行必要的预处理,例如将时间列转换为datetime格式,并提取用户的活动时间。
import pandas as pd# 加载附件1的数据data = pd.read_csv(\'附件1.csv\')# 将时间列转换为datetime格式data[\'时间\'] = pd.to_datetime(data[\'时间\'])# 提取日期和小时信息data[\'日期\'] = data[\'时间\'].dt.datedata[\'小时\'] = data[\'时间\'].dt.hour# 筛选出2024.7.23的数据data_2024_07_23 = data[data[\'日期\'] == pd.to_datetime(\'2024-07-23\').date()]
2. 预测用户是否在线
我们可以通过分析用户的历史活动时间来预测他们在2024.7.23是否在线。例如,如果用户在过去的几天中在某个时间段内有活动,那么我们可以预测他们在2024.7.23的相同时间段内也会在线。
# 获取用户的历史活动时间user_activity = data.groupby([\'用户ID\', \'小时\']).size().unstack(fill_value=0)# 预测用户在2024.7.23是否在线def predict_online(user_id): if user_id in user_activity.index: return user_activity.loc[user_id].sum() > 0 return False# 指定用户列表specified_users = [\'U10\', \'U1951\', \'U1833\', \'U26447\']# 预测指定用户是否在线online_users = {user: predict_online(user) for user in specified_users}
3. 预测用户与博主的互动数
对于在线的用户,我们可以进一步预测他们在每个在线时段与每个博主的互动数。互动数可以基于用户的历史互动行为来计算。
# 计算用户与博主的互动数user_blogger_interaction = data_2024_07_23.groupby([\'用户ID\', \'博主ID\', \'小时\']).size().unstack(fill_value=0)# 预测用户与博主的互动数def predict_interaction(user_id, blogger_id, hour): if (user_id, blogger_id) in user_blogger_interaction.index: return user_blogger_interaction.loc[(user_id, blogger_id), hour] return 0# 预测指定用户在2024.7.23的互动数def get_top_bloggers(user_id): if not online_users[user_id]: return [] interaction_counts = {} for blogger_id in data_2024_07_23[\'博主ID\'].unique(): for hour in range(24): interaction_counts[(blogger_id, hour)] = predict_interaction(user_id, blogger_id, hour) # 按互动数排序,取前3名 top_interactions = sorted(interaction_counts.items(), key=lambda x: x[1], reverse=True)[:3] # 返回博主ID和对应的时段 return [(blogger_id, f\"{hour}:00-{hour+1}:00\") for (blogger_id, hour), _ in top_interactions]# 获取指定用户的预测结果results = {user: get_top_bloggers(user) for user in specified_users}
4. 生成结果表
最后,我们将预测结果填入表4中。
# 生成表4省略# 输出表4print(table4)
5. 保存结果
将结果保存为CSV文件,以便后续使用。
table4.to_csv(\'表4结果.csv\', index=False)
更多内容具体可以看看我的下方名片!
里面包含有本次竞赛一手资料与分析!
另外在赛中,我们也会陪大家一起解析建模比赛
记得关注Tina表姐哦~