小白零基础学数学建模系列-Day2-数学建模工具介绍与案例实践

文章目录

1. 数学建模工具概述

1.1 数学建模的定义与应用

数学建模是一种通过数学方法描述、分析和解决实际问题的过程。它将现实世界的问题抽象为数学模型,以便使用数学工具进行求解、分析和预测。数学建模广泛应用于工程、物理、经济、金融、生物等多个领域。其核心目标是通过数学手段简化和解决复杂的实际问题,从而得出有效的解决方案。

数学建模不仅是科学研究的重要方法,也是工程设计和决策支持的关键工具。随着计算机技术的发展,数学建模的能力和应用范围得到了极大的扩展和增强。

1.2 常用的数学建模工具简介

在数学建模的过程中,选择合适的工具至关重要。常用的数学建模工具包括MATLAB、R、Excel、Python等。其中,Python由于其易学易用、功能强大、社区支持广泛等优势,逐渐成为数学建模领域的首选工具。

Python不仅可以用于基础的数据处理和分析,还拥有丰富的库和框架,支持从简单的数学计算到复杂的机器学习和深度学习模型构建。Python的开源性质和跨平台特性也使其在科研和工业界得到了广泛的应用。

1.3 为什么选择Python进行数学建模

Python作为一种通用编程语言,具备以下几大优势,使其成为数学建模的理想工具:

  1. 简洁明了的语法:Python的语法简洁且易于学习,使得编写和理解代码更加直观。即使是编程新手,也能快速上手,并专注于模型的构建和问题的解决,而无需过多关注语言本身的复杂性。

  2. 强大的库支持:Python拥有丰富的科学计算库,如Numpy、SciPy、Pandas、Matplotlib、Seaborn、Scikit-learn等。这些库极大地扩展了Python的功能,使其能够轻松应对从数据处理、数值计算到机器学习模型构建的各种需求。

  3. 跨平台性:Python可以在Windows、macOS、Linux等多个操作系统上运行,保证了代码的可移植性。无论是在本地计算机还是在云端服务器,Python都能顺畅工作。

  4. 开源社区与资源丰富:Python拥有庞大的开源社区,提供了大量的学习资源、文档和示例代码。对于数学建模的学习者和从业者来说,Python生态系统中的教程、论坛和代码库可以极大地帮助解决实际问题。

通过本教程,你将学习如何使用Python和相关库进行数学建模,从基础编程到高级模型构建,再到实际案例的操作,全面提升你的数学建模能力。

好的,我将为第二章“Python编程基础”提供更加详尽的内容,涵盖更多的基础知识和编程技巧,以确保读者能够扎实掌握Python编程的基础。以下是第二章的详细扩展内容。


2. Python编程基础

本章旨在为初学者提供Python编程的常见的基础知识。如需完整详细的Python基础教学,推荐本人著作书籍:《Python3编程从零基础到实战》 或者可以看我的基础博客:《python从零到教程》

2.1 Python环境的安装与配置

2.1.1 安装Python

安装Python可以分为以下几个步骤:

  1. 选择Python版本:建议选择Python 3.x版本,这是Python的最新版本,具有更强大的功能和更广泛的支持。

  2. 下载Python:访问Python官网,根据你的操作系统(Windows、macOS、Linux)下载相应的安装包。

  3. 安装Python:运行安装包,安装过程中务必勾选“Add Python to PATH”选项,以确保Python命令可以在命令行中直接运行。

  4. 安装完成后验证:打开命令行工具,输入python --versionpython3 --version,如果显示相应的版本号,说明安装成功。

2.1.2 安装IDE与配置

为了提高编程效率和代码质量,推荐使用以下集成开发环境(IDE):

  • Visual Studio Code:一款轻量级、跨平台的编辑器,支持Python编程,并具有丰富的扩展和插件。
  • PyCharm:一款功能强大的Python专用IDE,提供了代码补全、调试、测试等高级功能。

安装和配置好IDE后,可以开始编写Python代码。

2.1.3 安装Python包管理工具

Python的强大之处在于其庞大的第三方库生态系统。要安装和管理这些库,可以使用pip包管理工具。以下是常见的命令:

  • 安装库pip install package_name
  • 更新库pip install --upgrade package_name
  • 卸载库pip uninstall package_name

你还可以使用pip list查看已安装的所有库及其版本。

2.2 Python基本语法

2.2.1 变量与数据类型

