吴恩达机器学习--逻辑回归

文章目录

  • 前言
  • 一、普通二分类逻辑回归
    • 需求分析
    • 程序设计
      • 1. 导入数据
      • 2. 可视化数据
      • 3. 划分数据
      • 4. sigmoid函数
      • 5. 假设函数
      • 6. 损失函数
      • 7. 梯度下降算法
      • 8. 可视化模型
      • 9. 模型准确率
      • 10. 试试sklearn库
      • 11. sklearn的准确率
      • 12. 完整程序
  • 二、 复杂二分类逻辑回归
    • 需求分析
    • 程序设计
      • 1. 逻辑回归
      • 2. 模型准确率
      • 3. 增加多项式特征
      • 4. 新的准确率
      • 5. 绘制决策曲线
      • 6. 正则化损失函数
      • 7. 正则化梯度下降函数
      • 8. 试试sklearn库
      • 9. 完整程序
  • 总结

前言

logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,所以实际中最为常用的就是二分类的logistic回归,本文主要给出二分类逻辑回归的详细实现过程。

一、普通二分类逻辑回归

需求分析

在训练的初始阶段,我们将要构建一个逻辑回归模型来预测,某个学生是否被大学录取。设想你是大学相关部分的管理者,想通过申请学生两次测试的评分,来决定他们是否被录取。现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集。对于每一个训练样本,你有他们两次测试的评分和最后是被录取的结果。

程序设计

1. 导入数据

我们可以使用pandas读取文件中的数据,并给数据添加一个常数列(为了方便计算)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
data=pd.read_csv(r"d:/逻辑回归/ex2data1.txt",names=["Exam1","Exam2","Admitted"])
data.insert(0,"ones",1)

2. 可视化数据

我们可以使用matplotlib来绘制训练集的可视化图形,其中用红色三角形表示被录取的学生,用蓝色圆形表示没有被录取的学生

positive=data["Admitted"].isin([1])
negative=data["Admitted"].isin([0])
plt.scatter(data[positive]["Exam1"],data[positive]["Exam2"],color='red',marker='^')
plt.scatter(data[negative]["Exam1"],data[negative]["Exam2"],color='blue',marker='o')
plt.xlabel("Exam1")
plt.ylabel("Exam2")
plt.title("两门测试的成绩")
plt.show()

两门课程的成绩与录取的关系图1

3. 划分数据

将数据划分为训练特征和训练标签

m=data.shape[0]
col_num=data.shape[1]
X=data.iloc[:,:col_num-1].values
y=data.iloc[:,col_num-1].values.reshape((m,1))

4. sigmoid函数

我们定义一个sigmoid函数,它将把输入的每个值转换为概率

g g g 代表一个常用的逻辑函数(logistic function)为 S S S形函数(Sigmoid function)

公式为:
g ( z ) = 1 1 + e − z g\left( z \right)=\frac{1}{1+{{e}^{-z}}} g(z)=1+ez1

#sigmoid函数
def sigmoid(z):
    return 1/(1+np.exp(-z))

我们可以通过绘图来看看它的正确性

nums=np.arange(-10,10)
fig,ax=plt.subplots(figsize=(6,4))
ax.plot(nums,sigmoid(nums),'r')
plt.show()

没错,是个S型曲线
sigmoid函数

5. 假设函数

我们定义逻辑回归模型,它输出一个由sigmoid函数之后的值构成的矩阵,这代表了每个样本被分配到每个类的概率

由sigmoid函数,我们得到逻辑回归模型的假设函数:
h ( x ) = 1 1 + e − w T x h\left( x \right)=\frac{1}{1+{{e}^{-{{w }^{T}}x}}} h(x)=1+ewTx1

#假设函数
def h(X,w):
    return sigmoid(X@w)

6. 损失函数

损失函数:
J ( w ) = − 1 m ∑ i = 1 m ( y ( i ) log ⁡ ( h ( x ( i ) ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h ( x ( i ) ) ) ) J\left(w\right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}\log \left( {h}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h}\left( {{x}^{(i)}} \right) \right))} J(w)=m1i=1m(y(i)log(h(x(i)))+(1y(i))log(1h(x(i))))

我们定义损失函数,用它来度量模型的准确性

