目录
一、问题分析11.1 问题111.1.1 K-means聚类算法21.1.2 层次聚类算法21.1.3 DBSCAN聚类算法31.2 对常用APP所属类别聚类31.2.1 肘部法曲线51.2.2 平均轮廓系数61.2.3 层次聚类树状图71.2.4 散点图绘制81.2.5 簇内平均轮廓系数91.3 考虑群体用户的特征的聚类101.3.1 聚类过程101.3.2 类别转换为数值标签的处理101.3.3 初步聚类结果131.3.4 可视化聚类结果141.3.5 用户画像151.4 问题2161.4.1 问题解决方法161.4.2 分类问题常用算法161.4.3 回归问题常用算法181.4.4 问题一(分类问题)的求解191.4.5 问题二(回归问题)的求解21
问题分析
2023钉钉杯大数据竞赛题目分析如下:
问题1
1.聚类分析
(一)根据用户常用所属的20类APP的数据对用户进行聚类,要求至少给出三种不同的聚
类算法进行比较,选择合理的聚类数量K值,并分析聚类结果。
(二)根据聚类结果对不同类别的用户画像,并且分析不同群体用户的特征。(用户画
像定义:根据用户的属性,偏好,行为习惯等信息对用户打标签,用以描述不同群体的用户行为,从而针对不同群体的用户推荐不同所属类别的APP产品。)
有连续30天的智能手机用户监测数据,每天的数据存储在一个txt文件中,包含了10列的信息。下面是表格1的说明和每列的变量释义:
表1:每天的数据(10列)
uid:用户的唯一标识
appid:APP的唯一标识,与app_class文件中的第一列对应
app_type:APP类型,可以是系统自带或用户安装
start_day:使用起始天,取值范围为1-30。第一天数据的头两行的使用起始天取值为0,表示是在前一天开始使用的。
start_time:使用起始时间
end_day:使用结束天
end_time:使用结束时间
duration:使用时长(秒)
up_flow:上行流量
down_flow:下行流量
此外,有一个名为"appclass.csv"的辅助表格,包含两列的信息。第一列是appid,表示APP的唯一标识,第二列是appclass,表示APP所属的类别。总共有4000多个常用APP,分属于20个常用的类别(用英文字母a-t表示),而其他APP则被认为是不常用或所属类别未知
(一)根据用户常用所属的20类APP的数据对用户进行聚类,要求至少给出三种不同的聚类算法进行比较,选择合理的聚类数量K值,并分析聚类结果。
在对用户进行聚类之前,首先需要对数据进行预处理和特征选择。使用Python和一些常见的机器学习库(如NumPy、Pandas和Scikit-learn)。
K-means聚类算法
K-means是一种常见的聚类算法,它需要指定聚类数量K值。可以使用肘部法(Elbow Method)来选择最合适的K值。
K-means算法的使用方法如下:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 使用肘部法选择K值
inertia = []
k_values = range(2, 11)
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(scaled_data)
inertia.append(kmeans.inertia_)
# 绘制肘部法曲线
plt.plot(k_values, inertia, 'bx-')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method')
plt.show()
根据肘部法曲线,选择使得惯性(inertia)急剧下降后趋于平缓的K值。
层次聚类算法
层次聚类是一种自底向上的聚类方法,可以构建聚类层次结构。可以使用聚类树状图(Dendrogram)来帮助选择最合适的聚类数量。
from scipy.cluster.hierarchy import dendrogram, linkage
# 使用层次聚类
linked = linkage(scaled_data, 'ward')
plt.figure(figsize=(10, 6))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Cluster Size')
plt.ylabel('Distance')
plt.show()
根据聚类树状图,选择合适的距离阈值或聚类数量K值。
DBSCAN聚类算法
DBSCAN是一种基于密度的聚类算法,不需要预先指定聚类数量。它通过指定邻域半径和最小样本数来确定密度。
from sklearn.cluster import DBSCAN
# 使用DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
clusters = dbscan.fit_predict(scaled_data)
聚类结果分析是一个非常主观的过程,可以根据具体问题和数据特点选择适合的方法。可以使用各种评估指标(如轮廓系数)来评估聚类结果的质量,也可以进行可视化分析。
对常用APP所属类别聚类
对于问题1而言,如果我们简单地对app_class.csv进行聚类,代码如下:
import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
from sklearn.metrics import silhouette_score
from scipy.cluster.hierarchy import dendrogram
import matplotlib.pyplot as plt
import seaborn as sns
# 读取辅助表格
app_class = pd.read_csv('初赛数据集/app_class.csv', header=None)
# 将类别转换为数值标签
label_encoder = LabelEncoder()
app_class_label = label_encoder.fit_transform(app_class.iloc[:, 1])
# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(app_class_label.reshape(-1, 1))
# 聚类算法比较和分析
k_values = range(2, 11) # 聚类数量的取值范围
# K-means聚类算法
kmeans_scores = []
kmeans_silhouette_scores = []
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(scaled_data)
kmeans_scores.append(kmeans.inertia_)
silhouette_avg = silhouette_score(scaled_data, kmeans.labels_)
kmeans_silhouette_scores.append(silhouette_avg)
# 层次聚类算法
agglomerative_silhouette_scores = []
for k in k_values:
agglomerative = AgglomerativeClustering(n_clusters=k)
labels = agglomerative.fit_predict(scaled_data)
silhouette_avg = silhouette_score(scaled_data, labels)
agglomerative_silhouette_scores.append(silhouette_avg)
# DBSCAN聚类算法
eps_values = [0.1, 0.2, 0.3, 0.4, 0.5]
dbscan_scores = []
dbscan_silhouette_scores = []
for eps in eps_values:
dbscan = DBSCAN(eps=eps, min_samples=5)
clusters = dbscan.fit_predict(scaled_data)
num_clusters = len(set(clusters)) - (1 if -1 in clusters else 0) # 排除噪点簇
if num_clusters > 1:
silhouette_avg = silhouette_score(scaled_data, clusters)
dbscan_silhouette_scores.append(silhouette_avg)
dbscan_scores.append(num_clusters)
然后我们添加可视化的代码:
肘部法曲线
from scipy.cluster.hierarchy import dendrogram, linkage
# 绘制肘部法曲线
plt.figure(figsize=(10, 5),dpi=300)
plt.subplot(1, 2, 1)
plt.plot(k_values, kmeans_scores, 'bx-', label='K-means')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Inertia')
plt.title('K-means Clustering - Inertia')
plt.legend()
plt.show()
添加图片注释,不超过 140 字(可选)
平均轮廓系数
# 绘制平均轮廓系数
plt.subplot(1, 2, 2)
plt.plot(k_values, kmeans_silhouette_scores, 'bx-', label='K-means')
plt.plot(k_values, agglomerative_silhouette_scores, 'go-', label='Agglomerative')
# plt.plot(eps_values, dbscan_silhouette_scores, 'rs-', label='DBSCAN')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Silhouette Score')
plt.title('Clustering Algorithms Comparison - Silhouette Score')
plt.legend()
plt.tight_layout()
plt.show()
添加图片注释,不超过 140 字(可选)
层次聚类树状图
# 绘制层次聚类树状图
plt.figure(figsize=(12, 6),dpi=300)
linked = dendrogram(linkage(scaled_data, 'ward'), orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Cluster Size')
plt.ylabel('Distance')
plt.show()
添加图片注释,不超过 140 字(可选)
散点图绘制
# 绘制散点图
plt.figure(figsize=(8, 6),dpi=300)
plt.scatter(app_class.index, app_class_label, c=kmeans.labels_, cmap='viridis')
plt.xlabel('Index')
plt.ylabel('App Class Label')
plt.title('K-means Clustering')
plt.colorbar()
plt.show()
添加图片注释,不超过 140 字(可选)
簇内平均轮廓系数
# 绘制簇内平均轮廓系数
plt.figure(figsize=(8, 6),dpi=300)
plt.plot(k_values, kmeans_silhouette_scores, color='blue')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Average Silhouette Score')
plt.title('K-means Clustering - Average Silhouette Score')
plt.show()
添加图片注释,不超过 140 字(可选)
考虑群体用户的特征的聚类
聚类过程
我们首先读取辅助表格app_class.csv,并使用LabelEncoder将类别转换为数值标签。然后,我们创建一个空的DataFrameall_data来存储所有数据。
接下来,我们遍历21个txt文件,逐个读取并加载数据。对于每个txt文件,我们将类别转换为数值标签,并将数据添加到总的DataFrameall_data中。
在加载和处理完所有数据后,我们使用StandardScaler对选定的特征进行标准化。然后,我们使用K-means聚类算法对标准化后的数据进行聚类。
最后,我们输出每个聚类的用户数量,并根据聚类结果分析不同群体用户的特征,例如使用时长、流量等。
类别转换为数值标签的处理
将类别转换为数值标签的时候,如果直接使用
data['app_class_label'] = label_encoder.transform(data['appid'])就会报错,解决方法如下:
txt中的appid去重后就是所有的appid,这些appid减去csv表格中的第一列中的appid即得到其余位归类的APP的appid,这些appid统一为“u”类,其他已经分好类的APP的appid为用英文字母a-t表示,这样得到了一列有着所有appid所属类别的数据列,然后再使用LabelEncoder()进行处理,最后在使用label_encoder.transform(data['appid'])将类别转换为数值标签。
import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.cluster import KMeans
import os
# 读取辅助表格
app_class = pd.read_csv('初赛数据集/app_class.csv', header=None)
# 获取所有appid
all_appids = set(app_class.iloc[:, 0])
# 创建一个空的DataFrame来存储所有数据
all_data = pd.DataFrame()
# 遍历每个txt文件
# for i in range(1, 22):
for i in range(1, 2):
# 构造文件名
filename = f"day{i:02d}.txt"
filepath = os.path.join('初赛数据集', filename)
# 读取txt文件
data = pd.read_csv(filepath, header=None)
data.columns = ['uid', 'appid', 'app_type', 'start_day', 'start_time', 'end_day', 'end_time', 'duration', 'up_flow', 'down_flow']
# 将数据添加到总的DataFrame中
all_data = pd.concat([all_data, data], ignore_index=True)
# 新建一个DataFrame来存储未知类别的appid的类别
unknown_appids = set(all_data['appid']) - all_appids
unknown_data = pd.DataFrame({'appid': list(unknown_appids), 'app_class': 'u'})
app_class.columns = ['appid', 'app_class']
app_class
# 合并已知类别和未知类别的appid的类别
merged_data = pd.concat([app_class, unknown_data], ignore_index=True)
merged_data
merged_data = merged_data.merge(all_data, on='appid', how='right')
# 将类别转换为数值标签
label_encoder = LabelEncoder()
merged_data['app_class_label'] = label_encoder.fit_transform(merged_data['app_class'])
# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(merged_data[['app_class_label', 'duration', 'up_flow', 'down_flow']])
# 聚类算法
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(scaled_data)
# 将聚类结果添加到总的DataFrame中
merged_data['cluster_label'] = kmeans.labels_
# 输出每个聚类的用户数量
cluster_counts = merged_data['cluster_label'].value_counts()
print(cluster_counts)
# 根据聚类结果分析不同群体用户的特征
for cluster_label in merged_data['cluster_label'].unique():
cluster_data = merged_data[merged_data['cluster_label'] == cluster_label]
# 统计该群体用户的特征,例如使用时长、流量等
avg_duration = cluster_data['duration'].mean()
avg_up_flow = cluster_data['up_flow'].mean()
avg_down_flow = cluster_data['down_flow'].mean()
# 输出该群体用户的特征
print(f"Cluster {cluster_label} User Profile:")
print(f"Average Duration: {avg_duration:.2f}")
print(f"Average Up Flow: {avg_up_flow:.2f}")
print(f"Average Down Flow: {avg_down_flow:.2f}")
print()
初步聚类结果
聚类结果显示
cluster_label
1 3001204
0 2859302
2 7
Name: count, dtype: int64
Cluster 1 User Profile:
Average Duration: 1098.56
Average Up Flow: 71371.75
Average Down Flow: 10742.07
Cluster 0 User Profile:
Average Duration: 441.66
Average Up Flow: 1129812.31
Average Down Flow: 300521.24
Cluster 2 User Profile:
Average Duration: 1424637041.00
Average Up Flow: 761416.86
Average Down Flow: 18054.43
可视化聚类结果
# 可视化聚类结果
plt.figure(figsize=(8, 6),dpi=300)
sns.scatterplot(data=merged_data, x='duration', y='down_flow', hue='cluster_label', palette='Set1')
plt.title('Clustering Results')
plt.xlabel('Duration')
plt.ylabel('Down Flow')
plt.show()
添加图片注释,不超过 140 字(可选)
用户画像
在代码中,我们首先进行聚类分析并将聚类结果添加到总的DataFrame中。然后,根据聚类结果提取不同类别的用户画像,即将用户ID(uid)和所属的聚类标签(cluster_label)进行提取。接下来,我们对不同群体用户进行特征分析,例如计算平均使用时长、平均上行流量和平均下行流量。最后,输出用户画像和不同群体用户的特征。
Cluster 1 User Profile:
Average Duration: 1098.56
Average Up Flow: 71371.75
Average Down Flow: 10742.07
Cluster 0 User Profile:
Average Duration: 441.66
Average Up Flow: 1129812.31
Average Down Flow: 300521.24
Cluster 2 User Profile:
Average Duration: 1424637041.00
Average Up Flow: 761416.86
Average Down Flow: 18054.43
问题2
APP使用情况预测分析:要研究的问题是通过用户的APP使用记录预测用户未来是否使用APP(分类问题)及使用时长(回归问题)
- 对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测用户在第12~21天是否会使用该类APP。给出预测结果和真实结果相比的准确率。
- 对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测第12~21天用户使用a类APP的有效日均使用时长。评价指标选用NMSE。
问题解决方法
从已有的数据计算每天a类APP的使用情况,包括是否使用APP及使用时长,可以根据start_day和end_day判断是否使用APP,根据对每天的duration进行求和得到每天的使用时长,形成一个新的数据表,进而进行是否使用APP(分类预测)及使用时长(回归预测)
当处理分类问题和回归问题时,以下是逻辑回归、决策树、随机森林、K近邻和支持向量机这五种常用机器学习模型的全面介绍:
分类问题常用算法
1. 逻辑回归(Logistic Regression):
- 逻辑回归是一种经典的分类算法,常用于二分类问题。
- 通过将线性回归模型的输出映射到[0, 1]区间,表示样本属于某个类别的概率。
- 模型参数可以使用最大似然估计或正则化方法来学习。
- 优点:计算效率高、容易解释、对特征工程友好。
- 缺点:假设特征与目标变量之间的关系是线性的。
2. 决策树(Decision Tree):
- 决策树使用树状结构来进行分类决策。
- 通过对特征的分裂来划分数据集,直到达到某个终止条件(例如最大深度或叶子节点数)。
- 决策树可以处理离散和连续特征,同时能够捕捉特征之间的非线性关系。
- 优点:易于解释、可处理离散和连续特征、对异常值不敏感。
- 缺点:容易过拟合、对数据中的噪声和不相关特征敏感。
3. 随机森林(Random Forest):
- 随机森林是基于决策树的集成学习方法,通过组合多个决策树来提高分类性能。
- 通过随机选择特征子集和有放回的采样创建不同的决策树,并通过投票或平均来进行预测。
- 随机森林具有较高的准确性和鲁棒性,并且能够处理高维数据和大量特征。
- 优点:准确性高、能够处理高维数据、对异常值和噪声不敏感。
- 缺点:模型解释性较差、在某些情况下可能过拟合。
4. K近邻(K-Nearest Neighbors):
- K近邻算法通过计算新样本与训练样本之间的距离,找到距离最近的K个邻居样本。
- 根据邻居样本的标签进行投票或平均来预测新样本的标签。
- K近邻算法简单直观,适用于多分类问题和非线性关系的数据。
- 优点:简单易懂、对异常值不敏感、对非线性数据具有较好的拟合能力。
- 缺点:计算复杂度高、对数据中的噪声敏感、需要确定合适的K值。
5. 支持向量机(Support Vector Machine):
- 支持向量机是一种经典的二分类算法,可以通过核函数扩展到多分类问题。
- 通过在特征空间中寻找最优超平面,将不同类别的样本分开。
- 支持向量机可以处理高维数据和非线性关系,并具有较好的泛化能力。
- 优点:泛化能力强、对于高维数据和非线性关系具有较好的拟合能力。
- 缺点:计算复杂度较高、对参数调优敏感。
回归问题常用算法
1. 线性回归(Linear Regression):
- 线性回归是一种经典的回归算法,用于建立特征与目标变量之间的线性关系模型。
- 通过最小化目标变量与预测变量之间的均方误差,来拟合最佳的线性模型。
- 线性回归适用于连续目标变量和线性关系的数据。
- 优点:计算效率高、模型解释性强、对特征工程友好。
- 缺点:对非线性关系拟合能力较弱。
2. 决策树回归(Decision Tree Regression):
- 决策树回归与分类问题中的决策树类似,但用于预测连续目标变量。
- 通过特征的分裂来划分数据集,直到达到某个终止条件(例如最大深度或叶子节点数)。
- 决策树回归可以处理离散和连续特征,同时能够捕捉特征之间的非线性关系。
- 优点:易于解释、可处理离散和连续特征、对异常值不敏感。
- 缺点:容易过拟合、对数据中的噪声和不相关特征敏感。
3. 随机森林回归(Random Forest Regression):
- 随机森林回归是基于决策树的集成学习方法,用于预测连续目标变量。
- 通过组合多个决策树来提高回归性能,并通过平均预测值来得到最终结果。
- 随机森林回
归具有较高的准确性和鲁棒性,并且能够处理高维数据和大量特征。
- 优点:准确性高、能够处理高维数据、对异常值和噪声不敏感。
- 缺点:模型解释性较差、在某些情况下可能过拟合。
4. K近邻回归(K-Nearest Neighbors Regression):
- K近邻回归与分类问题中的K近邻类似,但用于预测连续目标变量。
- 通过计算新样本与训练样本之间的距离,找到距离最近的K个邻居样本。
- 根据邻居样本的目标变量的平均值或加权平均值进行预测。
- 优点:简单易懂、对异常值不敏感、对非线性数据具有较好的拟合能力。
- 缺点:计算复杂度高、对数据中的噪声敏感、需要确定合适的K值。
5. 支持向量机回归(Support Vector Machine Regression):
- 支持向量机回归是一种通过寻找最优超平面来进行回归预测的方法。
- 支持向量机回归可以通过核函数扩展到非线性回归问题。
- 通过在特征空间中寻找最优超平面,使得预测值与目标变量的误差最小。
- 优点:泛化能力强、对于高维数据和非线性关系具有较好的拟合能力。
- 缺点:计算复杂度较高、对参数调优敏感。
这些模型在不同情况下具有各自的优势和适用性。在实际应用中,可以根据问题的特点、数据集的属性以及模型的优点和限制来选择合适的模型。对于分类问题和回归问题,可以根据模型的准确性、计算复杂度、对异常值和噪声的敏感性、对特征工程的友好性等因素进行综合考虑。同时,还可以通过交叉验证等技术来评估和比较模型的性能。
问题一(分类问题)的求解
问题一(分类问题):根据用户第111天的a类APP的使用情况,预测用户在第1221天是否会使用该类APP。
在分类问题中,我们使用了逻辑回归、决策树、随机森林、K近邻和支持向量机等多种分类模型进行训练和预测,
代码如下:
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
# 构建训练集和测试集
train_data = daily_usage[daily_usage['end_day'].between(1, 11)]
test_data = daily_usage[daily_usage['end_day'].between(12, 21)]
# 提取特征和标签
X_train = train_data[['uid', 'end_day']]
y_train = train_data['app_usage']
X_test = test_data[['uid', 'end_day']]
y_test = test_data['app_usage']
## 构建多种分类模型
models = {
'Logistic Regression': LogisticRegression(),
'Decision Tree': DecisionTreeClassifier(),
'Random Forest': RandomForestClassifier(),
'KNN': KNeighborsClassifier(),
'SVM': SVC()
}
# 训练和预测多种分类模型,并计算准确率
results = {}
for model_name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
results[model_name] = accuracy
# 输出模型准确率对比结果
print("模型准确率对比:")
for model_name, accuracy in results.items():
print(f"{model_name}: {accuracy}")
问题二(回归问题)的求解
问题二(回归问题):根据用户第111天的a类APP的使用情况,预测第1221天用户使用a类APP的有效日均使用时长。
我们使用了线性回归、决策树回归、随机森林回归、K近邻回归和支持向量机回归等多种回归模型进行训练和预测,并计算了它们的NMSE。
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
# 按照用户和日期统计每天的a类APP使用情况
daily_usage = merged_data[merged_data['app_class'] == 'a'].groupby(['uid', 'end_day']).agg({'duration': 'sum'}).reset_index()
# 构建训练集和测试集
train_data = daily_usage[daily_usage['end_day'].between(1, 11)]
test_data = daily_usage[daily_usage['end_day'].between(12, 21)]
# 提取特征和标签
X_train = train_data[['uid', 'end_day']]
y_train = train_data['duration']
X_test = test_data[['uid', 'end_day']]
y_test = test_data['duration']
# 构建多种回归模型
models = {
'Linear Regression': LinearRegression(),
'Decision Tree': DecisionTreeRegressor(),
'Random Forest': RandomForestRegressor(),
'KNN': KNeighborsRegressor(),
'SVR': SVR()
}
# 训练和预测多种回归模型,并计算NMSE
results = {}
for model_name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
nmse = mean_squared_error(y_test, y_pred) / y_test.var()
results[model_name] = nmse
# 输出模型NMSE对比结果
print("模型NMSE对比:")
for model_name, nmse in results.items():
print(f"{model_name}: {nmse}")
1 题目
Citi Bike是纽约市在2013年启动的一项自行车共享出行计划,由“花旗银行”(Citi Bank)赞助并取名为“花旗单车”(Citi Bike)。在曼哈顿,布鲁克林,皇后区和泽西市有8,000辆自行车和500个车站。为纽约的居民和游客提供一种 方便快捷,并且省钱的自行车出行方式。人们随处都能借到Citi Bank,并在他们的目的地归还。本案例的数据有两部分:第一部分是纽约市公共自行车的借还交易流水表。Citi Bik自行车与共享单车不同,不能使用手机扫码在任意地点借还车,而需要使用固定的自行车桩借还车,数据集包含2013年7月1日至2016年8 月31日共38个月(1158天)的数据,每个月一个文件。其中2013年7月到2014年8 月的数据格式与其它年月的数据格式有所差别,具体体现在变量starttime和stoptime的存储格式不同。
第二部分是纽约市那段时间的天气数据,并存储在weather_data_NYC.csv文 件中,该文件包含2010年至2016年的小时级别的天气数据。
二、解决问题
- 自行车借还情况功能实现:
实现各个站点在一天的自行车借还情况网络图,该网络图是有向图,箭头从借车站点指向还车站点(很多站点之间同时有借还记录,所以大部分站点两两之间是双向连接)。
(一)以2014年8月3日为例进行网络分析,实现自行车借还网络图,计算网络图的节点数,边数,网络密度(表示边的个数占所有可能的连接比例数),给出计算过程和画图结果。
(二)使用上述的网络分析图,对经度位于40.695~40.72,纬度位于- 74.023~-73.973之间的局域网区域进行分析,计算出平均最短路径长度(所有点 两两之间的最短路径长度进行算数平均)和网络直径(被定义网络中最短路径的 最大值)。
- 聚类分析
对于2013年7月1日至2015年8月31日数据集的自行车数据进行聚类分析,选 择合适的聚类数量K值,至少选择两种聚类算法进行聚类,并且比较不同的聚类 方法以及分析聚类结果。
- 站点借车量的预测分析:
对所有站点公共自行车的借车量预测,预测出未来的单日借车量。将2013年 7月-2015年7月数据作为训练集,2015年8月1-31日的数据作为测试集,预测2015 年8月1-31日每天的自行车单日借车量。给出每个站点预测结果的MAPE,并且给 出模型的参数数量,最后算出所有站点的MAPE的均值(注:测试集不能参与到训 练和验证中,否则作违规处理)。
更多资料请留意微信公众号哦