news 2026/1/9 9:16:12

人工智能之数据分析 numpy:第十五章 项目实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
人工智能之数据分析 numpy:第十五章 项目实践

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

目标

用纯 NumPy 实现彩色图像转灰度图,并进行简单边缘检测(Sobel 算子)。

知识点

数组切片与广播

卷积(手动实现)

图像作为 3D 数组(H×W×C)

步骤

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:股票收益率分析(统计与金融)

目标

模拟股票价格,计算日收益率、波动率、最大回撤等指标。

知识点

随机游走模拟

百分比变化 np.diff / np.log

统计函数(std, max, argmin)

布尔索引

步骤

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%}")

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()

✅ 扩展:加入多只股票,计算协方差矩阵和投资组合风险。

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

目标

给定多个城市的经纬度,计算所有城市对之间的球面距离(Haversine 公式)。

知识点

广播机制

三角函数

向量化替代嵌套循环

步骤

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 km

# 3. 输出距离矩阵

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}")

✅ 优势:无循环,O(1) 内存扩展(相比 O(n²) 循环)

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

目标

不用 sklearn,仅用 NumPy 实现 PCA,用于降维。

知识点

中心化

协方差矩阵

特征值分解

投影

步骤

import numpy as np

import matplotlib.pyplot as plt

# 1. 生成模拟数据(2D)

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)

# 协方差矩阵

cov = np.cov(X_centered.T) # 注意:np.cov 默认按行是变量

# 特征分解

eigenvals, eigenvecs = np.linalg.eigh(cov) # 对称矩阵用 eigh 更稳定

# 按特征值降序排序

idx = np.argsort(eigenvals)[::-1]

components = eigenvecs[:, idx[:n_components]]

# 投影

X_pca = X_centered @ components

return X_pca, components, eigenvals[idx]

X_pca, comps, vals = pca(X, n_components=2)

# 3. 可视化

plt.figure(figsize=(8, 4))

plt.subplot(1, 2, 1)

plt.scatter(X[:, 0], X[:, 1], alpha=0.7)

plt.title('Original Data')

plt.subplot(1, 2, 2)

plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.7, c='red')

plt.title('PCA Transformed')

plt.axhline(0, color='k', linewidth=0.5)

plt.axvline(0, color='k', linewidth=0.5)

plt.show()

print("Explained variance ratio:", vals / vals.sum())

✅ 理解核心:PCA = 数据旋转到方差最大方向。

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

目标

对比三种方式计算两个大数组的欧氏距离效率。

知识点

性能分析(time.time())

向量化优势

可选:Numba JIT 加速

步骤

import numpy as np

import time

# 数据

N = 1000000

a = np.random.rand(N, 3)

b = np.random.rand(N, 3)

# 方法1: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)

# 方法2:NumPy 向量化(快)

def euclidean_vectorized(a, b):

return np.sqrt(np.sum((a - b)**2, axis=1))

# 方法3:使用 scipy.spatial.distance(可选)

# from scipy.spatial.distance import cdist

# dists = np.diag(cdist(a, b))

# 测试

start = time.time()

# dist1 = euclidean_loop(a, b) # 跳过,太慢!

# print("Loop time:", time.time() - start)

start = time.time()

dist2 = euclidean_vectorized(a, b)

print("Vectorized time:", time.time() - start)

# 验证结果一致

# print("Max diff:", np.max(np.abs(dist1 - dist2)))

💡 典型结果:向量化比循环快 100~1000 倍!

✅ 扩展:尝试用 @numba.jit 加速循环版本,看能否接近向量化性能。

📚 学习建议

项目 推荐顺序 巩固知识点

1. 图像处理 1 广播、切片、基础数学

2. 金融统计 2 随机数、统计函数、累积操作

3. 地理距离 3 广播高级应用

4. PCA 4 线性代数、特征分解

5. 性能对比 5 向量化思想、性能意识

🔚 总结

这些项目覆盖了 NumPy 的核心能力:

数组作为通用容器

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/2 18:19:30

SQL约束解析

约束分类:NOT NULL 非空约束:字段必须有值UNIQUE 唯一约束:值不能重复&#xff0c;但允许多个 NULLPRINARY KEY 主键约束:既是 NOT NULL 又是 UNIQUEDEFAULT 默认约束: 保存数据时.如果未指定该字段的值,则采用默认值CHECK 检查约束:保证字段满足某一个值FOREIGN KEY 外键约束…

作者头像 李华
网站建设 2026/1/4 10:11:47

地铁调研12-17

今天地铁调研主要内容包括&#xff1a;1.跟随工人使用道尺进行巡检。主要测量内容&#xff1a;轨道内距&#xff0c;轨道水平情况。记录&#xff1a;/-x&#xff0c;毫米。2.涂油板&#xff08;道岔变轨部分&#xff09;的油是否还有。3.扣配件的螺栓是否松动扣配件的情况&…

作者头像 李华
网站建设 2026/1/2 18:17:14

现代软件测试工具全景对比与选型指南

随着敏捷开发与DevOps实践的普及&#xff0c;软件测试工具生态呈现百花齐放态势。截至2025年末&#xff0c;测试工具已从简单的BUG记录工具发展为覆盖自动化测试、性能监控、安全检测的完整解决方案。本文将通过功能性对比、适用场景分析及成本效益评估三个维度&#xff0c;为测…

作者头像 李华
网站建设 2026/1/2 13:17:32

基于 Apache POI 的体检报告 Word 生成实战文档

基于 Apache POI 的体检报告 Word 生成实战文档一 项目目标与总体设计 目标&#xff1a;基于模板快速生成排版规范的体检报告&#xff0c;支持文本替换、动态表格、图片插入&#xff0c;并可一键导出 PDF 用于归档与打印。技术选型&#xff1a; Apache POI XWPF&#xff1a;操作…

作者头像 李华
网站建设 2026/1/2 16:13:39

org.jetbrains.annotations的@Nullable 学习

Nullable 是 JetBrains 提供的一套用于 Java 静态分析的注解&#xff08;annotations&#xff09;之一&#xff0c;属于 org.jetbrains.annotations 包。它主要用于标注一个变量、参数、方法返回值等可能为 null&#xff0c;从而帮助 IDE&#xff08;如 IntelliJ IDEA&#xff…

作者头像 李华
网站建设 2026/1/5 14:56:38

计算机毕业设计springboot计算机硬件自配系统 基于Spring Boot的计算机硬件配置管理系统设计与实现 Spring Boot架构下的计算机硬件自选系统开发

计算机毕业设计springboot计算机硬件自配系统839019 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;计算机硬件市场的复杂性和多样性不断增加…

作者头像 李华