Python是动态类型语言,这意味着变量在使用前不需要显式声明类型。Python常见的数据类型包括:

  • 整数(int):用于表示整数,如a = 10
  • 浮点数(float):用于表示小数,如b = 3.14
  • 字符串(str):用于表示文本,如c = "Hello, World"
  • 布尔值(bool):用于表示真或假,如d = True

此外,Python还提供了其他复杂数据结构,如列表、元组、字典和集合。

列表(List)

fruits = ["apple", "banana", "cherry"]
print(fruits[0])  # 输出 "apple"

元组(Tuple)

coordinates = (10.0, 20.0)
print(coordinates[1])  # 输出 20.0

字典(Dictionary)

student = {"name": "John", "age": 21}
print(student["name"])  # 输出 "John"

集合(Set)

unique_numbers = {1, 2, 3, 4, 4, 5}
print(unique_numbers)  # 输出 {1, 2, 3, 4, 5}
2.2.2 运算符

Python支持多种运算符,包括:

  • 算术运算符+, -, *, /, %, **(幂运算),//(整除)
  • 比较运算符==, !=, >, <, >=, <=
  • 逻辑运算符and, or, not
  • 赋值运算符=, +=, -=, *=, /=, %=, **=, //=

示例

x = 10
y = 3
print(x + y)  # 输出 13
print(x ** y)  # 输出 1000 (10的3次方)
print(x > y and x < 20)  # 输出 True
2.2.3 控制结构

控制结构用于控制程序的执行流程,包括条件语句和循环语句。

条件语句

temperature = 30
if temperature > 25:
    print("It's hot!")
elif temperature == 25:
    print("It's moderate.")
else:
    print("It's cold!")

循环语句

for循环

for i in range(5):
    print(i)
# 输出 0, 1, 2, 3, 4

while循环

n = 5
while n > 0:
    print(n)
    n -= 1
# 输出 5, 4, 3, 2, 1
2.2.4 函数与模块

函数是代码的基本构建单元,模块则是代码组织与重用的工具。

定义函数

def greet(name):
    return "Hello, " + name

print(greet("Alice"))  # 输出 "Hello, Alice"

导入模块

import math

print(math.sqrt(16))  # 输出 4.0

创建自己的模块

可以将函数保存到一个.py文件中,并在其他程序中导入和使用。

# mymodule.py
def add(a, b):
    return a + b
# main.py
import mymodule

print(mymodule.add(3, 4))  # 输出 7

2.3 面向对象编程基础

Python支持面向对象编程(OOP),它是一种通过创建类和对象来组织代码的编程范式。

2.3.1 类与对象

类是对象的蓝图,定义了对象的属性和方法。对象是类的实例。

定义类

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return "Woof!"

my_dog = Dog("Buddy", 3)
print(my_dog.name)  # 输出 "Buddy"
print(my_dog.bark())  # 输出 "Woof!"
2.3.2 继承与多态

继承允许一个类继承另一个类的属性和方法,多态则允许子类在继承父类的同时,可以对父类的方法进行重写。

继承

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        return "Some sound"

class Dog(Animal):
    def speak(self):
        return "Woof!"

my_dog = Dog("Buddy")
print(my_dog.speak())  # 输出 "Woof!"

2.4 常见编程技巧

为了提高Python编程的效率和代码的可读性,以下是一些常见的编程技巧:

  • 列表解析(List Comprehensions):简洁的创建列表的方式。

    squares = [x ** 2 for x in range(10)]
    print(squares)  # 输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
  • 生成器(Generators):使用yield生成一系列值的函数。

    def generate_numbers():
        for i in range(10):
            yield i
    
    for number in generate_numbers():
        print(number)
    
  • 异常处理(Exception Handling):处理运行时错误以防止程序崩溃。

    try:
        result = 10 / 0
    except ZeroDivisionError:
        print("Cannot divide by zero!")
    
  • 上下文管理(Context Managers):使用with语句进行资源管理(如文件操作)。

    with open('file.txt', 'r') as file:
        content = file.read()
    

2.5 实战练习

本章最后,我们将通过几个实战练习来巩固学到的知识:

  1. 练习1:编写一个函数,接受一个整数列表并返回该列表中所有偶数的平方
   def square_even_numbers(numbers):
       return [x ** 2 for x in numbers if x % 2 == 0]
   
   print(square_even_numbers([1, 2, 3, 4, 5]))  # 输出 [4, 16]
  1. 练习2:创建一个Person类,具有姓名和年龄属性,并包含一个方法用于打印个人信息

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def introduce(self):
            print(f"My name is {self.name} and I am {self.age} years old.")
    
    person = Person("Alice", 30)
    person.introduce()  # 输出 "My name is Alice and I am 30 years old."
    
  2. 练习3:使用字典存储学生的成绩,并编写函数计算并返回平均分

    def calculate_average(grades):
        return sum(grades.values()) / len(grades)
    
    student_grades = {"Alice": 85, "Bob": 92, "Charlie": 78}
    print(calculate_average(student_grades))  # 输出 85.0
    

