【机器学习-07】机器学习科学计算库SciPy学习指南:科学计算库功能实战与可视化分析

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持:💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,点赞加收藏支持我,点击关注,一起进步!


目录

前言       

正文

01-SciPy简介     

02-SciPy数值积分和微分方程求解功能 

03-SciPy优化算法

04-SciPy插值功能 

 05-SciPy信号处理功能 

06-SciPy矩阵运算功能 

07-SciPy统计分析功能 

总结       


前言       

        在Python中,SciPy是一个用于科学计算和技术计算的开源库。它建立在NumPy的基础之上,提供了许多高级的数学、科学和工程计算功能,包括数值积分、优化、插值、信号处理、线性代数、统计分析等。

        官方网站:科学派 - (scipy.org)icon-default.png?t=N7T8https://scipy.org/

正文

01-SciPy简介     

        SciPy 是一个基于 Python 的开源科学计算库,它构建在 NumPy 的基础之上,提供了大量高效的数学算法和函数,用于解决科学和工程领域中各种复杂的数值计算问题。SciPy 是 Scientific Python 的缩写,旨在为科学家、工程师、研究人员和数据分析师提供强大的工具,帮助他们进行高级的科学计算、数据分析以及可视化。

        以下是 SciPy 的一些主要特点和功能:

      (1)数值积分和微分方程求解:

        数值积分:数值积分是对函数在给定区间内的积分值进行近似计算的方法。SciPy 提供了多种数值积分的函数,如 quad() 用于计算定积分、dblquad() 用于计算二重积分、tplquad() 用于计算三重积分等。这些函数可被广泛应用于工程、物理、金融等领域的数值计算中。

        微分方程求解:微分方程描述了系统中不同变量之间的关系,求解微分方程是科学与工程领域中的一个重要问题。SciPy 中的 odeint() 和 solve_ivp() 等函数能够用于求解常微分方程和偏微分方程,这对于模拟物理系统、生物系统和其他动态系统非常重要。

      (2)优化算法:

        数学优化:优化算法用于寻找函数在给定约束条件下的最优解,如最小化或最大化函数。SciPy 提供了多种优化算法,包括梯度下降、共轭梯度法、拟牛顿法等。这些算法可用于解决机器学习中的参数优化、数据拟合以及工程设计中的最优化问题。

      (3)插值:

        数据插值:插值是指通过已知点之间的函数值,估计其他值的过程。SciPy 提供了多种插值方法,如线性插值、样条插值、多项式插值等。这些方法可用于处理实验数据、图像处理以及信号处理中的数据平滑与重构等任务。

      (4)信号处理:

        数字信号处理:信号处理在科学与工程领域中扮演着重要角色,如音频处理、图像处理、通信系统等。SciPy 提供了的信号处理模块包括各种滤波器设计、信号傅里叶变换、频谱分析等功能。这些工具可用于处理时域信号和频域信号,具有广泛的应用。

      (5)线性代数:

        矩阵运算:线性代数是科学与工程领域的基础,矩阵运算常用于解决线性方程组、特征值分解、奇异值分解等问题。SciPy 提供了多种线性代数函数,如求解线性方程组、计算特征值等。这对于数据分析、图像处理等领域有着重要意义。

      (6)统计分析:

        数据统计:统计分析是数据科学中的基础,用于描述数据、检验假设、拟合分布等。SciPy 提供了众多统计函数,如描述统计、假设检验、拟合分布等。这些函数可用于数据分析、决策分析、统计模型的构建等。 

