编程作业2.1:Logistic regression

摘要:
2.西格玛函数首先回顾了逻辑回归的假设函数:[h_{heta}left=gleft=frac{1}{1+e^{-heta^Tx}}],称为西格玛或逻辑函数:[g=frac}{1+e{-z}]defsigmoid:return1/x1=np。范围plt。plotplt。show()3.成本函数逻辑回归的成本函数如下:[J=frac1msum_{i=1}^mleft][h_{heta}left=gleft]#定义成本函数defcost:first=(-y)*np。log#注意,这里的θ是列向量second=(1-y)*Np。logreturnnp。意思是#addaones列,这会使矩阵的多重应用程序工作成为一个“一”。簇:数据。insert#setXandy#使用。iloc获取列X=数据。iloc[:,:-1]。values#转换帧点Numpy数组表示。y=数据。iloc[:,-1]。values#ReturnisNOTaNumpy矩阵,rat,aNumpy数组。θ=np。zero#X.shape[1]获取X的列数,其中θ是列向量检查矩阵的维度:X.shape,θ。shape计算成本函数的初始值:cost接下来,我们需要一个函数来计算训练数据、标签和一些参数的梯度,即。

题目

在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学。假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取。你有以前申请人的历史数据,可以将其用作逻辑回归训练集。对于每一个训练样本,你有申请人两次测评的分数以及录取的结果。为了完成这个预测任务,我们准备构建一个可以基于两次测试评分来评估录取可能性的分类模型。

编程实现

1.Visualizing the data

在开始实现任何学习算法之前,如果可能的话,最好将数据可视化。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


data = pd.read_csv('D:BaiduNetdiskDownloaddata_setsex2data1.txt', names=['exam1', 'exam2', 'admitted'])
data.head()

编程作业2.1:Logistic regression第1张

# 把数据分成 positive 和 negetive 两类
positive = data[data.admitted.isin(['1'])]  # admitted=1 为 positive 类
negetive = data[data.admitted.isin(['0'])]  # admitted=0 为 negetive 类

fig, ax = plt.subplots(figsize=(8,7))
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')
ax.scatter(negetive['exam1'], negetive['exam2'], s=50, c='r', marker='x', label='Not Admitted') # s 设置点的大小;marker 设置画图的形状


#设置图例在右上角
# ax.legend(loc=1) 


# 设置图例显示在图的上方
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width , box.height* 0.8])
ax.legend(loc='center left', bbox_to_anchor=(0.2, 1.12),ncol=3)


# 设置横纵坐标名
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()

编程作业2.1:Logistic regression第2张
可以看到在两类间,有一个清晰的决策边界。现在我们需要实现逻辑回归,那样就可以训练一个模型来预测结果。

2.Sigmoid function

首先来回顾下 logistic 回归的假设函数:

[h_{ heta}left(x ight)=gleft( heta^T x ight)=frac{1}{1+e^{- heta^T x } } ]

( heta^T x = z),其中,(g(z)) 被称为 Sigmoid function (S型函数)或 Logistic function:

[g(z)=frac{1}{1+e^{-z}} ]
def sigmoid(z):
    return 1 / (1 + np.exp(- z))
    
x1 = np.arange(-10, 10, 0.1)
plt.plot(x1, sigmoid(x1), c='r')
plt.show()

编程作业2.1:Logistic regression第3张

3.Cost function

逻辑回归的代价函数如下:

[J( heta)=frac1m sum_{i=1}^m left( - y^{left(i ight)} log left( h_ heta left( x^{left( i ight)} ight) ight) - left( 1-y^{left( i ight)} ight) log left( 1- h_ heta left( x^{left( i ight)} ight) ight) ight) ]
[h_{ heta}left(x ight)=gleft( heta^T x ight) ]
# 定义代价函数(能够返回代价函数值)
def cost(theta, X, y):
    first = (-y) * np.log(sigmoid(X @ theta)) # 注意这里的 theta 是列向量
    second = (1 - y)*np.log(1 - sigmoid(X @ theta))
    return np.mean(first - second)
# add a ones column - this makes the matrix multiplication work out easier
if 'Ones' not in data.columns:
    data.insert(0, 'Ones', 1)

# set X (training data) and y (target variable)
# 用.iloc来取列
X = data.iloc[:, :-1].values  # Convert the frame to its Numpy-array representation.
y = data.iloc[:, -1].values  # Return is NOT a Numpy-matrix, rather, a Numpy-array.

theta = np.zeros(X.shape[1]) # X.shape[1]获取X的列数,这里theta是列向量

检查矩阵的维度:

X.shape, theta.shape, y.shape

编程作业2.1:Logistic regression第4张

计算代价函数的初始值:

cost(theta, X, y)

编程作业2.1:Logistic regression第5张

接下来,我们需要一个函数来计算我们的训练数据、标签和一些参数thate的梯度。

4.Gradient

计算梯度值:

[frac{partial }{partial heta_j} J( heta)=frac1m sum_{i=1}^m left( h_ heta left( x^{ left(i ight) } ight) -y{ left(i ight) } ight) x_{j}^{left(i ight)} ]

转化为向量化计算:

[frac1m X^Tleft( sigmoidleft( X heta ight)-y ight) ]

在此题中 ,(X) 是100*3的矩阵, (X^T) 就是3*100的矩阵。( heta) 是3*1的矩阵,则最后求得的梯度值是一个3*1的矩阵。

# 定义计算梯度值(导数值)
def gradient(theta, X, y):
    return (X.T @ (sigmoid(X @ theta) - y))/len(X)  
