NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

13.3 机器学习基础实战

NumPy机器学习实战教程:线性回归、特征处理与房价预测/鸢尾花分类

NumPy 中文教程

本教程详细讲解如何使用NumPy库实现机器学习基础实战,包括线性回归模型的最小二乘法实现、特征矩阵处理与维度压缩技术,并通过房价预测和鸢尾花分类的实战示例,帮助新手快速掌握NumPy在机器学习中的应用。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy机器学习实战教程

1. 引言

NumPy是Python中用于科学计算的核心库,特别适用于处理多维数组和矩阵操作。在机器学习中,NumPy常用于数据预处理、模型实现和计算优化。本教程将逐步引导您使用NumPy实现机器学习基础任务,适合初学者学习。

2. 机器学习基础实战

在开始高级模型前,我们先熟悉NumPy的基本操作。NumPy提供了高效的数据结构(如ndarray)和数学函数,适用于机器学习数据流。

2.1 数据加载与预处理

使用NumPy可以轻松加载和处理数据。例如,假设我们有一个CSV文件,可以使用numpy.loadtxt或结合Pandas加载数据。

import numpy as np

# 加载数据示例
# 假设data.csv包含特征矩阵
# 使用loadtxt加载
# data = np.loadtxt('data.csv', delimiter=',')
# 为了演示,创建一个示例数据集
X = np.array([[1, 2], [2, 3], [3, 4]])  # 特征矩阵
Y = np.array([2, 3, 4])  # 目标值(如房价)
print("特征矩阵 X:")
print(X)
print("目标值 Y:")
print(Y)

2.2 基本数学操作

NumPy支持向量化操作,可加速计算。例如,计算均值、标准差或矩阵乘法。

# 计算均值和标准差
mean_X = np.mean(X, axis=0)
std_X = np.std(X, axis=0)
print("特征均值:", mean_X)
print("特征标准差:", std_X)

# 标准化特征(可选预处理步骤)
X_standardized = (X - mean_X) / std_X
print("标准化后特征:")
print(X_standardized)

3. 线性回归模型实现(最小二乘法)

线性回归是机器学习中的基础模型,最小二乘法是一种经典求解方法。我们将用NumPy实现。

3.1 线性回归理论

线性回归假设目标变量Y与特征X之间存在线性关系:Y = Xβ + ε,其中β是系数向量。最小二乘法通过最小化残差平方和来估计β。

3.2 最小二乘法数学

公式:β = (X^T X)^{-1} X^T Y,其中X是特征矩阵(包含截距项),Y是目标向量。

3.3 NumPy实现代码

我们将实现一个简单的线性回归模型。

# 添加截距项到X
X_with_intercept = np.c_[np.ones(X.shape[0]), X]  # 添加一列全1作为截距
print("带截距的特征矩阵:")
print(X_with_intercept)

# 计算系数β使用最小二乘法
beta = np.linalg.inv(X_with_intercept.T @ X_with_intercept) @ X_with_intercept.T @ Y
print("系数β:", beta)

# 预测函数
def predict(X_new):
    X_new_with_intercept = np.c_[np.ones(X_new.shape[0]), X_new]
    return X_new_with_intercept @ beta

# 测试预测
new_X = np.array([[4, 5]])
predicted_Y = predict(new_X)
print("预测值:", predicted_Y)

4. 特征矩阵处理与维度压缩

在机器学习中,特征处理很重要,维度压缩可以减少计算复杂度和过拟合风险。

4.1 特征矩阵操作

使用NumPy进行特征缩放、归一化等。

# 特征缩放示例:最小-最大缩放
min_val = X.min(axis=0)
max_val = X.max(axis=0)
X_scaled = (X - min_val) / (max_val - min_val)
print("缩放后特征:")
print(X_scaled)

4.2 维度压缩技术(主成分分析PCA)

PCA是一种常见的降维方法。我们可以用NumPy实现简单PCA。