通过这一章的学习,你已经掌握了Python编程的基础知识。接下来,你将学习如何使用Python的各种库进行数学建模和数据分析。

3. 常用Python数学建模库介绍

Python之所以成为数学建模的理想选择,得益于其强大的第三方库生态系统。本章将详细介绍几种常用的Python数学建模库,包括Numpy、SciPy、Pandas、Matplotlib、Seaborn以及Scikit-learn。这些库涵盖了从数据处理、科学计算到机器学习模型构建的各个方面,能够极大地提高数学建模的效率和效果。如需完整详细的Python可视化/数据分析/可视化教学,推荐本人著作书籍:《Python3编程从零基础到实战》

3.1 数值计算与线性代数库:Numpy

Numpy(Numerical Python)是Python中最重要的数值计算库,提供了高效的多维数组对象和丰富的数学函数库。它是科学计算和数据处理的基础,几乎所有其他科学计算库都依赖于Numpy。

3.1.1 Numpy的安装与配置

要安装Numpy,只需在命令行或终端中输入以下命令:

pip install numpy

安装完成后,可以通过以下代码验证安装是否成功:

import numpy as np

print(np.__version__)
3.1.2 Numpy数组的创建与操作

Numpy的核心是ndarray对象,它是一个多维数组,可以用来存储和操作大规模数据。以下是一些常见的数组创建和操作方法:

创建数组:

import numpy as np

# 从列表创建数组
a = np.array([1, 2, 3, 4])
print(a)

# 创建全零数组
b = np.zeros((2, 3))
print(b)

# 创建全一数组
c = np.ones((3, 3))
print(c)

# 创建单位矩阵
d = np.eye(3)
print(d)

# 创建等差数组
e = np.arange(0, 8, 2)  # 结束值调整为8,步长为2,产生[0, 2, 4, 6]
print(e)

# 创建线性等间隔数组
f = np.linspace(0, 1, 5)
print(f)

数组操作:

# 数组加法
g = a + e
print(g)

# 数组乘法
h = a * e
print(h)

# 矩阵乘法
i = np.dot(d, c)
print(i)

# 数组转置
j = i.T
print(j)

# 数组切片
k = a[1:3]
print(k)

# 数组形状改变
l = np.reshape(a, (2, 2))
print(l)
3.1.3 矩阵运算与线性代数

Numpy提供了强大的线性代数功能,支持矩阵运算、特征值分解、奇异值分解等操作。这些功能对数学建模中的线性代数问题非常有用。

矩阵运算:

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 矩阵加法
C = A + B
print(C)

# 矩阵乘法
D = np.dot(A, B)
print(D)

# 矩阵的逆
E = np.linalg.inv(A)
print(E)

# 矩阵的转置
F = A.T
print(F)

# 特征值与特征向量
eigvals, eigvecs = np.linalg.eig(A)
print("特征值:", eigvals)
print("特征向量:", eigvecs)
3.1.4 Numpy在数据处理中的应用

Numpy在数据处理中的应用非常广泛,以下是一个利用Numpy进行简单数据处理的例子:

案例:计算数据集的均值和标准差

假设我们有一个包含学生考试成绩的数据集,我们可以使用Numpy计算这些成绩的均值和标准差:

import numpy as np

# 学生成绩数据
scores = np.array([85, 90, 78, 92, 88, 76, 95, 89, 84, 91])

# 计算均值
mean_score = np.mean(scores)
print("平均成绩:", mean_score)

# 计算标准差
std_deviation = np.std(scores)
print("成绩的标准差:", std_deviation)

通过这些简单的操作,我们可以快速得到数据的统计特征,为后续的分析和建模奠定基础。

3.2 科学计算库:SciPy

SciPy(Scientific Python)是一个基于Numpy的科学计算库,提供了更高级的数学、科学和工程计算功能,包括优化、插值、积分、微分方程求解等。SciPy是解决复杂科学计算问题的强大工具。

3.2.1 SciPy的安装与配置

SciPy可以通过以下命令进行安装:

pip install scipy

安装后,同样可以通过以下代码验证安装:

import scipy
print(scipy.__version__)
3.2.2 常用模块与函数