#损失函数
def cost(X,w,y):
    return -np.sum(y.ravel()*np.log(h(X,w)).ravel()+(1-y).ravel()*np.log(1-h(X,w)).ravel())/m

7. 梯度下降算法

梯度下降函数:
∂ J ( w ) ∂ w j = 1 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J\left( w \right)}{\partial {{w }_{j}}}=\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}}\left( {{x}^{(i)}} \right)-{{y}^{(i)}})x_{_{j}}^{(i)}} wjJ(w)=m1i=1m(h(x(i))y(i))xj(i)

我们使用梯度下降算法来优化成本函数并训练模型
每一次迭代,我们计算每个参数的梯度并更新其值
这个过程重复多次直到损失函数的值越低越好

#梯度下降函数
def gradient_descent(X,w,y,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,w,y))
    return w,cost_lst
w=np.zeros((col_num-1,1))
n,a=600000,0.001
w,cost_lst=gradient_descent(X,w,y,n,a)
plt.plot(range(n),cost_lst,"b-o")
plt.title("梯度下降函数")
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

梯度下降函数

8. 可视化模型

最后,我们可以使用模型来绘制一个决策边界图形,它显示了被录取和没有被录取的学生的分界线

x1=np.linspace(data["Exam1"].min(),data["Exam1"].max(),100)
x2=(-w[0,0]-w[1,0]*x1)/(w[2,0])
plt.plot(x1,x2,"r-o")
plt.scatter(data[positive]["Exam1"],data[positive]["Exam2"],color="c",marker="^")
plt.scatter(data[negative]["Exam1"],data[negative]["Exam2"],color="b",marker="o")
plt.xlabel("Exam1")
plt.ylabel("Exam2")
plt.title("两门课程的成绩与录取的关系")
plt.show()

两门课程的成绩与录取的关系图2

9. 模型准确率

我们运用该模型进行预测,准确率高达0.9!

Y=(h(X,w)>0.5)
np.sum(y==Y)/m    #输出为0.9

10. 试试sklearn库

导入sklearn库,我们可以快速得到预测结果

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
data=pd.read_csv(r"d:/逻辑回归/ex2data1.txt",names=["Exam1","Exam2","Admitted"])
positive=data["Admitted"].isin([1])
negative=data["Admitted"].isin([0])
X=data.iloc[:,:2].values
y=data.iloc[:,2].values
clf=LogisticRegression()
clf.fit(X,y)
w=clf.coef_[0]
b=clf.intercept_ 
plt.plot(x1,x2,"r-o")
plt.scatter(data[positive]["Exam1"],data[positive]["Exam2"],color="c",marker="^")
plt.scatter(data[negative]["Exam1"],data[negative]["Exam2"],color="b",marker="o")
plt.xlabel("Exam1")
plt.ylabel("Exam2")
plt.title("两门课程的成绩与录取的关系")
plt.show()

两门课程的成绩与录取的关系图3

11. sklearn的准确率

让我们使用score函数看看准确率如何吧

from sklearn.linear_model import LogisticRegression
y1=y.flatten()
mod = LogisticRegression().fit(X, y1)
mod.score(X,y)            #输出为0.89

准确率高达0.89!

12. 完整程序

完整代码如下

#导入数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
data=pd.read_csv(r"d:/逻辑回归/ex2data1.txt",names=["Exam1","Exam2","Admitted"])
data.insert(0,"ones",1)     #插入一列
#可视化数据
positive=data["Admitted"].isin([1])     
negative=data["Admitted"].isin([0])
plt.scatter(data[positive]["Exam1"],data[positive]["Exam2"],color='red',marker='^')
plt.scatter(data[negative]["Exam1"],data[negative]["Exam2"],color='blue',marker='o')
plt.xlabel("Exam1")
plt.ylabel("Exam2")
plt.title("两门课程的成绩与录取的关系")
plt.show()
#划分数据
m=data.shape[0]
col_num=data.shape[1]
X=data.iloc[:,:col_num-1].values
y=data.iloc[:,col_num-1].values.reshape((m,1))
#sigmoid函数
def sigmoid(z):
    return 1/(1+np.exp(-z))
