完成一个特定行业的算法应用全过程:
懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合 +算法评估+持续调优+工程化接口实现
关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用: 对于某类任务T和性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习。
# 导入依赖
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 # 解决中文乱码问题(仅针对windows电脑)
plt.rcParams['axes.unicode_minus'] = False # 解决负号无法显示问题
# 生成模拟数据
np.random.seed(42)
X = np.linspace(0, 10, 100)
X
输出为
生成y值
# 根据x生成y
true_slope = 2.5 # 斜率
true_intercept = 1.0 # 截距
# y = true_slope * X + true_intercept + np.random.normal(0, 2, len(X))*2
y = true_slope * np.power(X,2)*0.8 + true_intercept + np.random.normal(0, 2, len(X)) - + np.random.normal(0, 2, len(X))
y
输出为
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
输出为
# 绘制左边的子图
# 因为画布只展示一次,每次都要重新绘制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线")
ax1.legend()
plt.show()
输出为:
# 绘制右边的子图
# 因为画布只展示一次,每次都要重新绘制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线")
ax1.legend()
# 右图:损失函数(MSE)随迭代的变化
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 800)
ax2.set_xlabel("迭代次数")
ax2.set_ylabel("均方误差 (MSE)")
loss_line, = ax2.plot([], [], 'g-', lw=2, label="MSE")
ax2.legend()
plt.show()
输出为:
# 为解决jupyter中不显示动图问题,采取的方案
# %pylab 魔法命令可以使numpy和matplotlib中的科学计算功能生效,
# 这些功能被称为基于向量和矩阵的高效操作,交互可视化特性。
# 它能够让我们在控制台进行交互式计算和动态绘图。
from matplotlib import pylab
%pylab
# 因为画布只展示一次,每次都要重新绘制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线")
ax1.legend()
# 右图:损失函数(MSE)随迭代的变化
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 800)
ax2.set_xlabel("迭代次数")
ax2.set_ylabel("均方误差 (MSE)")
loss_line, = ax2.plot([], [], 'g-', lw=2, label="MSE")
ax2.legend()
# 初始化参数和损失记录
current_slope = 0.0 # 斜率
current_intercept = 0.0 # 截距
mse_history = []
# 梯度下降参数
learning_rate = 0.02
n_iterations = 100
# 动画更新函数 frame是帧数
def update(frame):
global current_slope, current_intercept
# 计算梯度
y_pred = current_slope * X + current_intercept
# y_pred = current_slope * np.power(X,2) + current_intercept
error = y_pred - y
grad_slope = 2 * np.mean(error * X) # slope是斜率
grad_intercept = 2 * np.mean(error) # intercept是截距
# 更新参数
current_slope -= learning_rate * grad_slope # current_slope是斜率
current_intercept -= learning_rate * grad_intercept # current_intercept是截距
# 计算当前MSE
mse = np.mean(error**2) # 均方误差
mse_history.append(mse) # 均方误差
# 更新左图:拟合直线
# set_data()是一个元组,set_data()[0]是直线的x坐标,set_data()[1]是直线的y坐标
# 当x为0时,y为current_intercept,当x为10时,y为current_slope*10 + current_intercept
line.set_data([0, 10], [current_intercept, current_slope*10 + current_intercept])
# line.set_data([0, 10], [current_intercept, current_slope*np.power(10,2) + current_intercept])
# 更新右图:损失曲线
loss_line.set_data(np.arange(len(mse_history)), mse_history)
ax2.set_xlim(0, len(mse_history)+5)
# 添加动态文本
ax1.set_title(f"斜率: {current_slope:.2f}, 截距: {current_intercept:.2f}")
ax2.set_title(f"当前MSE: {mse:.2f}")
# time.sleep(0.5)
return line, loss_line#, scatter
# 创建动画
# frames是帧数,interval是间隔时间,blit是是否只更新变化的部分
ani = FuncAnimation(fig, update, frames=n_iterations, interval=100, blit=False)
plt.tight_layout() # 调整布局
plt.show()
输出为:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time
import math
import scipy
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 # 解决中文乱码问题(仅针对windows电脑)
plt.rcParams['axes.unicode_minus'] = False # 解决负号无法显示问题
# 生成模拟数据
np.random.seed(42)
X = np.linspace(0, 10, 100)
# 数据归一化
# X_normalized = (X - np.min(X)) / (np.max(X) - np.min(X))
true_slope = 2.5
true_intercept = 1.0
# y = true_slope * X + true_intercept + np.random.normal(0, 2, len(X))*2
y = true_slope * np.power(X,2)*0.8 + true_intercept + np.random.normal(0, 2, len(X)) - + np.random.normal(0, 2, len(X))
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线")
ax1.legend()
# 右图:损失函数(MSE)随迭代的变化
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 800)
ax2.set_xlabel("迭代次数")
ax2.set_ylabel("均方误差 (MSE)")
loss_line, = ax2.plot([], [], 'g-', lw=2, label="MSE")
ax2.legend()
# 初始化参数和损失记录
current_slope = 0.0 # 斜率
current_intercept = 0.0 # 截距
mse_history = []
# 梯度下降参数
learning_rate = 0.02
n_iterations = 100
# 动画更新函数 frame是帧数
def update(frame):
global current_slope, current_intercept
# 计算梯度
y_pred = current_slope * X + current_intercept
# y_pred = current_slope * np.power(X,2) + current_intercept
error = y_pred - y
grad_slope = 2 * np.mean(error * X) # slope是斜率
grad_intercept = 2 * np.mean(error) # intercept是截距
# 更新参数
current_slope -= learning_rate * grad_slope # current_slope是斜率
current_intercept -= learning_rate * grad_intercept # current_intercept是截距
# 计算当前MSE
mse = np.mean(error**2) # 均方误差
mse_history.append(mse) # 均方误差
# 更新左图:拟合直线
# set_data()是一个元组,set_data()[0]是直线的x坐标,set_data()[1]是直线的y坐标
# 当x为0时,y为current_intercept,当x为10时,y为current_slope*10 + current_intercept
line.set_data([0, 10], [current_intercept, current_slope*10 + current_intercept])
# line.set_data([0, 10], [current_intercept, current_slope*np.power(10,2) + current_intercept])
# 更新右图:损失曲线
loss_line.set_data(np.arange(len(mse_history)), mse_history)
ax2.set_xlim(0, len(mse_history)+5)
# 添加动态文本
ax1.set_title(f"斜率: {current_slope:.2f}, 截距: {current_intercept:.2f}")
ax2.set_title(f"当前MSE: {mse:.2f}")
# time.sleep(0.5)
return line, loss_line#, scatter
# 创建动画
# frames是帧数,interval是间隔时间,blit是是否只更新变化的部分
ani = FuncAnimation(fig, update, frames=n_iterations, interval=100, blit=False)
plt.tight_layout() # 调整布局
plt.show()