SciPy包含多个子模块,分别用于不同的科学计算领域。以下是一些常用模块的介绍和示例:

  • scipy.optimize: 用于优化和寻找函数的极值。
  • scipy.integrate: 用于数值积分和解微分方程。
  • scipy.interpolate: 用于数据插值。
  • scipy.fftpack: 用于傅里叶变换。
  • scipy.linalg: 提供线性代数运算。
  • scipy.stats: 提供统计分布和统计函数。
3.2.3 微分方程求解与优化

SciPy可以用来求解复杂的微分方程和进行优化,这在工程和科学计算中非常常见。

案例:求解微分方程

假设我们要求解简单的常微分方程:

d y d t = − 2 y \frac{dy}{dt} = -2y dtdy=2y

我们可以使用SciPy的odeint函数来求解这个方程:

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 定义微分方程
def model(y, t):
    dydt = -2 * y
    return dydt

# 初始条件
y0 = 5

# 时间点
t = np.linspace(0, 5, 100)

# 求解ODE
y = odeint(model, y0, t)

# 绘制结果
plt.plot(t, y)
plt.xlabel('时间 t')
plt.ylabel('y(t)')
plt.title('微分方程解')
plt.show()

运行如下:
在这里插入图片描述

案例:函数优化

SciPy的optimize模块可以用来找到函数的极值。例如,我们可以使用minimize函数找到一个二次函数的最小值:

from scipy.optimize import minimize

# 定义目标函数
def objective(x):
    return x**2 + 5*x + 4

# 初始猜测
x0 = 0

# 最小化目标函数
result = minimize(objective, x0)

# 输出最优解
print("最小值发生在 x =", result.x)

运行如下:

最小值发生在 x = [-2.50000002]
3.2.4 SciPy在工程与科学计算中的应用

SciPy在实际工程和科学计算中应用广泛。以下是一个简单的案例:

案例:使用SciPy进行曲线拟合

假设我们有一组实验数据,需要找到一个与这些数据最匹配的曲线。我们可以使用SciPy的curve_fit函数进行曲线拟合:

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt

# 定义拟合函数
def func(x, a, b, c):
    return a * np.exp(-b * x) + c

# 模拟数据
xdata = np.linspace(0, 4, 50)
ydata = func(xdata, 2.5, 1.3, 0.5) + 0.2 * np.random.normal(size=len(xdata))

# 拟合参数
popt, pcov = curve_fit(func, xdata, ydata)

# 绘制数据和拟合曲线
plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

运行如下:
在这里插入图片描述

通过这些案例,我们可以看到SciPy在处理复杂科学计算问题时的强大功能。

3.3 数据处理与分析库:Pandas

Pandas是Python中最强大的数据处理与分析库之一,尤其适合处理结构化数据。Pandas提供了高效的数据结构和操作工具,使数据的清洗、转换、分析和可视化变得更加简单。

3.3.1 Pandas的安装与配置

可以通过以下命令安装Pandas:

pip install pandas

安装后,使用以下代码验证:

import pandas as pd
print(pd

.__version__)
3.3.2 数据结构:Series与DataFrame

Pandas中有两个核心数据结构:SeriesDataFrame

  • Series: 一种类似于一维数组的结构,带有标签索引。
  • DataFrame: 类似于电子表格或SQL表,是一种二维的、带有行列标签的数据结构。

创建Series和DataFrame:

import pandas as pd

# 创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

# 创建DataFrame
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)

运行如下:
g.csdnimg.cn/direct/14072c10a3604b8083c22c7a57fed3c3.png)

3.3.3 数据读取与清洗

Pandas能够读取多种格式的数据,包括CSV、Excel、SQL等。数据清洗是数据分析中非常重要的一部分,Pandas提供了丰富的工具来处理缺失数据、重复数据和格式问题。

案例:处理缺失数据

import pandas as pd
import numpy as np

# 创建包含缺失值的DataFrame
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [10, 11, 12, 13]
})

# 检查缺失值
# print(df.isnull())

# 填充缺失值
df_filled = df.fillna(value=0)
# print(df_filled)

# 删除含有缺失值的行
df_dropped = df.dropna()
df_dropped

运行如下:
在这里插入图片描述

3.3.4 数据的可视化与统计分析

Pandas与Matplotlib紧密结合,可以轻松进行数据的可视化。以下是一个简单的例子:

案例:使用Pandas绘制时间序列图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建时间序列数据
dates = pd.date_range('20230101', periods=100)
df = pd.DataFrame(np.random.randn(100, 4), index=dates, columns=list('ABCD'))