02-SciPy数值积分和微分方程求解功能 

        当使用 SciPy 提供的数值积分和微分方程求解功能时,通常会涉及到以下步骤:

        a、定义被积函数或微分方程。

        b、调用 SciPy 提供的数值积分或微分方程求解函数。

        c、可选地,对结果进行可视化以便分析。

        以一个简单的例子来说明,假设要计算函数 ( f(x) = x^2 ) 在区间 ([0, 1]) 上的定积分,并解一个简单的一阶常微分方程 ( \frac{dy}{dx} = -2y )。代码如下:

        这段代码首先导入了NumPy、SciPy的积分和微分方程求解模块,以及Matplotlib用于绘图。然后定义了两个函数:integrand(x)用于计算被积函数𝑥2x2,dy_dx(y, x)用于表示微分方程𝑑𝑦/𝑑𝑥=−2𝑦dy/dx=−2y。

        接下来,使用quad函数计算了被积函数在区间[0, 1]上的定积分,结果存储在integral_result变量中。

        然后,通过odeint函数求解了微分方程𝑑𝑦/𝑑𝑥=−2𝑦dy/dx=−2y,并将解存储在y_values中。在这个例子中,初始条件为𝑦(0)=1y(0)=1,解的范围是从0到5。

        最后,通过Matplotlib将定积分结果和微分方程的解进行可视化。定积分结果直接打印出来,而微分方程的解被绘制成曲线图,横坐标是𝑥x,纵坐标是𝑦y,并使用了标题和图例来标识图形内容。

import numpy as np
from scipy.integrate import quad, odeint
import matplotlib.pyplot as plt

def integrand(x):
    return x**2

def dy_dx(y, x):
    return -2 * y

# 计算定积分
integral_result, integral_error = quad(integrand, 0, 1)

# 求解微分方程
x_values = np.linspace(0, 5, 100)
initial_condition = 1  # 初值条件 y(0) = 1
y_values = odeint(dy_dx, initial_condition, x_values)

# 可视化定积分结果
print("定积分结果:", integral_result)

# 可视化微分方程的解
plt.figure(figsize=(8, 6))
plt.plot(x_values, y_values, color = 'r',label='Solution to dy/dx = -2y')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Solution to dy/dx = -2y')
plt.legend()
plt.grid(True)
plt.savefig("../4.png", dpi=500)
plt.show()

        示例运行结果如下图所示:

03-SciPy优化算法

        在SciPy中,优化算法是经常被使用的功能之一,它们用于解决最小化或最大化函数的问题。SciPy提供了多种优化算法,其中最常见的包括梯度下降、拟牛顿法等。以一个简单的示例来说明如何使用SciPy中的优化算法来最小化一个函数,并对其进行详细解释和可视化。

        下面给出一个具体的案例,分析应用过程:

        首先,我们需要导入必要的库和模块:

        接下来,我们定义一个函数,这个函数是我们要最小化的目标函数。在这个示例中,我们选择一个简单的二次函数:

        然后,我们选择一个初始点作为优化算法的起始点:

        接下来,我们使用SciPy中的minimize函数来最小化我们定义的目标函数。我们需要传递目标函数和初始猜测给minimize函数:

   minimize函数将返回一个优化结果对象,其中包含最小化函数的最优解以及其他相关信息。我们可以从结果对象中提取出最优解:

         最后,我们将结果可视化,绘制目标函数的曲线以及最优解点:

import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
def objective_function(x):
    return (x - 2) ** 2 + 3
initial_guess = 0

result = minimize(objective_function, initial_guess)

optimal_solution = result.x

x_values = np.linspace(-1, 5, 100)
y_values = objective_function(x_values)

plt.plot(x_values, y_values, color='red',label='目标函数')
plt.scatter(optimal_solution, objective_function(optimal_solution), color='blue', label='最佳解决方案')
plt.xlabel('x')
plt.ylabel('目标函数值')
plt.title('使用 SciPy 进行优化')
plt.legend()
plt.grid(True)
plt.savefig("../4.png", dpi=500)
plt.show()

        示例运行结果如下图所示:

04-SciPy插值功能 

        当涉及到处理数据时,插值是一种常见的技术,用于在已知数据点之间估计未知数据点的值。SciPy提供了多种插值方法,例如线性插值、样条插值等,这些方法在科学计算和数据分析中非常有用。下面通过一个示例来演示如何使用SciPy的插值功能,并对其进行详细解释和可视化。

        首先,需要导入必要的库和模块:

        接下来,定义一些已知的数据点,以便进行插值。在这个示例中,使用一些简单的正弦函数数据:

        然后,选择一个插值方法,并将已知数据点传递给相应的插值函数。这里,选择线性插值方法:

        现在,可以定义一些新的数据点,用于进行插值。在这个示例中,选择在已知数据点之间均匀分布的一些新的𝑥x值:

        接下来,使用插值函数来估计新的𝑦y值:

        最后,将结果可视化,将已知数据点和插值结果一起绘制在图上:

        这段代码的核心部分是interp1d函数,它使用了SciPy中的插值方法来创建一个插值函数对象。然后,我们使用这个插值函数对象来估计新的数据点的值。最后,我们将已知数据点和插值结果一起绘制在图上,以便直观地展示插值的效果。

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

x_known = np.linspace(0, 10, 10)
y_known = np.sin(x_known)

interpolator = interp1d(x_known, y_known, kind='linear')

x_new = np.linspace(0, 10, 100)

y_new = interpolator(x_new)