# 使用NumPy实现PCA示例
# 假设X是标准化后的特征矩阵
X_centered = X_standardized - np.mean(X_standardized, axis=0)  # 中心化(已标准化,但可选)
cov_matrix = np.cov(X_centered, rowvar=False)  # 计算协方差矩阵
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)  # 特征分解

# 选择主成分(例如前k个最大特征值对应特征向量)
k = 1  # 假设降到1维
idx = eigenvalues.argsort()[::-1]  # 降序排列索引
eigenvectors_sorted = eigenvectors[:, idx]
X_pca = X_centered @ eigenvectors_sorted[:, :k]
print("PCA降维后特征(前1个主成分):")
print(X_pca)

5. 实战:房价预测

我们将使用一个简单数据集演示房价预测(回归问题)。

5.1 数据集介绍

假设数据包含特征如房屋面积、卧室数量,目标为房价。使用模拟数据。

# 模拟房价数据
np.random.seed(42)  # 确保可重复性
n_samples = 100
features = np.random.randn(n_samples, 2)  # 两个特征
# 生成目标值:线性关系加噪声
true_beta = np.array([2, 3, 1])  # 截距和两个特征系数
X_house = np.c_[np.ones(n_samples), features]
Y_house = X_house @ true_beta + np.random.randn(n_samples) * 0.5  # 添加噪声
print("房价数据形状:")
print("X:", X_house.shape, "Y:", Y_house.shape)

5.2 模型实现与评估

应用线性回归模型。

# 使用最小二乘法训练模型
beta_house = np.linalg.inv(X_house.T @ X_house) @ X_house.T @ Y_house
print("学习到的系数:", beta_house)

# 预测和评估
predictions = X_house @ beta_house
mse = np.mean((Y_house - predictions) ** 2)
print("均方误差 (MSE):", mse)

6. 实战:鸢尾花分类

鸢尾花数据集是经典分类问题,我们将实现一个简化版本使用线性判别分析或类似方法,但重点在NumPy操作。

6.1 数据集介绍

使用NumPy加载内置数据集或模拟。这里用模拟数据。

# 模拟鸢尾花数据(3类,4个特征)
n_samples = 150
n_features = 4
n_classes = 3
X_iris = np.random.randn(n_samples, n_features)  # 随机特征
Y_iris = np.random.randint(0, n_classes, n_samples)  # 随机标签(0,1,2)
print("鸢尾花数据形状:")
print("X:", X_iris.shape, "Y:", Y_iris.shape)

6.2 分类模型实现

使用简单线性分类器,如逻辑回归的简化版本(这里用线性回归作为基础)。实际上,分类常用其他方法,但为演示NumPy,我们使用线性回归的扩展。

# 对于分类,将标签转换为one-hot编码
from sklearn.preprocessing import LabelBinarizer  # 为了简便,使用sklearn的one-hot编码
# 或者用NumPy实现
lb = LabelBinarizer()
Y_iris_onehot = lb.fit_transform(Y_iris)  # 转换为one-hot
# 用线性回归作为多分类基线(不是最优,但演示用)
X_iris_with_intercept = np.c_[np.ones(n_samples), X_iris]
beta_iris = np.linalg.inv(X_iris_with_intercept.T @ X_iris_with_intercept) @ X_iris_with_intercept.T @ Y_iris_onehot
print("分类系数形状:", beta_iris.shape)

# 预测(选择最大概率类)
predictions_onehot = X_iris_with_intercept @ beta_iris
predicted_classes = np.argmax(predictions_onehot, axis=1)
accuracy = np.mean(predicted_classes == Y_iris)
print("分类准确率:", accuracy)

7. 总结

本教程覆盖了NumPy在机器学习中的关键应用:从基础数据操作到线性回归模型实现、特征处理,并通过实战例子巩固理解。NumPy的高效数组操作是机器学习的基础,建议练习更多项目来提升技能。希望这个教程对您的学习有所帮助!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包