楼主: 371567821
44 0

[教育经济学基本知识] 人工智能之数据分析 numpy:第十五章 项目实践 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-5-4
最后登录
2018-5-4

楼主
371567821 发表于 2025-11-26 19:09:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

人工智能之数据分析 numpy

第十五章 项目实践

前言

本文包含五个循序渐进的 NumPy 实战项目,涵盖数组操作、数学运算、数据处理、可视化以及性能优化等内容。这些练习有助于巩固基础知识并提升实际应用能力。部分项目涉及后续课程内容,可根据兴趣领域提前探索或学完相关知识后再进行复现。

项目 1:图像灰度化与边缘检测(基础)

目标

使用纯 NumPy 实现彩色图像转为灰度图,并完成基于 Sobel 算子的简单边缘检测。

知识点

  • 数组切片与广播机制
  • 卷积操作的手动实现
  • 将图像视为三维数组(高度 × 宽度 × 通道)

步骤

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

# 1. 加载图像(可替换为本地图片,或使用模拟数据)
# 若无真实图像,生成随机数组代替:
img = np.random.randint(0, 256, (200, 200, 3), dtype=np.uint8)

# 2. 转换为灰度图(采用加权平均法:R*0.299 + G*0.587 + B*0.114)
gray = np.dot(img[...,:3], [0.299, 0.587, 0.114]).astype(np.uint8)

# 3. 实现 Sobel 边缘检测(通过手动卷积)
def sobel_edge(gray):
    # 定义 Sobel 卷积核
    Kx = np.array([[-1, 0, 1],
                   [-2, 0, 2],
                   [-1, 0, 1]])
    Ky = np.array([[-1,-2,-1],
                   [ 0, 0, 0],
                   [ 1, 2, 1]])

    h, w = gray.shape
    edges = np.zeros_like(gray, dtype=np.float32)

    # 遍历像素点执行卷积(忽略边界)
    for i in range(1, h-1):
        for j in range(1, w-1):
            gx = np.sum(Kx * gray[i-1:i+2, j-1:j+2])
            gy = np.sum(Ky * gray[i-1:i+2, j-1:j+2])
            edges[i, j] = np.sqrt(gx**2 + gy**2)
    
    return edges.astype(np.uint8)

edges = sobel_edge(gray)

# 4. 可视化结果
fig, axs = plt.subplots(1, 3, figsize=(12, 4))
axs[0].imshow(img)
axs[0].set_title('Original')
axs[1].imshow(gray, cmap='gray')
axs[1].set_title('Grayscale')
axs[2].imshow(edges, cmap='gray')
axs[2].set_title('Edges')
plt.show()

进阶挑战

尝试利用以下方法实现无循环卷积,显著提高计算效率:

np.lib.stride_tricks.sliding_window_view

项目 2:股票收益率分析(统计与金融)

目标

模拟股票价格走势,计算日收益率、年化波动率、最大回撤等关键金融指标。

知识点

  • 基于正态分布的随机游走模拟
  • 百分比变化计算
  • 常用统计函数(如 std, max, argmin)
  • 布尔索引的应用
np.diff
np.log

步骤

import numpy as np
import matplotlib.pyplot as plt

# 1. 模拟股价路径(简化版几何布朗运动)
np.random.seed(42)
n_days = 252  # 假设一年交易日数量
returns = np.random.normal(loc=0.001, scale=0.02, size=n_days)  # 日收益率序列
price = 100 * np.exp(np.cumsum(returns))  # 初始价格设为100

# 2. 计算核心指标
daily_returns = np.diff(price) / price[:-1]  # 日收益率(也可直接用 returns)
volatility = np.std(daily_returns) * np.sqrt(252)  # 年化波动率
max_drawdown = np.min(price / np.maximum.accumulate(price) - 1)

print(f"年化波动率: {volatility:.2%}")

项目 3:地理距离矩阵计算(广播与向量化)

目标

给定一组地理位置坐标,使用 NumPy 的广播机制和向量化操作快速构建城市间的欧氏距离矩阵。

知识点

  • NumPy 广播规则
  • 向量化代替嵌套循环
  • 高效的矩阵运算

步骤

import numpy as np
import matplotlib.pyplot as plt