#检验
nums=np.arange(-10,10)
plt.plot(nums,sigmoid(nums),'r')
plt.title("sigmoid函数")
plt.show()
#假设函数
def h(X,w):
    return sigmoid(X@w)
#损失函数
def cost(X,w,y):
    return -np.sum(y.ravel()*np.log(h(X,w)).ravel()+(1-y).ravel()*np.log(1-h(X,w)).ravel())/m
#梯度下降函数
def gradient_descent(X,w,y,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,w,y))
    return w,cost_lst
w=np.zeros((col_num-1,1))
n,a=600000,0.001
w,cost_lst=gradient_descent(X,w,y,n,a)
plt.plot(range(n),cost_lst,"b-o")
plt.title("梯度下降函数")
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()
x1=np.linspace(data["Exam1"].min(),data["Exam1"].max(),100)
x2=(-w[0,0]-w[1,0]*x1)/(w[2,0])
plt.plot(x1,x2,"r-o")
plt.scatter(data[positive]["Exam1"],data[positive]["Exam2"],color="c",marker="^")
plt.scatter(data[negative]["Exam1"],data[negative]["Exam2"],color="b",marker="o")
plt.xlabel("Exam1")
plt.ylabel("Exam2")
plt.title("两门课程的成绩与录取的关系")
plt.show()
Y=(h(X,w)>0.5)
np.sum(y==Y)/m

二、 复杂二分类逻辑回归

需求分析

用正则化的Logistic回归模型来预测一个制造工厂的微芯片是否通过质量保证(QA),在QA过程中,每个芯片都会经过各种测试来保证它可以正常运行。假设你是这个工厂的产品经理,你拥有一些芯片在两个不同测试下的测试结果,从这两个测试,你希望确定这些芯片是被接受还是拒绝,为了帮助你做这个决定,你有一些以前芯片的测试结果数据集,从中你可以建一个Logistic回归模型。

程序设计

1. 逻辑回归

像上一个例子一样,运用普通逻辑回归试试

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
datas=pd.read_csv(r"d:/逻辑回归/ex2data2.txt",names=["Test1","Test2","Accepted"])
datas.insert(0,"ones",1)
col_num=datas.shape[1]
m=datas.shape[0]
X=datas.iloc[:,:col_num-1].values
y=datas.iloc[:,col_num-1].values.reshape((m,1))
def sigmoid(z):
    return 1/(1+np.exp(-z))
def h(X,w):
    return sigmoid(X@w)
def cost(X,w,y):
    return -np.sum(y.ravel()*np.log(h(X,w)).ravel()+(1-y).ravel()*np.log(1-h(X,w)).ravel())/m
def gradient_descent(X,w,y,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,w,y))
    return w,cost_lst

2. 模型准确率

但是我们发现该模型的准确率连0.6都不到

w=np.zeros((col_num-1,1))
n,a=600000,0.001
w,cost_lst=gradient_descent(X,w,y,n,a)
Y=(h(X,w)>=0.5)
np.sum(y==Y)/m    #输出为:0.5508474576271186

3. 增加多项式特征

此时我们需要增加多列多项式的特征

def poly_feature(datas,degree):
    x1=datas["Test1"]
    x2=datas["Test2"]
    for i in range(degree+1):
        for j in range(degree-i+1):
            datas["F"+str(i)+str(j)]=np.power(x1,i)*np.power(x2,j)            
    datas=datas.drop(["Test1","Test2"],axis=1)
    return datas
datas=poly_feature(datas,4)

4. 新的准确率

让我们再来看看模型的准确率如何吧

Y=(h(X,w)>=0.5)
np.sum(y==Y)/m     #输出为:0.847457627118644

准确率达到了0.8,相比0.5很不错啦

5. 绘制决策曲线

让我们一起看看模型的决策曲线图

