2023.10.2学习

2023.10.2学习

人工智能基础学习

逻辑回归

解决分类问题的一种模型。

根据数据特征或属性,计算其归属到某一类别的概率P(x),根据概率数值判断其归属类别

主要应用场景:二分类问题
P ( x ) = 1 1 + e − x P(x)=\frac 1 {1+e^{-x}} P(x)=1+ex1

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+eg(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(1P(xi)),ififyi=1yi=0
(解释:若y = 1, 则概率函数P(x)应 >=0.5,去接近1,那么损失函数呈现出来应尽量最小化,即接近0;y = 0的情况同理)

image-20231002105807563

为了便于在计算机中运行,将损失函数改写为
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=1mJi=m1[i=1m(yilog(P(xi))+(1yi)log(1P(xi)))]

LogisticRegression

引入sklearn.linear_model库中的LogisticRgression包。

from sklearn.linear_model import LogisticRegression
  1. 代码的第一部分为建立一阶边界函数进行逻辑回归

θ 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()
image-20231002163458278
  1. 后半部分代码建立二阶边界函数进行逻辑回归

θ 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()
image-20231002163537354

matlab整理练习

  1. 绘制根轨迹

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

image-20231002200141989

频域特性分析

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]);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用PyCharm 2023.2版本,你需要按照以下步骤进行操作: 1. 首先,你需要下载PyCharm 2023.2的安装程序。你可以在官方网站上找到最新版本的安装程序。双击下载的安装程序(pycharm-professional-2023.2.exe)来启动安装程序。 2. 在安装程序启动后,按照提示完成安装过程。你可以选择安装路径和其他选项,根据自己的需要进行设置。 3. 安装完成后,你可以在开始菜单或桌面上找到PyCharm的快捷方式。双击快捷方式来打开PyCharm。 4. 当PyCharm第一次启动时,它会要求你设置一些初始配置,如选择界面语言和键盘布局等。根据个人喜好进行设置。 5. 在PyCharm的主界面上,你可以创建一个新项目或导入已有的项目。如果是第一次使用PyCharm,你可以选择创建一个新项目来开始你的工作。 6. 在新项目中,你可以编写代码、运行程序、调试代码等。如果你需要了解PyCharm的常用操作和功能,你可以参考官方文档或其他教程。引用中的指导文章提供了一些常用操作的实验指导,你可以参考它来学习更多关于PyCharm的使用技巧。 请注意,中的引用是一个示例,显示了PyCharm 2021.3.2版本的界面。实际上,如果你使用的是PyCharm 2023.2版本,界面可能会有所不同。但整体使用方式和功能大致相同,你可以根据实际界面进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Win10中PyCharm2020.1.4安装使用入门(修订版)](https://blog.csdn.net/cnds123/article/details/107656496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值