# 绘制图表
df.plot()
plt.show()

运行如下:
在这里插入图片描述

通过上述内容,你可以看到Pandas在数据处理与分析中的强大功能。无论是数据的读取、清洗、分析,还是最终的可视化展示,Pandas都提供了简洁、高效的解决方案。

3.4 数据可视化库:Matplotlib

Matplotlib是Python最基础的2D绘图库,几乎所有其他可视化库都是在Matplotlib的基础上构建的。它提供了丰富的接口,用于创建各种图表,如折线图、柱状图、散点图、饼图等。

3.4.1 Matplotlib的安装与配置

安装Matplotlib可以使用以下命令:

pip install matplotlib

安装完成后,使用以下代码验证:

import matplotlib.pyplot as plt
print(plt.__version__)
3.4.2 基本绘图

Matplotlib可以非常方便地生成各种基础图表。以下是几个常用的图表示例:

折线图:

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 绘制折线图
plt.plot(x, y)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('正弦波')
plt.show()

运行如下:
在这里插入图片描述

柱状图:

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 数据
categories = ['A', 'B', 'C', 'D']
values = [3, 7, 5, 9]

# 绘制柱状图
plt.bar(categories, values)
plt.xlabel('类别')
plt.ylabel('值')
plt.title('简单柱状图')
plt.show()

运行如下:
在这里插入图片描述

散点图:

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 数据
x = np.random.rand(50)
y = np.random.rand(50)

# 绘制散点图
plt.scatter(x, y)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('随机散点图')
plt.show()

运行如下:
在这里插入图片描述

3.4.3 高级绘图

Matplotlib还支持更多高级绘图功能,如子图、3D绘图、动画等。

案例:创建子图

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 创建子图
fig, axs = plt.subplots(2, 2)

# 数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制子图
axs[0, 0].plot(x, y1, 'r')
axs[0, 0].set_title('正弦波')

axs[0, 1].plot(x, y2, 'g')
axs[0, 1].set_title('余弦波')

axs[1, 0].scatter(x, y1)
axs[1, 0].set_title('正弦波散点图')

axs[1, 1].scatter(x, y2)
axs[1, 1].set_title('余弦波散点图')

# 调整布局
plt.tight_layout()
plt.show()

运行如下:
在这里插入图片描述

3.4.4 自定义图表与样式

Matplotlib允许用户通过多种方式自定义图表样式,如修改颜色、线型、标记等。

案例:自定义图表样式

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 绘制折线图
plt.plot(x, y, color='purple', linestyle='--', linewidth=2, marker='o')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('自定义样式的正弦波')
plt.show()

运行如下:
在这里插入图片描述

通过上述示例,你可以看到Matplotlib在数据可视化方面的灵活性和强大功能,无论是简单图表还是复杂图形,它都能够满足各种需求。

3.5 数据可视化高级库:Seaborn

Seaborn是基于Matplotlib构建的高级数据可视化库,特别适用于统计图形。它使创建复杂的可视化变得更加简单和美观,并且与Pandas和Numpy无缝集成。

3.5.1 Seaborn的安装与配置

Seaborn可以通过以下命令安装:

pip install seaborn

安装后,验证安装:

import seaborn as sns
print(sns.__version__)
3.5.2 Seaborn与Matplotlib的结合

Seaborn可以与Matplotlib结合使用,从而生成更高级的图形。以下是一个简单的例子:

案例:Seaborn与Matplotlib结合绘图

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# seaborn模块支持中文方式
rc = {'font.sans-serif': 'SimHei',
      'axes.unicode_minus': False}

# 数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 使用Seaborn样式
sns.set(style="darkgrid", rc=rc)

# 绘图
plt.plot(x, y)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('Seaborn样式的正弦波')
plt.show()

运行如下:
在这里插入图片描述

3.5.3 高级统计图形

Seaborn提供了多种高级统计图形,如分类图、分布图、关系图等。

案例:绘制分布图

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np


plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 使用Seaborn绘制分布图
data = np.random.normal(size=1000)
sns.histplot(data, kde=True)
plt.title('正态分布图')
plt.show()

运行如下:
在这里插入图片描述

案例:绘制箱线图

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np


plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 数据(加载自带的数据测试)
tips = sns.load_dataset("tips")

# 使用Seaborn绘制箱线图
sns.boxplot(x="day", y="total_bill", data=tips)
plt.title('小费数据的箱线图')
plt.show()

运行如下:
在这里插入图片描述

