数据仓库与数据挖掘技术
实验报告
24 秋
姓名: 王文海
班级: 计实验22
学号: 22101130107
成绩:
1. 实验环境
1.1 硬件环境
- 操作系统:macOS
1.2 系统环境
- 开发工具:PyCharm
- 编程语言:Python
1.3 开发工具及相关类库
-
Python 环境和相关类库
- Python 版本:Python 3.9.19
- Conda:用于管理Python环境和包的工具,支持跨平台的环境隔离和包管理
- 相关类库:
os
,sys
,time
,datetime
,dateutil
:系统基础包,用于处理文件路径、系统操作、时间处理等。pandas
:用于数据表分析,提供高效的数据结构和数据分析工具。numpy
:用于多维数组及矩阵运算,提供强大的数值计算功能。matplotlib
:用于绘图,支持各种图表的绘制。sympy.physics.control.control_plots
:用于控制系统分析和绘图。matplotlib.font_manager
:用于管理字体,支持自定义字体。
2 数据仓库及多维分析
2.1 加载数据
2.2 数据基本特性
可以通过修改如图的alpha值调整
设置点的透明度为 0.5,值越小,点越透明,从而可以更好地展示数据密集区域的分布情况
修改前
修改后
2.3 增加维度
1 | # 假设 df 是您的 DataFrame,并且已经包含了 timestamp 列 |
增加几种间隔属性,用于之后绘制图片使用
2.4 按时间统计
绘制直方图的代码如下
1 |
|
绘制结果如下
如果实际按照5分钟和15分钟间隔绘制图片,可以考虑减少刻度标签的数量来保证整洁性。
2.5 按路段统计
2.5.1 路段总量
2.5.2 链接GPS计数
2.5.3 获取路段数据
2.6 按车辆统计
2.6.1 车辆总量
2.6.2 链接GPS计数
2.6.3 获取路段数据
2.7 *按采样间隔统计
略
2.8 问题与总结
- 由于我使用的mac电脑,所以在一开始的绘制图片由于字体问题产生了许多问题,在查阅资料后通过替换字体路径解决了这个问题
- 之前所使用的conda环境缺少部分包,下载后解决
- jupyter的用法不太熟悉,经过上述的内容练习后现在可以初步使用
3 数据挖掘
3.1 线性回归
线性回归是一种用于预测连续值的监督学习算法。给定一组输入特征 x 和对应的输出值 y,线性回归的目标是找到一个函数 f(x),使得 f(x) 能够尽可能准确地预测 y。在本问题中,我们使用多项式回归来拟合给定的数据点。
3.1.1 数据描述
给定的数据集包含以下样本点:
- x=[0,3,5,9,11]x=[0,3,5,9,11]
- y=[1,5,3,2,9]y=[1,5,3,2,9]
我们希望使用一个 n次多项式来拟合这些数据点。
绘制图如下

