深度学习 logistic regression
我也是在进行一些学习然后找了一些网络上的例子,具体的大佬们的博客连接我会在最后放上链接。
-
logistic regression定义
逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。例如,估算肿瘤的可能性,录取的可能性。
-
logistic regression的一般过程
- 收集数据:任意方法收集数据
- 准备数据:数据类型为数值类型(结构化数据格式最佳)
- 分析数据:任意方法对数据进行分析
- 训练算法:找到最佳的分类回归系数
- 测试算法
- 主算法
-
Hypothesis function 假设函数
g ( z ) = 1 / ( 1 + e − z ) ( 1 ) g(z)=1/(1+e^{-z}) (1) g(z)=1/(1+e−z)(1)
从公式(1)看如果𝑧非常大那么 e − z e^{-z} e−z将会接近于 0,关于𝑧的 sigmoid 函数将会近似等于 1 除 以 1 加上某个非常接近于 0 的项,因为𝑒 的指数如果是个绝对值很大的负数的话,这项将会 接近于 0,所以如果𝑧很大的话那么关于𝑧的sigmoid 函数会非常接近 1。相反地,如果𝑧非常 小或者说是一个绝对值很大的负数,那么关于 e − z e^{-z} e−z会变成一个很大的数,你可以认为这 是 1 除以 1 加上一个非常非常大的数,所以这个就接近于 0。因此当实现逻辑回归时,让机器学习参数𝑤以及𝑏这样才使得 y Λ = w T + b y\Lambda=w^{T}+b yΛ=wT+b成为对𝑦 = 1这一情况的概率的一个很好的估计。因为 g ( z ) g(z) g(z)的图像如下图1.1所示,是一个S形的,取值在[0,1]之间。 图1.1
所以在逻辑回归算法中假设:
h θ = g ( θ x ) h_\theta=g(\theta x) hθ=g(θx), g ( z ) = 1 / ( 1 + e − z ) g(z)=1/(1+e^{-z}) g(z)=1/(1+e−z)其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dV9ZbI6-1619577209055)(https://www.zhihu.com/equation?tex=x)] 是我们的输入, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FQqLy7R-1619577209063)(https://www.zhihu.com/equation?tex=%5Ctheta)] 为我们要求取的参数。因此,就会有有一个参数向量 θ 0 , θ 1 , θ 2 , . . . , θ n \theta_0,\theta_1,\theta_2,...,\theta_n θ0,θ1,θ2,...,θn,这样 θ 0 \theta_0 θ0就充当了𝑏,这是一个实数,而剩下的 θ 1 \theta_1 θ1 到 θ n \theta_n θn直到 充当了 ω \omega ω。
-
cost function
损失函数又叫做误差函数,用来衡量算法的运行情况。Loss function:𝐿(𝑦^ , 𝑦)。通过损失函数,来衡量预测输出值和实际值有多接近。一般用预测值和实际值的平方差或者是它们平方差的一半,但是通常在逻辑回归中不这么做,因为当在学习逻辑回归参数的时候,会发现的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是逻辑回归模型中会定义另外一个损失函数:
L ( y Λ , y ) = − y log ( y Λ ) − ( 1 − y ) log ( 1 − y Λ ) L(y\Lambda,y)=-y\log(y\Lambda)-(1-y)\log(1-y\Lambda) L(yΛ,y)=−ylog(yΛ)−(1−y)log(1−yΛ)
对于这个逻辑回归损失函数,当𝑦 = 1时损失函数𝐿 = −log(𝑦^), 如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能大,因为 sigmoid 函数取值[0,1],所 以𝑦^会无限接近于 1。 当𝑦 = 0时损失函数𝐿 = −log(1 − 𝑦^), 如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能小,因为 sigmoid 函数取值[0,1],所 以𝑦^会无限接近于 0。因为目的是让损失函数尽可能小,所以如果𝑦等于 1,我们就尽可能让𝑦^变 大,如果𝑦等于 0,我们就尽可能让 𝑦^ 变小。对于多个向量样本的代价函数,需要这样定以:
J ( w , b ) = 1 / m ∑ i = 1 m L ( y Λ ( i ) − ( 1 − y ( i ) ) log ( 1 − y Λ ( i ) ) ) J(w,b)=1/m\sum^{m}_{i=1}L(y\Lambda^{(i)}-(1-y^{(i)})\log(1-y\Lambda^{(i)})) J(w,b)=1/mi=1∑mL(yΛ(i)−(1−y(i))log(1−yΛ(i))) 损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价,所以在训练逻 辑回归模型时候,我们需要找到合适的𝑤和𝑏,来让代价函数 𝐽 的总代价降到最低。
-
梯度下降法(Gradient Descent)
在测试集上,通过最小化代价函数(成本函数)𝐽(𝑤, 𝑏)来训练的参数𝑤和b。通过不同方向不同梯度对代价函数进行不断的迭代寻找最小的值。这就是梯度下降法所实现的意义。
logistic regression 的代码实现以及运行效果(对于学生是否能考进大学用成绩做一个分类的逻辑回归的小项目 具体内容请看这里https://blog.csdn.net/Arthur_Holmes/article/details/98962345)
- 对数据进行处理,处理成结构化的数据
def get_X(df): #获取特征,并添加x0列向量(全为1) ones = pd.DataFrame({'ones':np.ones(df.shape[0])}) #按axis=1即列合并连接 data=pd.concat([ones,df],axis=1) #按相对位置,获取全部特征值数据(用values是为了得到 np.array) return data.iloc[:,:-1].values
- 处理标签值,生成array数组
def get_y(df): #读取标签值 return np.array(df.iloc[:,-1]) #数据处理转换数组
- 数据归一化处理
def normalize_feature(df): #数据归一化处理 return df.apply(lambda colum:(colum-colum.mean())/colum.std())
- 实现sigmoid函数
def sigmoid(z): #实现sigmoid函数 return 1/(1+np.exp(-z))
- 实现代价函数
def cost(theta,X,y): #实现cost function first=np.multiply(-y,np.log(sigmoid(X.dot(theta.T)))) second=np.multiply((1-y),np.log(1-sigmoid(X.dot(theta.T)))) return np.sum(first-second)
- 求梯度
def gradient (theta,X,y): #求梯度 return X.T @(sigmoid(X @ theta)-y)/len(X)
- 进行梯度下降拟合求参数
ef gradientDescennt(theta,X,y,alpha,iters): #梯度下降拟合参数 costs=np.zeros(iters) temp=np.ones(theta) #进行迭代 for i in range(iters): temp = theta-alpha*gradient(theta,X,y) theta=temp costs[i]=cost(theta,X,y) return theta,costs
- 预测数据
def predict(X,theta): return (sigmoid(X @ theta.T)>=0.5).astype(int)#实现变量类型转换
- 主函数
if __name__=='__main__': path='datasets/data2wuenda' data=pd.read_csv(path,header=None,names=['exam1','exam2','admitted']) X=get_X(data) y=get_y(data) theta=np.zeros(X.shape[1])#返回numpy array 类型 一行三列 #调用高级的拟合参数,可以试着梯度下降 res = opt.minimize(fun=cost, x0=theta, args=(X, y), jac=gradient, method='Newton-CG') print("res=",res) theta_res = res.x#获取拟合的θ参数 y_pred=predict(X,theta_res) print("classification_report(y,y_pred)\n",classification_report(y,y_pred)) #theta_res,costs = gradientDescennt(theta,X,y,0.00001,500000) #先绘制原来的数据 positive = data[data['admitted']==1]#挑选出录取的数据 negative = data[data['admitted']==0]#挑选出未被选择的数据 fig,ax = plt.subplots(figsize=(10,5))#获取绘图对象 # # 对录取的数据根据两次考试成绩绘制散点图 ax.scatter(positive['exam1'], positive['exam2'], s=30, c='b', marker='o', label='Admitted') # 对未被录取的数据根据两次考试成绩绘制散点图 ax.scatter(negative['exam1'], negative['exam2'], s=30, c='r', marker='x', label='Not Admitted') #添加图例 ax.legend() #设置x,y轴的名称 ax.set_xlable=('Exam1 Score') ax.set_ylable=('Exam2 score') plt.title("fitted curve vs sample") #绘制决策边界 # print("theta_res = ",theta_res) exam_x=np.arange(X[:,1].min(),X[:,1].max(),0.01) theta_res = -theta_res/theta_res[2] #获取函数系数θ_0/θ_2 θ_0/θ_2 #print(theta_res) exam_y = theta_res[0]+theta_res[1]*exam_x plt.plot(exam_x,exam_y) plt.show()
- 运行效果,如图1.2所示
图1.2
- 运行报告如图1.3所示,
-
图1.3
蒙特卡罗算法
蒙特卡罗算法定义
蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种概率算法(随机模拟方法),以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。因为是随机算法所以在采样不全时,通常不能保证找到最优解。因此,采样越多,越近似最优解。
蒙特卡洛法求解实际问题的基本步骤
-
描述或构造概率过程:对于已有的随机性质问题可描述和模拟这个概率过程,对于不具有随机性质的确定性问题,需要人为地构造一个概率过程。
-
利用概率分布抽样:通过计算机产生已知概率分布的随机变量,常用的概率分布有均匀分布,正态分布、指数分布、泊松分布等。
-
建立各种估计量:构造了随机概率模型,并从中抽样后,就要确定一个随机变量,作为所要求问题的解。一般是把 次随机抽样结果的算术平均值作为解的近似值
蒙特卡洛法求解,具体实例实现
-
问题:经典的蒙特卡洛方法求圆周率
-
基本思想:在图中区域产生足够多的随机数点,计算落在圆内的点的个数与总个数的比值再乘以四,就是圆周率。
-
总结:蒙特卡洛算法就是随机的产生足够多的点,然后根据产生的点落入所求的区域,以及已知的区域的个数,构建概率。实际问题概率 = 求解区/已知区
-
代码实现:
import math
import random
Mon=input("输入较大整数!")#产生大量随机点
Start=0
for i in range(int(Mon)):
X=random.random() #利用random()产生随机数或者是伪随机数
Y=random.random()
if math.sqrt(X**2+Y**2)<1:#判断产生的随机点是否落在单位圆内
Start=Start+1
pi=4*Start/int(Mon)
print(pi)
-
蒙特卡洛法常用的例子
积分的计算,交通堵塞,产品厚度,证券市场。
2)<1:#判断产生的随机点是否落在单位圆内
Start=Start+1
pi=4*Start/int(Mon)
print(pi)
``
图1.4 pi的运行效果
-
蒙特卡洛法常用的例子
积分的计算,交通堵塞,产品厚度,证券市场。