通过这些高级图形,Seaborn使得数据的统计分析和展示更加直观和易于理解。

3.6 机器学习库:Scikit-learn

Scikit-learn是Python中最常用的机器学习库之一,提供了丰富的机器学习算法和工具,用于分类、回归、聚类、降维、模型选择和预处理等。

3.6.1 Scikit-learn的安装与配置

Scikit-learn可以通过以下命令安装:

pip install scikit-learn

安装后,验证安装:

import sklearn
print(sklearn.__version__)
3.6.2 数据预处理与特征工程

在构建机器学习模型之前,数据预处理和特征工程是非常重要的步骤。Scikit-learn提供了许多工具来帮助你完成这些任务。

案例:数据标准化

from sklearn.preprocessing import StandardScaler
import numpy as np

# 数据
X = np.array([[1, 2, 3], [4, 5, 6

], [7, 8, 9]])

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled

运行如下:
在这里插入图片描述

3.6.3 常用机器学习算法

Scikit-learn提供了许多常用的机器学习算法,包括线性回归、逻辑回归、K近邻、支持向量机、随机森林等。

案例:线性回归模型

from sklearn.linear_model import LinearRegression
import numpy as np

# 模拟数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1.2, 2.3, 3.6, 4.5, 5.1])

# 创建线性回归模型
model = LinearRegression()
model.fit(X, y)

# 预测
y_pred = model.predict(X)
print("预测值:", y_pred)

运行如下:

预测值: [1.34 2.34 3.34 4.34 5.34]
3.6.4 模型评估与优化

在构建机器学习模型后,需要对模型进行评估和优化。Scikit-learn提供了多种方法来评估模型的性能。

案例:交叉验证

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 创建模型
model = LogisticRegression(max_iter=200)

# 进行交叉验证
scores = cross_val_score(model, X, y, cv=5)
print("交叉验证分数:", scores)

运行如下:

交叉验证分数: [0.96666667 1.         0.93333333 0.96666667 1.        ]

通过这些实例,你可以看到Scikit-learn在机器学习建模中的强大功能。从数据预处理到模型构建,再到模型评估与优化,Scikit-learn都提供了全面的工具支持。

4. 综合案例实战

在前几章中,我们详细介绍了Python在数学建模中的常用库及其应用方法。本章将通过具体的综合案例,进一步巩固这些知识,并展示如何将它们应用于实际问题的解决中。通过这些案例,读者将能够更好地理解数学建模的流程,并掌握如何利用Python解决复杂的实际问题。如需更多案例分析,推荐本人著作书籍:《Python3编程从零基础到实战》

4.1 经典案例1:基于Python的线性回归模型构建

线性回归是最基本且应用最广泛的回归分析方法之一。在本案例中,我们将通过一个简单的线性回归模型,演示如何使用Python进行数据分析和模型构建。

4.1.1 问题背景与数据介绍

假设我们有一个包含若干商品价格和销售量的数据集。我们的目标是建立一个线性回归模型,通过商品价格预测销售量。

数据集如下:

价格(元)销量(件)
1.510
2.015
2.518
3.022
3.525
4.028
4.1.2 模型的建立与验证

首先,我们使用Python的Pandas库来读取数据,并使用Matplotlib进行可视化。

数据读取与可视化:

import pandas as pd
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 创建数据集
data = {
    '价格': [1.5, 2.0, 2.5, 3.0, 3.5, 4.0],
    '销量': [10, 15, 18, 22, 25, 28]
}

df = pd.DataFrame(data)

# 绘制散点图
plt.scatter(df['价格'], df['销量'])
plt.xlabel('价格(元)')
plt.ylabel('销量(件)')
plt.title('价格与销量的关系')
plt.show()

运行如下:
在这里插入图片描述

接下来,我们使用Scikit-learn库来构建线性回归模型。

构建线性回归模型:

from sklearn.linear_model import LinearRegression
import numpy as np

# 特征(价格)和目标(销量)
X = df[['价格']]
y = df['销量']

# 创建线性回归模型
model = LinearRegression()
model.fit(X, y)

# 输出模型参数
print("截距(Intercept):", model.intercept_)
print("系数(Coefficient):", model.coef_)

# 进行预测
y_pred = model.predict(X)

# 绘制回归线
plt.scatter(df['价格'], df['销量'], color='blue')
plt.plot(df['价格'], y_pred, color='red', linewidth=2)
plt.xlabel('价格(元)')
plt.ylabel('销量(件)')
plt.title('线性回归模型')
plt.show()