plt.scatter(x_known, y_known, color='blue', label='已知数据点')
plt.plot(x_new, y_new, color='red', label='插值数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('使用 SciPy 进行插值')
plt.legend()
plt.grid(True)
plt.savefig("../4.png", dpi=500)
plt.show()

        示例运行结果如下图所示:

 05-SciPy信号处理功能 

        信号处理是科学和工程领域中的一个重要分支,涉及到对信号进行分析、处理和提取信息的技术。SciPy提供了丰富的信号处理功能,包括滤波、频谱分析、傅里叶变换等。下面通过一个示例来演示如何使用SciPy的信号处理功能,并对其进行详细解释和可视化。

        首先,需要导入必要的库和模块:

        接下来,定义一个简单的示例信号。在这个示例中,生成一个包含正弦信号和高斯噪声的合成信号:

        然后,可以使用SciPy提供的信号处理函数来对信号进行滤波。在这个示例中,选择使用一个低通滤波器来平滑信号:

        现在,可以将原始信号和滤波后的信号进行可视化,以直观地比较它们的差异:

        这段代码的核心部分是signal.butter函数和signal.filtfilt函数。signal.butter函数用于设计一个巴特沃斯滤波器,而signal.filtfilt函数用于对信号进行滤波处理。通过这些函数,我们可以实现对信号的滤波操作。

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
# 生成时间序列
t = np.linspace(0, 1, 1000, endpoint=False)

# 生成正弦信号和高斯噪声
signal_with_noise = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.normal(size=len(t))

# 设计一个低通滤波器
b, a = signal.butter(4, 0.1, 'low')

# 对信号进行滤波
smooth_signal = signal.filtfilt(b, a, signal_with_noise)

plt.figure(figsize=(10, 6))

# 原始信号
plt.subplot(2, 1, 1)
plt.plot(t, signal_with_noise,color='blue', label='带噪声的原始信号')
plt.xlabel('时间')
plt.ylabel('波幅')
plt.title('带噪声的原始信号')
plt.legend()

# 滤波后的信号
plt.subplot(2, 1, 2)
plt.plot(t, smooth_signal,color='blue', label='平滑信号')
plt.xlabel('时间')
plt.ylabel('波幅')
plt.title('平滑信号')
plt.legend()

plt.tight_layout()
plt.savefig("../4.png", dpi=500)
plt.show()

        示例运行结果如下图所示: 

06-SciPy矩阵运算功能 

        在SciPy中,矩阵运算功能非常强大,可以用于解决各种线性代数和矩阵计算问题。这包括矩阵的乘法、求逆、特征值分解、奇异值分解等。下面通过一个示例来演示如何使用SciPy的矩阵运算功能,并对其进行详细解释和可视化。

        这段代码展示了如何使用SciPy中的矩阵运算功能来对矩阵进行操作,并将操作结果进行可视化展示。计算了矩阵的逆和特征值,然后将原始矩阵和逆矩阵进行了可视化比较,并绘制了矩阵特征值的实部和虚部。

        首先,需要导入必要的库和模块:

        接下来,定义一个简单的示例矩阵:

        可以使用SciPy提供的函数来对矩阵进行操作。

        接着,可以计算矩阵的特征值:

        现在,可以将这些计算结果进行可视化,以直观地展示矩阵运算的效果。首先,可以绘制原始矩阵和其逆矩阵:

import numpy as np
from scipy.linalg import inv, eigvals
import matplotlib.pyplot as plt

matrix = np.array([[1, 2], [3, 4]])

inverse_matrix = inv(matrix)

eigenvalues = eigvals(matrix)

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

# 原始矩阵
plt.subplot(1, 2, 1)
plt.imshow(matrix, cmap='viridis', interpolation='nearest')
plt.title('原始矩阵')
plt.colorbar()

# 逆矩阵
plt.subplot(1, 2, 2)
plt.imshow(inverse_matrix, cmap='viridis', interpolation='nearest')
plt.title('逆矩阵')
plt.colorbar()

plt.tight_layout()
plt.show()

        示例运行结果如下图所示:

 

        接着,可以将矩阵的特征值进行可视化:

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

plt.plot(eigenvalues.real, eigenvalues.imag, 'o',color='blue')
plt.xlabel('实部')
plt.ylabel('虚部')
plt.title('矩阵的特征值')
plt.grid(True)
plt.show()

        示例运行结果如下图所示:

07-SciPy统计分析功能 

        在SciPy中,统计分析功能允许用户进行各种常见的统计计算,包括描述性统计、假设检验、概率分布拟合等。下面通过一个示例来演示如何使用SciPy的统计分析功能,并对其进行详细解释和可视化。

        首先,需要导入必要的库和模块:

        接下来,定义一组示例数据,用于进行统计分析。在这个示例中,生成一个服从正态分布的随机样本:

        然后,可以使用SciPy提供的统计函数来计算样本的描述性统计量,比如均值、标准差等:

        接着,可以进行一些假设检验,比如检验样本是否服从正态分布:

        现在,可以将这些统计结果进行可视化,以直观地展示样本的分布特征和假设检验结果:

        这段代码展示了如何使用SciPy中的统计分析功能对样本数据进行分析。我们计算了样本的描述性统计量,然后进行了Shapiro-Wilk正态性检验,最后将样本的直方图和拟合的正态分布曲线进行了可视化。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# 生成随机样本
np.random.seed(0)
data = np.random.normal(loc=0, scale=1, size=1000)

# 生成随机样本
np.random.seed(0)
data = np.random.normal(loc=0, scale=1, size=1000)

mean = np.mean(data)
std_dev = np.std(data)
median = np.median(data)

# Shapiro-Wilk检验
shapiro_test_statistic, shapiro_p_value = stats.shapiro(data)

# 绘制样本的直方图和正态分布拟合曲线
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, density=True, alpha=0.6, color='b', label='直方图')

# 拟合正态分布曲线
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, mean, std_dev)
plt.plot(x, p, 'k', linewidth=2,color='red', label='正态分布')

plt.title('具有正态分布拟合的样本数据直方图')
plt.xlabel('数值')
plt.ylabel('密度')
plt.legend()
plt.grid(True)
plt.savefig("../4.png", dpi=500)
plt.show()

        示例运行结果如下图所示:

总结       

        总之,SciPy 是一个功能丰富且强大的科学计算库,提供了广泛的数学、统计、优化、信号处理和图像处理功能,为科学家和工程师提供了便捷而高效的工具,帮助他们进行复杂的科学计算和数据分析工作。SciPy 的出现极大地推动了 Python 在科学计算领域的发展,使得 Python 成为一种流行的科学计算环境。

  • 33
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一伦明悦

感谢,您的支持是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值