为了分析不同超参数对线性回归模型性能的影响,我们可以设置不同的多项式次数 n 和正则化系数 λ进行实验。以下是具体的实验步骤和结果分析。
-
设置不同的多项式次数 n:
- n=2
- n=4
- n=6
-
设置不同的正则化系数 λ:
- λ=0 (普通最小二乘法)
- λ=0.1
- λ=1
- λ=10
3.1.2 实验步骤
-
分别使用不同的 n 和 λ 进行拟合,并绘制拟合曲线。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 定义绘制拟合曲线的函数
def plot_fit(x, y, t, theta1, theta2, n, lambd):
plt.title(f'{n-1} degree polynomial fitting') # 设置标题
plt.plot(x,y,'o',label='samples')
plt.plot(t, fit(t, theta1), label='OLS Fit') # 绘制普通最小二乘法拟合曲线
plt.plot(t, fit(t, theta2), label='Ridge Fit (λ={})'.format(lambd)) # 绘制带正则化项的拟合曲线
plt.grid() # 显示网格线
plt.legend() # 显示图例
plt.show() # 显示最终图表
# 实验不同的多项式次数 n
for n in [2, 4, 6]:
A = np.vander(x, n, increasing=True)
b = np.array(y)
# 普通最小二乘法
theta_ols = np.linalg.inv(A.T.dot(A)).dot(A.T).dot(b)
# 带正则化项的最小二乘法
for lambd in [0, 0.1, 1, 10]:
theta_ridge = np.linalg.inv(A.T.dot(A) + lambd * np.eye(n)).dot(A.T).dot(b)
t = np.linspace(min(x), max(x), 1000)
plot_fit(x, y, t, theta_ols, theta_ridge, n, lambd)绘制图表如下
3.1.3 结论
- 多项式次数 n:选择合适的多项式次数非常重要。过低的多项式次数会导致欠拟合,而太高的多项式次数会导致过拟合。通常可以通过交叉验证来选择最优的多项式次数。
- 正则化系数 λ:正则化系数 λ 可以有效控制模型的复杂度,减少过拟合的风险。选择合适的 λ值可以通过交叉验证或网格搜索来确定。
3.2 k-means聚类
3.2.1 数据描述
为了分析不同超参数对K-means聚类算法性能的影响,我们可以设置不同的聚类数量 kk 和迭代次数 epochsepochs 进行实验。
- 设置不同的聚类数量 k:
- k=2
- k=3
- k=4
- 设置不同的迭代次数 epochsepochs:
- epochs=3
- epochs=6
- epochs=9
- 分别使用不同的 k 和 epochs 进行聚类,并绘制聚类结果。
3.2.2 实验步骤
代码如下
1 | def draw_kmeans(X, label, means, epoch): |
绘制图片如下

3.2.3 结论
- 聚类数量 k:选择合适的聚类数量非常重要。过少的聚类数量会导致欠拟合,而太多的聚类数量会导致过拟合。通常可以通过肘部法则(Elbow Method)或轮廓系数(Silhouette Coefficient)来选择最优的聚类数量。
- 迭代次数 epochs:迭代次数可以有效控制聚类算法的收敛速度。选择合适的迭代次数可以通过观察聚类中心的收敛情况来确定。
3.3 knn分类
3.3.1 数据描述
代码实现了一个简单的 k-近邻(k-NN)算法,并且包含了一个绘图函数 draw_knn
来可视化结果。
3.3.2 实验步骤
代码如下
1 | def draw_knn(x, neighbor_list, X, label): |
绘制图片如下

3.3.3 结论
通过设置不同的超参数(如 k 值),我们可以观察到 k-NN 算法在不同参数下的表现:
- k 值的选择:
- 当 k 值较小时(如 k=3 或 k=5),模型对噪声敏感,容易受到局部数据的影响,分类结果可能不稳定。
- 当 k 值较大时(如 k=7 或 k=9),模型对噪声的鲁棒性增强,分类结果更稳定,但可能引入偏差,导致模型对数据的整体分布过于平滑。
- 距离度量:
- 欧几里得距离是最常用的距离度量,适用于大多数情况。但在某些特定场景下,可能需要使用其他距离度量(如曼哈顿距离、余弦相似度等)。
4 实验中遇到的问题
- 首先是标准库我当前主要使用的conda环境并没有,下载后正常运行。
- 字体问题,有很多字体mac上面没有,查阅资料的得知在win上运行正常,后来找到了其他方法替代。
- 代码读不懂,通过问
国产代码助手CodeGeex
了解代码并逐步修改调整参数,最终完成实验。 - 更深刻了解到python局限性,稍微代码多一点作为动态语言维护性十分差。通过类型注解可以缓解一部分但不能完全缓解。
- 好的开发工具是提高效率的利器,Pycharm的功能远超Vscode
5 实验总结
本次实验通过使用Python和相关类库,成功进行了数据仓库的多维分析和数据挖掘。我们加载并分析了GPS数据,通过调整透明度和增加时间维度,优化了数据展示。实验还涉及线性回归、k-means聚类和k-NN分类,通过设置不同超参数,观察了模型性能。实验过程中解决了字体和环境问题,提升了代码的可读性和维护性。