运行如下:
在这里插入图片描述

模型验证:

我们使用模型对数据进行预测,并计算模型的均方误差(MSE)和决定系数(R²)来评估模型的性能。

from sklearn.metrics import mean_squared_error, r2_score

# 计算均方误差
mse = mean_squared_error(y, y_pred)
print("均方误差(MSE):", mse)

# 计算决定系数
r2 = r2_score(y, y_pred)
print("决定系数(R²):", r2)

输出如下:

截距(Intercept): 0.1809523809523803
系数(Coefficient): [7.08571429]
均方误差(MSE): 0.2793650793650793
决定系数(R²): 0.9924268502581756
4.1.3 结果分析与应用

在本案例中,我们通过Python的Scikit-learn库成功建立了一个线性回归模型,用于预测商品价格与销量之间的关系。以下是模型的主要输出结果及其分析:

  1. 模型参数:

    • 截距(Intercept): 0.1809523809523803
    • 系数(Coefficient): 7.08571429

    截距和系数是线性回归模型的两个关键参数。模型的回归方程可以写为:
    销量 = 0.18 + 7.09 × 价格 \text{销量} = 0.18 + 7.09 \times \text{价格} 销量=0.18+7.09×价格
    这意味着,对于每增加1元的价格,预计销量将增加约7.09件。

  2. 模型拟合优度:

    • 均方误差(MSE):*0.2793650793650793
    • 决定系数(R²): 0.9924268502581756
    • 均方误差(MSE)用于衡量模型预测值与实际值之间的平均误差。该模型的MSE为0.279,表明模型预测的销量与实际销量之间的误差较小,模型具有较高的准确性。
    • 决定系数(R²)表示模型解释变量的变异程度,取值范围为0到1。模型的R²值为0.992,接近1,表明价格能够很好地解释销量的变异性,模型对数据的拟合非常好。
  3. 可视化结果:

    • 第一张图展示了价格与销量之间的关系,通过散点图可以直观地看到两者之间呈现出明显的线性关系。
    • 第二张图展示了模型的回归线,红色的回归线很好地拟合了数据点,进一步验证了价格与销量之间的线性关系。

综上所述,本案例中的线性回归模型成功地展示了价格与销量之间的正相关性,模型具有很高的预测精度。这一结果在实际应用中具有重要意义,例如,零售商可以利用该模型根据价格预测销量,从而优化定价策略,最大化销售收益。

4.2 经典案例2:使用SciPy优化函数求解实际问题

优化问题在数学建模中非常常见,例如最小化成本、最大化收益等。本案例将演示如何使用SciPy库来求解一个实际的优化问题。

4.2.1 问题背景与理论分析

假设我们经营一家快餐店,销售两种产品:汉堡和薯条。我们的目标是通过调整生产的数量来最大化利润。已知每生产一个汉堡的利润为5元,每生产一份薯条的利润为3元。但生产汉堡和薯条都需要原材料,每生产一个汉堡需要1.5单位的面包和2单位的肉,每生产一份薯条需要1单位的土豆和0.5单位的油。我们有固定数量的原材料供应:面包100单位,肉150单位,土豆120单位,油60单位。

我们可以将这个问题转化为一个线性规划问题,目标函数为:

最大化  P = 5 x + 3 y \text{最大化 } P = 5x + 3y 最大化 P=5x+3y

约束条件为:

1.5 x + y ≤ 100 1.5x + y \leq 100 1.5x+y100
2 x + 0.5 y ≤ 150 2x + 0.5y \leq 150 2x+0.5y150
x ≥ 0 , y ≥ 0 x \geq 0, y \geq 0 x0,y0

其中,(x) 是生产的汉堡数量,(y) 是生产的薯条数量。

4.2.2 模型的构建与优化

我们使用SciPy库中的linprog函数来求解这个线性规划问题。

构建与求解优化问题:

from scipy.optimize import linprog

# 定义目标函数系数(负号用于最大化问题)
c = [-5, -3]

# 定义不等式约束系数和右侧常数
A = [[1.5, 1], [2, 0.5]]
b = [100, 150]

# 求解线性规划问题
result = linprog(c, A_ub=A, b_ub=b, bounds=(0, None), method='simplex')

# 输出结果
print("最优解:", result.x)
print("最大利润:", -result.fun)

运行如下:

最优解: [66.66666667  0.        ]
最大利润: 333.33333333333337
4.2.3 结果讨论与拓展

求解结果显示,在给定的原材料限制下,最佳生产方案是生产一定数量的汉堡和薯条,以最大化利润。这个结果可以为实际的生产计划提供指导意见。