data=pd.read_csv(r"d:/逻辑回归/ex2data2.txt",names=["Test1","Test2","Accepted"])
x1=np.linspace(-1,1.5,50)
x2=np.linspace(-1,1.5,50)
X1,X2=np.meshgrid(x1, x2)
# 计算每个网格点的预测分类结果
X_grid=poly_feature(pd.DataFrame({"Test1":X1.flatten(),"Test2":X2.flatten()}),degree=4).values
y_grid=h(X_grid,w).reshape(X1.shape)
# 将预测结果转换为0或1,根据阈值0.5进行分类
y_pred=(y_grid>0.5).astype(int)
# 可视化结果
plt.figure(figsize=(8,6))
plt.contourf(X1,X2,y_pred,alpha=0.2,cmap="coolwarm")
plt.scatter(data[positive]["Test1"],data[positive]["Test2"],c="b",marker="o",label="Accepted")
plt.scatter(data[negative]["Test1"],data[negative]["Test2"],c="r",marker="x",label="Not accepted")
plt.xlabel("Test1")
plt.ylabel("Test2")
plt.title("决策曲线图")
plt.legend()
plt.show()

决策曲线图

6. 正则化损失函数

让我们将损失函数正则化一下

def cost_regularization(X,w,y,l):
    cost=-np.sum(y.ravel()*np.log(h(X,w).ravel())+(1-y).ravel()*np.log(1-h(X,w)).ravel())/X.shape[0]+(l/(2*X.shape[0]))*np.sum(np.power(w[1:,0],2))
    return cost

7. 正则化梯度下降函数

再来正则化一下梯度下降函数吧

def grandient_regularization(X,w,y,n,a,l):
    y=y.reshape((X.shape[0],1))
    w=np.zeros((X.shape[1],1))
    cost_lst=[] 
    for i in range(n):
        y_pred=h(X,w)-y
        temp=np.zeros((X.shape[1],1))
        for j in range(0,X.shape[1]):
            if j==0:
                right_0=np.multiply(y_pred.ravel(),X[:,0])
                gradient_0=1/(X.shape[0])*(np.sum(right_0))
                temp[j,0]=w[j,0]-a*(gradient_0)
            else:
                right=np.multiply(y_pred.ravel(),X[:,j])
                reg=(l/X.shape[0])*w[j,0]
                gradient=1/(X.shape[0])*(np.sum(right))
                temp[j,0]=w[j,0]-a*(gradient+reg)          
        w=temp
        cost_lst.append(cost_reg(X,w,y,l))
    return w,cost_lst

8. 试试sklearn库

导入sklearn库,试试直接获取模型的准确率吧

from sklearn import linear_model  #调用sklearn的线性回归包
model = linear_model.LogisticRegression(penalty='l2', C=1.0)
model.fit(X, y.ravel())
model.score(X,y)   #输出为:0.8220338983050848

9. 完整程序

完整代码如下

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
datas=pd.read_csv(r"d:/逻辑回归/ex2data2.txt",names=["Test1","Test2","Accepted"])
#为数据框增加多列多项式特征
def poly_feature(datas,degree):
    x1=datas["Test1"]
    x2=datas["Test2"]
    for i in range(degree+1):
        for j in range(degree-i+1):
            datas["F"+str(i)+str(j)]=np.power(x1,i)*np.power(x2,j)            
    datas=datas.drop(["Test1","Test2"],axis=1)
    return datas
datas=poly_feature(datas,4)
positive=datas["Accepted"]==1
negative=datas["Accepted"]==0
col_num=datas.shape[1]
m=datas.shape[0]
X=datas.iloc[:,1:col_num].values
y=datas.iloc[:,0].values.reshape((m,1))
def sigmoid(z):
    return 1/(1+np.exp(-z))
def h(X,w):
    return sigmoid(X@w)
def cost(X,w,y):
    return -np.sum(y.ravel()*np.log(h(X,w)).ravel()+(1-y).ravel()*np.log(1-h(X,w)).ravel())/m
def gradient_descent(X,w,y,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,w,y))
    return w,cost_lst
