如何评价2023钉钉杯B题?

目录

一、问题分析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(分类问题)及使用时长(回归问题)

  1. 对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测用户在第12~21天是否会使用该类APP。给出预测结果和真实结果相比的准确率。
  2. 对用户使用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年的小时级别的天气数据。

二、解决问题

  1. 自行车借还情况功能实现:

实现各个站点在一天的自行车借还情况网络图,该网络图是有向图,箭头从借车站点指向还车站点(很多站点之间同时有借还记录,所以大部分站点两两之间是双向连接)。

(一)以2014年8月3日为例进行网络分析,实现自行车借还网络图,计算网络图的节点数,边数,网络密度(表示边的个数占所有可能的连接比例数),给出计算过程和画图结果。

(二)使用上述的网络分析图,对经度位于40.695~40.72,纬度位于- 74.023~-73.973之间的局域网区域进行分析,计算出平均最短路径长度(所有点 两两之间的最短路径长度进行算数平均)和网络直径(被定义网络中最短路径的 最大值)。

  1. 聚类分析

对于2013年7月1日至2015年8月31日数据集的自行车数据进行聚类分析,选 择合适的聚类数量K值,至少选择两种聚类算法进行聚类,并且比较不同的聚类 方法以及分析聚类结果。

  1. 站点借车量的预测分析:

对所有站点公共自行车的借车量预测,预测出未来的单日借车量。将2013年 7月-2015年7月数据作为训练集,2015年8月1-31日的数据作为测试集,预测2015 年8月1-31日每天的自行车单日借车量。给出每个站点预测结果的MAPE,并且给 出模型的参数数量,最后算出所有站点的MAPE的均值(注:测试集不能参与到训 练和验证中,否则作违规处理)。

更多资料请留意微信公众号哦

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式冰箱

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值