然而,这个模型是假设市场需求是无限的,在实际情况中,还可能需要考虑市场需求的限制,以及其他可能的约束条件,如生产时间、劳动力等。因此,模型可以根据实际情况进一步拓展和复杂化。

这个案例展示了如何将实际问题转化为数学模型,并使用SciPy进行优化求解。这样的优化技术在生产规划、资源分配、投资组合等许多领域都有广泛应用。

4.3 经典案例3:使用Pandas与Matplotlib进行数据分析与可视化

数据分析是数学建模的基础之一,良好的数据可视化可以帮助我们更直观地理解数据。本案例将展示如何使用Pandas和Matplotlib进行数据的分析与可视化。

4.3.1 数据收集与清洗

假设我们有一个电子商务平台的销售数据集,包含每个订单的日期、商品类别、销售额等信息。我们将使用这些数据来分析各类商品的销售趋势,并找到最畅销的商品类别。

sales_data.csv数据参考如下(自行调整补充数据):

订单ID,订单日期,客户ID,商品类别,商品名称,数量,销售额
1001,2023-01-01,C001,电子产品,智能手机,2,3000
1002,2023-01-02,C002,家居用品,真空吸尘器,1,1500
1003,2023-01-03,C003,服装,牛仔裤,3,450
1004,2023-01-04,C001,电子产品,平板电脑,1,2500
1005,2023-01-05,C004,运动器材,瑜伽垫,4,800
1006,2023-01-06,C005,服装,运动鞋,2,600
1007,2023-01-07,C002,家居用品,咖啡机,1,1200
1008,2023-01-08,C006,电子产品,耳机,5,1000
1009,2023-01-09,C007,家居用品,微波炉,1,900
1010,2023-01-10,C001,服装,夹克,2,700

如下:
在这里插入图片描述

首先,我们需要读取数据,并进行必要的数据清洗。本案例使用Jupyter软件。

数据读取与清洗:

import pandas as pd

# 读取数据集
df = pd.read_csv('sales_data.csv')

# 查看数据集前几行
print(df.head())

# 处理缺失数据
df = df.dropna()

# 转换日期格式
df['订单日期'] = pd.to_datetime(df['订单日期'])

# 提取年份和月份
df['年份'] = df['订单日期'].dt.year
df['月份'] = df['订单日期'].dt.month

如下:
d91f7db0d04d928c33b9e6c1abcba8.png)

4.3.2 数据的分析与图表展示

接下来,我们使用Pandas和Matplotlib分析数据,并展示销售趋势。

按商品类别统计销售额:

# 按商品类别统计销售额
category_sales = df.groupby('商品类别')['销售额'].sum().sort_values(ascending=False)
print(category_sales)

# 绘制柱状图
category_sales.plot(kind='bar')
plt.xlabel('商品类别')
plt.ylabel('销售额(元)')
plt.title('按商品类别统计销售额')
plt.show()

运行如下:
在这里插入图片描述

按月份统计销售趋势:

# 按月份统计销售额
monthly_sales = df.groupby(['年份', '月份'])['销售额'].sum().unstack()
print(monthly_sales)

# 绘制折线图


monthly_sales.plot(kind='line')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.title('每年按月份统计销售趋势')
plt.show()
4.3.3 结论与建议

通过数据分析,我们可以发现哪些商品类别最畅销,以及不同月份的销售趋势。这些信息可以帮助电子商务平台更好地制定销售策略,例如在销售高峰期提前备货,或者针对特定商品类别进行促销活动。

这个案例展示了如何使用Pandas和Matplotlib进行数据的分析和可视化。通过这些技术,我们可以从数据中提取出有价值的信息,为商业决策提供依据。

4.4 总结

在本章中,我们通过三个经典案例,展示了如何将前几章介绍的数学建模工具应用于实际问题的解决中。每个案例都展示了不同的数学建模方法和技巧,涵盖了数据分析、优化求解和回归分析等常见的建模任务。

通过这些案例的学习,你应该对如何将Python应用于数学建模有了更深入的理解。接下来,我们将总结本教程的内容,并讨论未来的学习和研究方向。

5. 总结与更多资源

在本教程的前几章中,我们系统地介绍了如何使用Python及其相关库进行数学建模,并通过几个经典案例展示了如何将这些工具应用于实际问题的解决中。

推荐本人著作书籍:《Python3编程从零基础到实战》
推荐使用本人搭建的ChatGPT辅助数模:ChatGPT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

川川菜鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值