w=np.zeros((col_num-1,1))
n,a=600000,0.001
w,cost_lst=gradient_descent(X,w,y,n,a)
plt.plot(range(n),cost_lst,'b-o')
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.title("误差随迭代次数变化图")
plt.show()
data=pd.read_csv(r"d:/逻辑回归/ex2data2.txt",names=["Test1","Test2","Accepted"])
x1=np.linspace(-1,1.5,50)
x2=np.linspace(-1,1.5,50)
X1,X2=np.meshgrid(x1, x2)
# 计算每个网格点的预测分类结果
X_grid=poly_feature(pd.DataFrame({"Test1":X1.flatten(),"Test2":X2.flatten()}),degree=4).values
y_grid=h(X_grid,w).reshape(X1.shape)
# 将预测结果转换为0或1,根据阈值0.5进行分类
y_pred=(y_grid>0.5).astype(int)
# 可视化结果
plt.figure(figsize=(8,6))
plt.contourf(X1,X2,y_pred,alpha=0.2,cmap="coolwarm")
plt.scatter(data[positive]["Test1"],data[positive]["Test2"],c="b",marker="o",label="Accepted")
plt.scatter(data[negative]["Test1"],data[negative]["Test2"],c="r",marker="x",label="Not accepted")
plt.xlabel("Test1")
plt.ylabel("Test2")
plt.title("决策曲线图")
plt.legend()
plt.show()

总结

逻辑回归模型的建立与线性回归模型建立的过程相似,本文主要介绍了二分类的逻辑回归,还有更为复杂的多分类逻辑回归,感兴趣的同学可以自行学习吖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/7388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面向对象编程(基础)5:类的成员之二:方法(method)

目录 5.1 方法的引入 5.2 方法(method、函数)的理解 举例1: 举例2: 5.3 如何声明方法 1、声明方法的语法格式 (1)一个完整的方法 方法头 方法体。 (2)方法头可能包含5个部分 (3&…

前后端交互系列之跨域问题

目录前言1. 同源策略及跨域2. 跨域解决方案之JSONP3. 设置CORS响应头实现跨域后记前言 我们在做前后端交互的时候,会遇到跨域问题。本节内容将带领读者了解什么是跨域问题,以及跨域问题的解决方法。 1. 同源策略及跨域 我们所了解的Ajax默认是基于同源…

centos7离线安装docker

前言 在没有互联网的情况下想要安装某些软件用docker是十分方便的一种方式,例如oracle。原生的oracle安装是非常麻烦的,本人亲眼目睹一个专门搞oracle的公司的人安装oracle三天没有成功!因此不得不学习在没有互联网的情况下使用docker来安装…

vue3之shallowRef以及使用对element-plus table的优化尝试

首先,先大概回顾一下相关概念吧 ref、shallowRef ref 接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 如果将一个对象赋值给 ref,那么这个对象将通过 reactive 转为具有深层次…

【vscode】检查到已经改正的错误,没有错误却检查到有错误

一、问题背景 下面这个名为test1.c的C代码,在vscode中用扩展code runner工具通过【run code】方式执行时, 出现了诸如’xxx’ does not name a type、‘xxx’ expected unqualified-id before ‘for’、i’does not name a type等错误。 于是本人把所…

[GXYCTF2019]BabyUpload

思路&#xff1a;先测试是否对文件名后缀检测 1,上传一个php文件 上传内容&#xff1a; GIF89a <?php eval($_POST["cmd"]);?>失败&#xff1a; 2&#xff0c;尝试上传其它类型的文件 构造%00截断的.jpg结尾尝试上传&#xff1a; 再次被拦截&#xff1a; …

摸鱼也可以效率翻倍:Python 统计 gitlab 代码量,定量统计发给领导

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 一、确定需求 需求是公司大领导想要了解每周研发提交的代码量。 因为研发人员比较多&#xff0c; 想着用 python 做个自动化&#xff0c; 定时统计代码量并发送邮件给领导。 二、统计gitlab代码 首先安装第三方库python-gitlab&…

Hadoop基础介绍

Hadoop基础介绍一、总体介绍二、HDFS架构三、MapReduce结构四、YARN架构一、总体介绍 1、定义&#xff1a; 是一个开源的、可靠的、可扩展的分布式计算框架。 2、用途&#xff1a; &#xff08;1&#xff09;数据仓库 &#xff08;2&#xff09;PB级别数据的存储与处理。 3…

JetpackCompose从入门到实战学习笔记13——Compose中实现简单瀑布流

JetpackCompose从入门到实战学习笔记13——Compose中实现简单瀑布流 文章目录JetpackCompose从入门到实战学习笔记13——Compose中实现简单瀑布流1.简介&#xff1a;2.竖向的StaggeredGrid参数&#xff1a;3.简单使用如下&#xff1a;4.竖向瀑布流效果如下&#xff1a;5.横向的…

基于html+css的内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Solon v2.2.7 发布,支持 Java 20

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。也是一个有自己接口标准规范的开放生态。 150来个生态插件&#xff0c;覆盖各种不同的应用开发场景&#xff1a; 相对于 Spring Boot 和 Spring Cloud 的项目&#xff1a; 启动快 5 &#xff5e; 10 倍…

MLSkin 5.3 for delphi Crack

MLSkin 是Delphi下面的一款皮肤组件&#xff0c;是基于Delphi标准组件继承而来&#xff0c;扩展了很多实用的属性功能供开发者调用&#xff1b;在使用上和标准的VCL组件相差不大&#xff0c;但显示风格却大不一样&#xff0c;可以很轻松地实现像QQ皮肤那样的效果&#xff0c;想…

镜头光学指标介绍----清晰度SFR

目录 简介 常用单位 lp/mm&#xff08;line-pairs/mm&#xff09; Cycle / pixel LW/PH&#xff08;line widths/ picture height) 转换关系 MTF MTF概念 MTF50&#xff0c;MTF50P SFR的计算方法 参考资料&#xff1a; 简介 在镜头选型或者对比中&…

【从零开始学习 UVM】10.2、UVM TLM —— UVM TLM Blocking Put Port

文章目录 UVM TLM Port Example1. 创建一个发送器类,其端口类型为 uvm_blocking_put_port2. 创建一个接收器类,实现 put 方法。3. 在更高层次上连接端口及其实现Put Port 阻塞行为任何组件都可以通过 TLM put port向另一个组件发送事务。接收组件应该定义 put port的实现。这…

【CSAPP】进程 | 上下文切换 | 用户视角下的并发进程

&#x1f4ad; 写在前面&#xff1a;本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O 的 进程部分。CSAPP 是计算机科学经典教材《Computer Systems: A Programmers Perspective》的缩写&#xff0c;该教材由Randal E. Bryant和David R. OHallaron 合著…

流量整形(GTS和LR)

Generic Traffic Shaping通用流量整形 通用流量整形(简称GTS)可以对不规则或不符合预定流量特性的流量进行整形,以保证网络上下游之间的带宽匹配,避免拥塞发生。 GTS与CAR一样,都采用了令牌桶技术来控制流量。GTS与CAR的主要区别在于:利用CAR进行报文流量控制时,…

蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)

