2023.10.2学习
人工智能基础学习
逻辑回归
解决分类问题的一种模型。
根据数据特征或属性,计算其归属到某一类别的概率P(x),根据概率数值判断其归属类别
主要应用场景:二分类问题
P
(
x
)
=
1
1
+
e
−
x
P(x)=\frac 1 {1+e^{-x}}
P(x)=1+e−x1
y = { 1 , P ( x ) ≥ 0.5 0 , P ( x ) < 0.5 y = \begin {cases} {1,} & {P(x)\geq 0.5} \\ {0,}&P(x)<0.5 \end {cases} y={1,0,P(x)≥0.5P(x)<0.5
其中,y为类别结果,P(x)为概率分布函数,x为特征值
多因子情况
将 x 替换为多元/多次函数 g(x),即
P
(
x
)
=
1
1
+
e
−
g
(
x
)
P(x)=\frac 1 {1+e^{-g(x)}}
P(x)=1+e−g(x)1
g ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 . . . g(x)=θ_0+\theta_1x_1+\theta_2x_2... g(x)=θ0+θ1x1+θ2x2...
g(x)=0 时的方程称为决策边界(Decision Boundary),可以是直线、曲线、面。
目标:根据训练样本,寻找决策边界函数的系数
如果得到了预测结果,如果评判拟合的准确性? → 最小化损失函数 ( J )
J
i
=
{
−
l
o
g
(
P
(
x
i
)
)
,
i
f
y
i
=
1
−
l
o
g
(
1
−
P
(
x
i
)
)
,
i
f
y
i
=
0
J_i=\begin {cases} {-log(P(x_i)),} &{if}&{y_i=1} \\ {-log(1-P(x_i)),}&{if}&{y_i = 0}\end{cases}
Ji={−log(P(xi)),−log(1−P(xi)),ififyi=1yi=0
(解释:若y = 1, 则概率函数P(x)应 >=0.5,去接近1,那么损失函数呈现出来应尽量最小化,即接近0;y = 0的情况同理)
为了便于在计算机中运行,将损失函数改写为
J
=
1
m
∑
i
=
1
m
J
i
=
−
1
m
[
∑
i
=
1
m
(
y
i
l
o
g
(
P
(
x
i
)
)
+
(
1
−
y
i
)
l
o
g
(
1
−
P
(
x
i
)
)
)
]
J=\frac 1 m \sum \limits^m \limits_{i=1}J_i=-\frac 1 m[\sum \limits^m \limits_{i=1}(y_ilog(P(x_i))+(1-y_i)log(1-P(x_i)))]
J=m1i=1∑mJi=−m1[i=1∑m(yilog(P(xi))+(1−yi)log(1−P(xi)))]
LogisticRegression
引入sklearn.linear_model库中的LogisticRgression包。
from sklearn.linear_model import LogisticRegression
- 代码的第一部分为建立一阶边界函数进行逻辑回归
θ 0 + θ 1 X 1 + θ 2 X 2 = 0 \theta_0 + \theta_1 X_1 + \theta_2 X_2 =0 θ0+θ1X1+θ2X2=0
步骤:
(1)导入数据,可视化(添加mask标签,可区分不同数据)
(2)取出数据
(3)逻辑回归(LR = LogisticGression()
、LR.fit(X, y)
)
(4) 结果预测和评估(y_predict = LR.predict(X)
、accuracy = accuracy_score(y, y_predict)
,注意 from sklearn.metrics import accuracy_score
)
(5)绘制边界曲线函数
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
data = pd.read_csv('examdata.csv')
print(data.head())
# 数据可视化
fig1 = plt.figure()
plt.scatter(data.loc[:, 'Exam1'], data.loc[:, 'Exam2'])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.show()
# 添加mask区分不同数据
mask = data.loc[:, 'Pass'] == 1
print(mask)
print(~mask) # 波浪号取反
fig2 = plt.figure()
passed = plt.scatter(data.loc[:, 'Exam1'][mask], data.loc[:, 'Exam2'][mask]) # 创建对象接收数据
failed = plt.scatter(data.loc[:, 'Exam1'][~mask], data.loc[:, 'Exam2'][~mask])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed, failed), ('passed', 'failed')) # legend增加题注
plt.show()
# 取出数据
X = data.drop(['Pass'], axis=1) # axis=1,表示去除这一列
print(X.head())
X1 = data.loc[:, 'Exam1']
X2 = data.loc[:, 'Exam2']
y = data.loc[:, 'Pass']
# 逻辑回归
LR = LogisticRegression()
print(X.shape, y.shape)
LR.fit(X, y)
# 预测结果和评估
y_predict = LR.predict(X)
print(y_predict)
accuracy = accuracy_score(y, y_predict) # 评估正确率
print(accuracy)
# 预测Exam1 = 75, Exam2 = 65, 能否通过
y_test = LR.predict([[75, 65]])
print('passed' if y_test == 1 else 'failed')
# 线性决策边界的系数
theta12 = LR.coef_ # theta1和theta2
print(theta12)
theta1, theta2 = LR.coef_[0][0], LR.coef_[0][1]
theta0 = LR.intercept_ # 截距
print(theta0)
# 绘制边界曲线
X2_line = -(theta0 + theta1*X1)/theta2
fig3 = plt.figure()
plt.plot(X1, X2_line)
passed = plt.scatter(data.loc[:, 'Exam1'][mask], data.loc[:, 'Exam2'][mask]) # 创建对象接收数据
failed = plt.scatter(data.loc[:, 'Exam1'][~mask], data.loc[:, 'Exam2'][~mask])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed, failed), ('passed', 'failed')) # legend增加题注
plt.show()
- 后半部分代码建立二阶边界函数进行逻辑回归
θ 0 + θ 1 X 1 + θ 2 X 2 + θ 3 X 1 2 + θ 4 X 2 2 + θ 5 X 1 X 2 = 0 \theta_0+\theta_1X_1 +\theta_2X_2+\theta_3X_1^2+\theta_4X_2^2+\theta_5X_1X_2=0 θ0+θ1X1+θ2X2+θ3X12+θ4X22+θ5X1X2=0
注意:①需要创建新的数据集,可以创建字典利用前面已有数据;②绘制高阶曲线,注意将数据重新排序(sort()
)
# 创建高阶决策边界曲线
X1_2 = X1*X1
X2_2 = X2*X2
X1_X2 = X1*X2
X_new = {'X1': X1, 'X2': X2, 'X1_2': X1_2, 'X2_2': X2_2, 'X1_X2': X1_X2} # 创建字典
X_new = pd.DataFrame(X_new) # 生成新的数据
print(X_new.head())
LR2 = LogisticRegression()
LR2.fit(X_new, y)
y2_predict = LR2.predict(X_new)
accuracy2 = accuracy_score(y, y2_predict)
print(accuracy2)
# 绘制边界曲线
print(LR2.coef_) # 获取二阶边界函数的系数theta1、theta2、theta3、theta4、theta5
theta2_0 = LR2.intercept_
theta2_1 = LR2.coef_[0][0]
theta2_2 = LR2.coef_[0][1]
theta2_3 = LR2.coef_[0][2]
theta2_4 = LR2.coef_[0][3]
theta2_5 = LR2.coef_[0][4]
X1_new = X1.sort_values() # 在创建曲线上的X2点和绘图前,先将X1进行排序
print(X1_new)
a = theta2_4
b = theta2_5*X1_new + theta2_2
c = theta2_0 + theta2_1*X1_new + theta2_3*X1_new*X1_new # 改写成a*x^2 + b*x + c = 0的形式
X2_new_boundary = (-b + np.sqrt(b*b-4*a*c))/(2*a) # np.sqrt(): 求根号
fig4 = plt.figure()
plt.plot(X1_new, X2_new_boundary) # 绘制二阶边界曲线
fig5 = plt.figure()
passed = plt.scatter(data.loc[:, 'Exam1'][mask], data.loc[:, 'Exam2'][mask]) # 创建对象接收数据
failed = plt.scatter(data.loc[:, 'Exam1'][~mask], data.loc[:, 'Exam2'][~mask])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed, failed), ('passed', 'failed')) # legend增加题注
plt.plot(X1_new, X2_new_boundary) # 绘制二阶边界曲线
plt.show()
matlab整理练习
- 绘制根轨迹
rlocus(sys); % 默认开环增益从0变化到∞
rlocus(sys, k); % 指定可变参数k由0变化到∞
rlocus(sys1, sys2, ...); %在同一复平面内画多个系统的根轨迹
r = rlocus(sys, k); % 得到指定k值时的极点位置r
num = [0 1 8*sqrt(3) 96];
den = [1 8*sqrt(3) 0 0];
sys = tf(num, den); % 输入传递函数
rlocus(sys); % 绘制根轨迹
axis([-35 5 -15 15]); % 设置坐标范围
grid on
r = rlocus(sys, 25.5); % 获取开环增益为25.5时的极点位置(向量)
注意:在根轨迹图中,grid on
出的网格线为等 ξ 线和等 ωn 圆
频域特性分析
nyquist(num, den); %绘制奈奎斯特图
bode(num, den); % 绘制伯德图
margin(num, den); % 绘制系统开环对数频率特性曲线,且可以直接给出相位穿越频率、幅值裕量、幅值穿越频率、相角裕量
tip: 如果传递函数的形式较为复杂,如
G
(
s
)
=
100
s
(
s
2
+
2
s
+
16
)
(
s
+
3
)
(
s
2
+
2.5
s
+
9
)
G(s) = \frac {100} {s(s^2+2s+16)(s+3)(s^2+2.5s+9)}
G(s)=s(s2+2s+16)(s+3)(s2+2.5s+9)100
则den
可以写为
den0 = conv([1 2 6], [1 3 0]);
den = conv(den0, [1 2.5 9]);