# 1. 生成模拟坐标(例如 10 个城市的位置)
np.random.seed(123)
coords = np.random.rand(10, 2) * 100  # 坐标范围在 0~100 之间

# 2. 使用广播计算两两之间的欧氏距离
diff = coords[:, np.newaxis, :] - coords[np.newaxis, :, :]  # 差值矩阵
dist_matrix = np.sqrt(np.sum(diff**2, axis=-1))  # 距离矩阵

# 3. 可视化距离热力图
plt.figure(figsize=(8, 6))
plt.imshow(dist_matrix, cmap='viridis')
plt.colorbar(label='Distance')
plt.title('Geographical Distance Matrix')
plt.show()

项目 4:主成分分析(PCA)从零实现

目标

不依赖 scikit-learn 等高级库,仅使用 NumPy 实现 PCA 降维算法。

知识点

  • 协方差矩阵计算
  • 特征值分解
  • 数据中心化
  • 投影变换

步骤

import numpy as np
import matplotlib.pyplot as plt

# 1. 生成模拟数据(二维以便可视化)
np.random.seed(42)
mean = [0, 0]
cov = [[2.0, 1.5],
       [1.5, 1.0]]
X = np.random.multivariate_normal(mean, cov, 200)  # 原始数据

# 2. 数据中心化
X_centered = X - np.mean(X, axis=0)

# 3. 计算协方差矩阵并进行特征值分解
cov_matrix = np.cov(X_centered.T)
eigenvals, eigenvecs = np.linalg.eig(cov_matrix)

# 4. 按特征值排序,取主成分
sorted_idx = np.argsort(eigenvals)[::-1]
eigenvecs = eigenvecs[:, sorted_idx]
principal_components = X_centered @ eigenvecs

# 5. 可视化原始数据与主成分方向
plt.figure(figsize=(8, 6))
plt.scatter(X_centered[:, 0], X_centered[:, 1], alpha=0.6)

# 绘制主成分轴
origin = [0], [0]
for i in range(2):
    plt.quiver(*origin, eigenvecs[0,i]*np.sqrt(eigenvals[i]), 
               eigenvecs[1,i]*np.sqrt(eigenvals[i]), 
               color=['red','blue'][i], scale=5, label=f'PC{i+1}')
plt.axis('equal')
plt.legend()
plt.title('PCA - Principal Components')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()

项目 5:性能对比 —— 循环 vs 向量化 vs Numba

目标

比较三种不同方式实现相同计算任务时的运行效率:原生 Python 循环、NumPy 向量化、Numba JIT 加速。

知识点

  • Python 循环性能瓶颈
  • NumPy 向量化优势
  • Numba 即时编译加速技术
  • 时间测量与性能分析

步骤

import numpy as np
import time
from numba import jit

# 生成测试数据
size = 10000
a = np.random.rand(size)
b = np.random.rand(size)
result = np.zeros(size)

# 方法一:原生 Python 循环
start = time.time()
for i in range(len(a)):
    result[i] = a[i] * b[i] + np.sin(a[i]) + np.cos(b[i])
loop_time = time.time() - start

# 方法二:NumPy 向量化
start = time.time()
result_vec = a * b + np.sin(a) + np.cos(b)
vectorized_time = time.time() - start

# 方法三:Numba JIT 编译
@jit(nopython=True)
def compute_with_numba(a, b, out):
    for i in range(a.shape[0]):
        out[i] = a[i] * b[i] + np.sin(a[i]) + np.cos(b[i])

result_num = np.zeros(size)
start = time.time()
compute_with_numba(a, b, result_num)
numba_time = time.time() - start

# 输出耗时对比
print(f"循环耗时: {loop_time:.4f}s")
print(f"向量化耗时: {vectorized_time:.4f}s")
print(f"Numba 耗时: {numba_time:.4f}s")

学习建议

建议按照项目难度逐步推进,先掌握数组基本操作,再深入理解广播、向量化及性能优化技巧。每个项目完成后可尝试修改参数、扩展功能或结合其他库进一步深化理解。

总结

本章通过五个典型项目展示了 NumPy 在图像处理、金融分析、地理计算、降维算法和性能优化中的强大能力。熟练掌握这些技能将为后续学习机器学习、深度学习和大数据分析打下坚实基础。

# 最大回撤计算
print(f"最大回撤: {max_drawdown:.2%}")