文章目录零、吐槽一、关于自创模板&#xff0c;和自写模板库的问题二、关于 详解A/D、D/A、PCF8591 这篇文章一些小错误三、模板最终版本main.cds1302.conewire.honewire.ciic.hiic.c附、第十四届蓝桥杯单片机赛题零、吐槽 今年是矩阵键盘三个协议一起调用啊。真是一年比一年难…

免费CRM如何进行选择?

如今CRM领域成为炙手可热的赛道&#xff0c;很多CRM系统厂商甚至打出完全免费的口号&#xff0c;是否真的存在完全免费的crm系统&#xff1f;很多企业在免费使用过程中会出现被迫终止的问题&#xff0c;需要花费高价钱才能继续使用&#xff0c;那么&#xff0c;免费crm系统哪个…

用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~

目录 一、介绍 二、使用方法 三、其他实例 1.正则表达式 2.自动化测试脚本 3.聊聊技术 一、介绍 Cursor主要功能是根据用户的描述写代码或者进行对话&#xff0c;对话的范围仅限技术方面。优点是不用翻墙、不需要账号。Cursor基于GPT模型&#xff0c;具体什么版本不祥&#…

【视频分割】【深度学习】MiVOS官方Pytorch代码-S2M模块DeepLavV3Plus网络解析

【视频分割】【深度学习】MiVOS官方Pytorch代码-S2M模块DeepLavV3Plus网络解析 MiVOS模型将交互到掩码和掩码传播分离&#xff0c;从而实现更高的泛化性和更好的性能。单独训练的交互模块将用户交互转换为对象掩码&#xff0c;本博客将讲解S2M(用户交互产生分割图)模块的深度网…
最新文章