# the gradient of the cost is a vector of the same length as θ where the jth element (for j = 0, 1, . . . , n)

计算梯度值的初始数据:

gradient(theta, X, y)

编程作业2.1:Logistic regression第6张

注意,我们还没有在执行梯度下降算法,这里仅仅在计算梯度值。

5.Learning θ parameters

  • 在视频中,一个称为“fminunc”的Octave函数是用来优化函数来计算成本和梯度参数。
  • 由于我们使用Python,我们可以用SciPy的“optimize”命名空间来做同样的事情。
    这里我们使用的是高级优化算法,运行速度通常远远超过梯度下降。方便快捷。
    只需传入cost函数,已经所求的变量theta,和梯度。注意:cost函数定义变量时变量theta要放在第一个,若cost函数只返回cost,则设置fprime=gradient。
import scipy.optimize as opt

# 这里使用fimin_tnc方法来拟合
result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))

result

编程作业2.1:Logistic regression第7张

计算优化算法之后的代价值函数值:

cost(result[0], X, y)

编程作业2.1:Logistic regression第8张

6.Evaluating logistic regression

  • 学习好了参数(θ)后,我们来用这个模型预测某个学生是否能被录取。
  • 接下来,我们需要编写一个函数,用我们所学的参数( heta)来为数据集(X)输出预测。然后,我们可以使用这个函数来给我们的分类器的训练精度打分。
  • 逻辑回归模型的假设函数:
[h_{ heta}left(x ight)=frac{1}{1+e^{- heta^T x } } ]
  • ({h}_{ heta })大于等于0.5时,预测 y=1
  • ({h}_{ heta })小于0.5时,预测 y=0
def predict(theta, X):
    probability = sigmoid(X @ theta)
    return [1 if x >= 0.5 else 0 for x in probability]  # return a list
final_theta = result[0]
predictions = predict(final_theta, X)
correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]
accuracy = sum(correct) / len(X)
accuracy

编程作业2.1:Logistic regression第9张

可以看到预测精度达到了89%。

7.Decision boundary(决策边界)

决策边界:

[ heta^T x=0 ]

此题中决策边界为:

[ heta_0+ heta_1x_1+ heta_2x_2=0 ]
x1 = np.arange(130, step=0.1)
x2 = -(final_theta[0] + x1*final_theta[1]) / final_theta[2]


fig, ax = plt.subplots(figsize=(8,5))
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')
ax.scatter(negetive['exam1'], negetive['exam2'], s=50, c='r', marker='x', label='Not Admitted')
ax.plot(x1, x2)
ax.set_xlim(0, 130)
ax.set_ylim(0, 130)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_title('Decision Boundary')
plt.show()

编程作业2.1:Logistic regression第10张

总结

逻辑回归的实现需要自己编写计算cost和gradient的函数,然后通过高级的优化算法就可以得到theta的最优解,不需要自己手动编写梯度下降函数。高级的优化算法不需要手动选择学习率α,收敛的速度远远快于梯度下降,但是要比梯度下降复杂。线性回归可以使用高级优化算法吗?明天试一下。

免责声明:文章转载自《编程作业2.1:Logistic regression》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇简单的JAVAWeb选课系统hibernate的各个jar包的作用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Map的深浅拷贝的探究

detailsmap.get:"");}}}查看输出:可以看到通过“=”复制的map内容随源map的改变而改变,而通过putAll方法和Iterator复制的map则不受源map改变的影响。如示例中的三种拷贝方法:针对map中的数据为统一的、简单的基本数据类型,当拷贝的数据通过“=”复制map的方法为浅拷贝,putAll方法为深拷贝,iterator遍历添加...

canvas基础绘制矩形(1)

1.画布基础知识画布元素是HTML5中添加的一个重要元素,专门用于绘制图形。然而,画布本身不具备绘制图形的能力。将画布元素放置在页面上相当于在页面上放置矩形“画布”。我们可以使用js脚本在“画布”上绘制图形。...

华为 HG526 破解实录(一)Cfg文件加解密工具

几天前,我去中国电信安装E169软件包,并发送了一个华为HG526无线路由猫和一个中兴xxx网络机顶盒(尚未开始制造麻烦)。当然,无线路由猫一如既往地被阉割了。搜索之后,我开始了我的快攻之旅。1.打开catdrop管理页面,使用telecomadmin和nE7jA%5m登录;2.将U盘插入猫。3.开放式管理=˃设备管理、备份配置。4.打开U盘,放下ctce8...

echarts折线图 鼠标移入改变小点显示样式

=undefined){res+=nameList[i].seriesName+':'+nameList[i].data+'%'+''}}res=res.split;returnres[0]+''+res[1];}}echarts折线图的鼠标移动上去小点显示样式修改tooltip:{trigger:'axis',formatter:function{varr...

vue 获取元素高度

1、html2、JavaScript//获取高度值(内容高+padding+边框)letheight=this.$refs.getheight.offsetHeight;//获取元素样式值(存在单位)letheight=window.getComputedStyle(this.$refs.getheight).height;//获...

戴尔服务器R740-iDRAC管理卡远程安装系统

Dell服务器R740 iDRAC管理卡安装系统1.方案部署:1.服务器配置名称配置备注CPU 2核心内存128GSwap=128G硬盘2T*8RAID5=12T II。设置iDRAC管理卡地址和连接:iDRAC功能默认关闭,需要在BIOS中启用。由于这是一项测试,默认情况下使用浏览器(Google浏览器)访问iDRAC管理地址,Calvin可以在此处设置新...