# 3. 绘制价格与回撤曲线
peak = np.maximum.accumulate(price)
drawdown = (price - peak) / peak
fig, ax1 = plt.subplots(figsize=(10, 6))
ax1.plot(price, 'b-', label='Price')
ax1.set_ylabel('Price', color='b')

ax2 = ax1.twinx()
ax2.fill_between(range(len(drawdown)), drawdown, 0, color='r', alpha=0.3, label='Drawdown')
ax2.set_ylabel('Drawdown', color='r')
plt.title('Stock Price & Drawdown')
plt.show()

扩展:多资产投资组合风险分析

引入多只股票的历史价格数据,构建资产收益率序列,并基于协方差矩阵评估整体投资组合的风险水平。该方法利用统计学中的协方差度量不同资产之间的联动性,为现代投资组合理论提供基础支持。

np.lib.stride_tricks.sliding_window_view

项目3:地理距离矩阵计算(广播与向量化)

目标

根据多个城市的经纬度坐标,使用Haversine公式计算任意两城市间的球面距离,结果以千米为单位输出完整距离矩阵。

核心知识点

  • NumPy广播机制
  • 三角函数运算
  • 向量化操作替代传统嵌套循环,提升计算效率

实现步骤

import numpy as np

# 1. 定义城市地理位置(经度, 纬度),单位为十进制度数
cities = np.array([
    [116.4, 39.9],   # 北京
    [121.5, 31.2],   # 上海
    [113.3, 23.1],   # 广州
    [106.5, 29.6]    # 重庆
])

# 转换为弧度制以便进行三角计算
lat = np.radians(cities[:, 1])  # 纬度列
lon = np.radians(cities[:, 0])  # 经度列

# 2. 利用广播机制生成所有城市对的组合
lat1 = lat[:, np.newaxis]  # 形状变为 (4,1),用于行方向扩展
lat2 = lat[np.newaxis, :]  # 形状变为 (1,4),用于列方向扩展
lon1 = lon[:, np.newaxis]
lon2 = lon[np.newaxis, :]

# 应用 Haversine 公式计算球面距离
dlat = lat2 - lat1
dlon = lon2 - lon1
a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a))
distance_km = 6371 * c  # 地球平均半径约为6371公里

输出格式化距离矩阵

city_names = ['Beijing', 'Shanghai', 'Guangzhou', 'Chongqing']
print("Distance Matrix (km):")
print(f"{'':<12}" + "".join(f"{name:<12}" for name in city_names))
for i, name in enumerate(city_names):
    row = "".join(f"{distance_km[i,j]:<12.1f}" for j in range(len(city_names)))
    print(f"{name:<12}{row}")

技术优势

采用向量化和广播技术,避免显式Python循环,实现时间复杂度优化;内存占用接近常数级O(1),相较于传统双重循环O(n)具有显著性能优势,尤其适用于大规模城市网络的距离计算场景。

np.lib.stride_tricks.sliding_window_view

项目4:主成分分析(PCA)从零实现

目标

不依赖scikit-learn等高级库,仅使用NumPy完成主成分分析(PCA)全过程,实现数据降维功能。

涉及关键概念

  • 数据中心化处理
  • 协方差矩阵构建
  • 特征值与特征向量分解
  • 数据在主成分方向上的投影变换

实现流程

import numpy as np
import matplotlib.pyplot as plt

# 1. 构造二维模拟数据集(具备相关性的高斯分布样本)
np.random.seed(0)
X = np.random.randn(100, 2) @ np.array([[2, 1], [1, 1]])  # 通过矩阵乘法引入变量间相关性

# 2. 自定义 PCA 函数
def pca(X, n_components=2):
    # 数据中心化:减去各维度均值
    X_centered = X - X.mean(axis=0)

    # 计算协方差矩阵(注意:np.cov 接受特征在行或列的形式)
    cov = np.cov(X_centered.T)  # T 表示转置,使每列为一个变量

    # 对协方差矩阵进行特征分解
    eigenvals, eigenvecs = np.linalg.eigh(cov)  # eigh 适用于对称正定矩阵,更稳定

    # 按特征值大小降序排列,选取前n个主成分
    idx = np.argsort(eigenvals)[::-1]
    components = eigenvecs[:, idx[:n_components]]

    # 将原始数据投影到新空间
    X_pca = X_centered @ components
    return X_pca, components, eigenvals[idx]
