2023.10.1学习
人工智能基础学习
机器学习:人工智能的主流方法
从数据中建立关系(学习 → 优化升级),解决问题
监督学习(Supervised Learning):训练数据包括正确的结果(术语:标签 label)
线性回归、逻辑回归、决策树、神经网络、卷积神经网络、循环神经网络
无监督学习(Unsupervised Learning):训练数据不包括正确的结果,使之自己摸索
聚类算法
半监督学习(Semi-supervised Learning):训练数据包含少量正确的结果
强化学习(Reinforcement Learning):根据每次结果收获的奖惩进行学习,实现优化
线性回归
回归分析:数据 → 两种或以上变量之间相互依赖的定量关系
线性回归:变量与因变量之间为线性关系
希望将数据拟合为线性函数 y=ax+b,然后通过寻找损失函数 J 的极小值 minimize( J ) 判断拟合是否合理。(m为样本点个数)
J
=
1
2
m
∑
i
=
1
m
(
y
i
′
−
y
i
)
2
=
1
2
m
∑
i
=
1
m
(
a
x
i
+
b
−
y
i
)
2
=
g
(
a
,
b
)
J=\frac 1 {2m} \sum\limits^m\limits_{i=1}(y^{'}_i -y_i)^2=\frac 1 {2m} \sum\limits^m\limits_{i=1}(ax_i+b-y_i)^2=g(a,b)
J=2m1i=1∑m(yi′−yi)2=2m1i=1∑m(axi+b−yi)2=g(a,b)
但是至此依然为数学理论层面,如何应用算法去迭代?
梯度下降法:寻找极小值的方法
通过向函数上当前点对应梯度的反方向的规定步长距离点进行迭代搜索,直到在极小点收敛。(α:步长)
J
=
f
(
p
)
⇒
p
i
=
1
=
p
i
−
α
∂
∂
p
i
f
(
p
i
)
J=f(p) \Rightarrow p_{i=1}=p_i-\alpha {\partial \over \partial p_i}f(p_i)
J=f(p)⇒pi=1=pi−α∂pi∂f(pi)
故从初始的a、b出发,创建临时变量pa、pb,使用梯度下降法不断迭代
t
e
m
p
a
=
a
−
α
∂
∂
a
g
(
a
,
b
)
=
a
−
α
1
m
∑
i
=
1
m
(
a
x
i
+
b
−
y
i
)
x
i
temp_a=a-\alpha {\partial \over \partial a}g(a,b)=a-\alpha \frac 1 m \sum \limits^m \limits_{i=1}(ax_i+b-y_i)x_i
tempa=a−α∂a∂g(a,b)=a−αm1i=1∑m(axi+b−yi)xi
t e m p b = b − α ∂ ∂ b g ( a , b ) = b − α 1 m ∑ i = 1 m ( a x i + b − y i ) temp_b=b-\alpha {\partial \over \partial b}g(a,b)=b-\alpha \frac 1 m \sum \limits^m \limits_{i=1}(ax_i+b-y_i) tempb=b−α∂b∂g(a,b)=b−αm1i=1∑m(axi+b−yi)
a = t e m p a 、 b = t e m p b (更新迭代) a=temp_a、b=temp_b(更新迭代) a=tempa、b=tempb(更新迭代)
注:所以前面构造 g(a,b) 时有系数1/2,为了后面约掉。
Scikit-learn
Python中专门为机器学习应用的开源框架,可以实现数据预处理、分类、回归、降维、模型选择等常用机器学习算法。
不支持Python之外的语言,不支持深度学习和强化学习。
在pyCharm中安装Scikit-learn包,然后导入模块
from sklearn.linear_model import LinearRegression
基本步骤:导入数据 → 取出数据并绘制图表 → 拟合 →(查看拟合结果:a、b)→ 预测数据 → 评估数据
①read_csv()
→ ②plt.scatter(data.loc[:, 'x'],data.lot[:, 'y'])
→ ③Linear_gression()
、lr_model.fit(x, y)
(注意x = np.array(x)
、 x = x.reshape(-1, 1)
)→ ④a = lr_model.coef_
、b = lr_model.intercept_
→
⑤ y_predict? = lr_model.predict([[?]])
→ ⑥y_predict = lr_model.predict(x)
、
MSE = mean_squared_error(y, y_predict)
、R2 = r2_score(y, y_predict)
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 数据加载
data = pd.read_csv('generated_data.csv')
print(type(data)) # pandas.core.frame.DataFrame
print(data.shape)
print(data.head())
# 数据赋值(取出)
x = data.loc[:, 'x']
y = data.loc[:, 'y']
print(x, y)
# 展示图形
fig1 = plt.figure(figsize=(5, 5))
plt.scatter(x, y)
plt.show()
# 建立线性回归模型
lr_model = LinearRegression() # 默认参数创建实例
print(type(x), x.shape) # (10,) 0维,需要转变维数
x = np.array(x) # 将x转为数组类型
x = x.reshape(-1, 1) # 改变数组维度,若干行,1列 → (10, 1)
y = np.array(y)
y = y.reshape(-1, 1)
print(x.shape, y.shape) # (10, 1)
lr_model.fit(x, y) # 拟合线性模型
# 打印系数a、b
a = lr_model.coef_
b = lr_model.intercept_
print(a, b) # [[2.]] [5.]
# 预测
y_3 = lr_model.predict([[3]]) # 参数为矩阵元素的形式,且维度需要保持一致
print(y_3) # [[11.]]
# 评估模型表现
y_predict = lr_model.predict(x)
MSE = mean_squared_error(y, y_predict)
R2 = r2_score(y, y_predict)
print(MSE, R2) # MES越接近0,拟合越好;R2越接近1,拟合越好
fig2 = plt.figure(figsize=(5, 5))
plt.plot(y, y_predict)
plt.show()
如果需要在一幅大图上呈现多幅图形,则
fig1 = plt.subplot(231) # 2行3列的第一幅图
多元线性回归
multi_data = pd.read_csv('multi_data.csv')
print(multi_data.head())
X_multi = multi_data.drop(['y'], axis=1) # 将结果drop掉
# X_multi不用再reshape,因为已经是多列数据
y = multi_data.loc[:, 'y']
y = np.array(y)
y = y.reshape(-1, 1)
LR_multi = LinearRegression()
LR_multi.fit(X_multi, y)
y_predict_multi = LR_multi.predict(X_multi)
print(y_predict_multi)
MSE_1 = mean_squared_error(y, y_predict_multi)
R2_1 = r2_score(y, y_predict_multi)
print(MSE_1, R2_1)
fig3 = plt.figure(figsize=(5, 5))
plt.scatter(y, y_predict_multi)
plt.show()
# 对具体数据进行预测
X_test = [6.5, 8.5]
X_test = np.array(X_test).reshape(1, -1) # reshape为1行,若干列
y_test_predict = LR_multi.predict(X_test)
print(y_test_predict)
Matlab编程整理练习
- 绘制连续系统时域函数曲线
首先列写出传递函数分子系数数组num = [b0 b1 b2 ...]
,和分母系数数组den = [1 a1 a2 ...]
,注意不可以省去0;然后输入matlab指令
函数 | 功能 | 调用格式 |
---|---|---|
impulse | 绘制单位脉冲响应曲线 | impulse(num, den) ,impulse(num, den,t) (指定结束时间t) |
step | 绘制单位阶跃响应曲线 | step(num, den) ,step(num, den, t) (指定结束时间t) |
lsim | 绘制任意输入u 的响应曲线 | lsim(num, den, u, t) |
grid
:切换坐标轴网格线的隐藏/显示状态
hold on
:当前图像保存,与之后的图像多图并存
- 求解线性连续系统的稳定性问题
(1)求解特征根方程(den)的根(闭环传递函数极点)
调用指令:roots(den)
得到特征根的列向量ans
,可以在命令行键入ans
查看特征根结果
(2)绘制复平面零极点图
调用指令:pzmap(num, den)
得到零极点图,“ × ”代表极点,“O”代表零点
还可以由[p, z]
数组接收pzmap(num, den)
的结果,得到零、极点的向量