# 3. 可视化处理
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], alpha=0.7)
plt.title('原始数据分布')
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.7, c='red')
plt.axhline(0, color='k', linewidth=0.5)
plt.axvline(0, color='k', linewidth=0.5)
plt.title('PCA变换后数据')
plt.show()

print("解释方差比例:", vals / vals.sum())

time.time()
# 执行主函数获取降维结果 X_pca, comps, vals = pca(X, n_components=2) return X_pca, components, eigenvals[idx] 核心理解: PCA 的本质是将数据通过旋转,映射到方差最大的方向上,从而实现降维与信息保留的平衡。

项目 5:性能对比分析 —— 循环、向量化与 Numba

目标: 比较三种不同方式在计算大规模数组欧氏距离时的执行效率。 涉及知识点: - 程序性能分析方法 - NumPy 向量化的计算优势 - (可选)使用 Numba 的 JIT 编译技术进行加速 实施步骤: import numpy as np import time # 构造测试数据 N = 1000000 a = np.random.rand(N, 3) b = np.random.rand(N, 3) # 方法一:基于 Python 原生循环(效率较低) def euclidean_loop(a, b): dists = [] for i in range(len(a)): d = np.sqrt((a[i,0]-b[i,0])**2 + (a[i,1]-b[i,1])**2 + (a[i,2]-b[i,2])**2) dists.append(d) return np.array(dists) # 方法二:采用 NumPy 向量化操作(高效推荐) def euclidean_vectorized(a, b): return np.sqrt(np.sum((a - b)**2, axis=1)) # 方法三:使用 scipy.spatial.distance(拓展选项) # from scipy.spatial.distance import cdist # dists = np.diag(cdist(a, b)) # 性能测试环节 start = time.time() # dist1 = euclidean_loop(a, b) # 忽略此步,运行耗时过长 # print("循环耗时:", time.time() - start) start = time.time() dist2 = euclidean_vectorized(a, b) print("向量化耗时:", time.time() - start) # 结果一致性验证(可选) # print("最大差异:", np.max(np.abs(dist1 - dist2)))
@numba.jit
典型结果说明: 向量化方法相比传统循环通常能提升 100 至 1000 倍的运算速度,显著体现 NumPy 在数值计算中的性能优势。 扩展尝试: 可引入 Numba 对循环版本进行 JIT 加速,观察其性能是否接近向量化水平。

学习路径建议

以下为推荐的学习项目顺序及其对应掌握的核心技能:
项目 推荐顺序 巩固知识点
图像处理 1 广播机制、数组切片、基础数学运算
金融统计分析 2 随机数生成、统计函数应用、累积操作
地理空间距离计算 3 广播的高级应用场景
主成分分析(PCA) 4 线性代数基础、特征值分解
性能对比实验 5 向量化思维、性能优化意识

总结

上述实践项目全面覆盖了 NumPy 的关键能力,包括但不限于: - 将多维数组作为通用数据容器使用 - 利用向量化表达式替代显式循环以提升效率 - 运用广播机制简化复杂计算逻辑 - 与 Matplotlib 配合实现数据可视化 - 为后续进入机器学习和科学计算领域打下坚实基础

后续发展方向

建议将已掌握的 NumPy 技能进一步迁移至以下库中深化应用: - Pandas:用于结构化数据处理与表格分析 - SciPy:深入高级科学计算与算法实现 - scikit-learn:开展机器学习建模与数据分析 本文围绕 NumPy 展开由浅入深的项目式实践,重点在于动手能力的培养。相关代码示例将持续整理更新,受限于时间安排,进度可能逐步推进,读者亦可自行本地化学习与拓展。

《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》

《深入浅出神经网络与深度学习》(迈克尔·尼尔森,Michael Nielsen)

《自然语言处理综论 第2版》

《Natural-Language-Processing-with-PyTorch》

《计算机视觉:算法与应用(中文版)》

《Learning OpenCV 4》

《AIGC:智能创作时代》——杜雨 & 张孜铭

《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》

《从零构建大语言模型(中文版)》

《实战AI大模型》

《AI 3.0》

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Numpy 数据分析 人工智能 NUM Multivariate

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 17:04