python实现吴恩达机器学习练习2(逻辑回归)-data1

这篇是第一个数据集:这部分练习中,你将建立一个预测学生是否被大学录取的逻辑回归模型。

假如一所大学会每个报名学生进行两项入学考试,根据两项考试成绩决定是否录取。我们的任务是根据以往100名学生的考试成绩和录取与否的数据进行训练,编码一个学生是否录取的分类器模型。

参考链接:https://blog.csdn.net/Cowry5/article/details/80247569

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

data1 = pd.read_csv('D:/Python/exercise/samples/AndrewNg/ex2/ex2data1.csv', names = ['x1','x2','y'])

len(data1)

100

1 Logistic Regression

1.1 visualizing the data

#散点图做法,有两种点,所以把每类点的数据分开,分别同一张图上画

positive = data1[data1['y'] == 1]

negative = data1[data1['y'] == 0]

positive_x1 = positive.loc[:,'x1']

negative_x2 = negative.loc[:,'x2']

positive_x2 = positive.loc[:,'x2']

negative_x1 = negative.loc[:,'x1']

plt.figure(figsize= (7,7))

plt.scatter(x = positive_x1, y = positive_x2, marker = 'x', color = 'r', label = 'positive')

plt.scatter(x = negative_x1, y = negative_x2, marker = 'o', color = 'b', label = 'negative')

plt.legend()

data1['intercept'] = 1 # 插入一列x0=1

data1 = data1.reindex(columns = ['intercept', 'x1', 'x2', 'y'])

X_ori = data1.iloc[: ,: 3].values

y_ori = data1.iloc[: ,-1].values

1.2 implementation

1.2.1 sigmoid function

定义 Sigmoid函数:

hθ(x)=g(θTx)hθ(x)=g(θTx)h_{\theta}(x)=g(\theta^{T}x)hθ​(x)=g(θTx)

令z=θTx令z=θTx令z=\theta^{T}x令z=θTx

∴sigmoid(x)=11+e−θTx⟹g(z)=11+e−z∴sigmoid(x)=11+e−θTx⟹g(z)=11+e−z\therefore sigmoid(x)=\frac{1}{1+e^{-\theta^{T}x}}\Longrightarrow g(z)=\frac{1}{1+e^{-z}}∴sigmoid(x)=1+e−θTx1​⟹g(z)=1+e−z1​

def sigmoid(z):

g = 1 / (1 + np.exp(-z))

return g

1.2.2 cost function and gradient

定义J(θ)J(θ)J(\theta)J(θ)函数,J(θ)=−1m[∑mi=1y(i)lnhθ(x(i))+(1−y(i))ln(1−hθ(x(i)))]J(θ)=−1m[∑i=1my(i)lnhθ(x(i))+(1−y(i))ln(1−hθ(x(i)))]J(\theta)=-\frac{1}{m}[\sum_{i=1}^my^{(i)}lnh_{\theta}(x^{(i)})+(1-y^{(i)})ln(1-h_{\theta}(x^{(i)})) ]J(θ)=−m1​[i=1∑m​y(i)lnhθ​(x(i))+(1−y(i))ln(1−hθ​(x(i)))]

def J_func(theta, x, y):

cost = -y * np.log(sigmoid(x.dot(theta.T))) - (1-y) * np.log(1-sigmoid(x.dot(theta.T)))

J = cost.mean()

return J

θθ\thetaθ初始值为零

theta_ori = np.zeros(3)

J_func(theta_ori, X_ori, y_ori)

0.6931471805599453

定义梯度gradient,即∂∂θjJ(θ)=1m∑mi=1(hθ(x(i))−y(i))x(i)j∂∂θjJ(θ)=1m∑i=1m(hθ(x(i))−y(i))xj(i)\frac{\partial}{\partial{\theta_j}}J(\theta) = \frac{1}{m}\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}∂θj​∂​J(θ)=m1​i=1∑m​(hθ​(x(i))−y(i))xj(i)​

#参数顺序不能乱

def gradient(theta, x, y):

gra = x.T.dot(sigmoid(x.dot(theta.T))-y) / len(x)

return gra

gradient(theta_ori, X_ori, y_ori)

array([ -0.1 , -12.00921659, -11.26284221])

1.2.3 learning parameters using fmintnc

import scipy.optimize as opt

result_ori = opt.fmin_tnc(func = J_func, x0 = theta_ori, fprime = gradient, args = (X_ori, y_ori))

result_ori[0]

array([-25.16131858, 0.20623159, 0.20147149])

决策边界:θ0+θ1x1+θ2x2=0决策边界:θ0+θ1x1+θ2x2=0决策边界:\theta_0+\theta_1x_1+\theta_2x_2=0决策边界:θ0​+θ1​x1​+θ2​x2​=0

x2=−(θ0+θ1x1)θ2x2=−(θ0+θ1x1)θ2x_2=\frac{-(\theta_0+\theta_1x_1)}{\theta_2}x2​=θ2​−(θ0​+θ1​x1​)​

x1 = np.arange(20,110,1)

x2 = - (result_ori[0][0] + result_ori[0][1] * x1) / result_ori[0][2]

plt.figure(figsize = (7, 7))

plt.plot(x1, x2, label = 'decision boundary') # 决策边界线

plt.scatter(x = positive_x1, y = positive_x2, marker = 'x', color = 'r', label = 'positive')

plt.scatter(x = negative_x1, y = negative_x2, marker = 'o', color = 'b', label = 'negative')

plt.legend()

实验:增加多项式项使决策边界更加拟合

根据吴恩达课程-《the problem of overfitting》

这个公式是:g(θ0+θ1x1+θ2x2+θ3x21+θ4x22+θ5x1x2)g(θ0+θ1x1+θ2x2+θ3x12+θ4x22+θ5x1x2)g(\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\theta_{3}x_{1}^2+\theta_{4}x_{2}^2+\theta_{5}x_{1}x_{2})g(θ0​+θ1​x1​+θ2​x2​+θ3​x12​+θ4​x22​+θ5​x1​x2​)

data1['x1^2'] = data1['x1'] ** 2

data1['x2^2'] = data1['x2'] ** 2

data1['x1*x2'] = data1['x1'] * data1['x2']

data1 = data1.reindex(columns = ['intercept', 'x1', 'x2', 'x1^2', 'x2^2', 'x1*x2', 'y'])

data1.head()

intercept

x1

x2

x1^2

x2^2

x1*x2

y

0

1

34.623660

78.024693

1198.797805

6087.852690

2701.500406

0

1

1

30.286711

43.894998

917.284849

1926.770807

1329.435094

0

2

1

35.847409

72.902198

1285.036716

5314.730478

2613.354893

0

3

1

60.182599

86.308552

3621.945269

7449.166166

5194.273015

1

4

1

79.032736

75.344376

6246.173368

5676.775061

5954.672216

1

X = data1.iloc[:,:6]

Y = data1.iloc[:,-1]

X = X.values

Y = Y.values

θθ\thetaθ的初始值用零

theta = np.zeros(6)

theta

array([0., 0., 0., 0., 0., 0.])

def J_func(theta, x, y):

cost = -y * np.log(sigmoid(x.dot(theta.T))) - (1-y) * np.log(1-sigmoid(x.dot(theta.T)))

J = cost.mean()

return J

#这个数等于-ln(0.5)

J_func(theta, X, Y)

0.6931471805599453

gradient(theta, X, Y)

array([-1.00000000e-01, -1.20092166e+01, -1.12628422e+01, -1.13895134e+03,

-1.06939408e+03, -1.09872219e+03])

import scipy.optimize as opt

result = opt.fmin_tnc(func = J_func, x0 = theta, fprime = gradient, args = (X, Y))

D:\ProgramData\lib\site-packages\ipykernel_launcher.py:2: RuntimeWarning: divide by zero encountered in log

D:\ProgramData\lib\site-packages\ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in multiply

result

(array([-1.86643292e-02, -3.75077940e-01, -3.09429907e-01, 1.06962108e-03,

3.50023874e-04, 1.03079001e-02]), 80, 1)

result = result[0]

result_2 = opt.minimize(fun = J_func, x0 = theta, args = (X,Y), method = 'TNC', jac = gradient)

D:\ProgramData\lib\site-packages\ipykernel_launcher.py:2: RuntimeWarning: divide by zero encountered in log

D:\ProgramData\lib\site-packages\ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in multiply

result_2

fun: 0.09302529598313683

jac: array([-4.49764720e-03, 1.75005873e-01, -8.49928704e-01, 4.58961567e+01,

-9.03255063e+01, -2.62541929e+01])

message: 'Converged (|f_n-f_(n-1)| ~= 0)'

nfev: 80

nit: 5

status: 1

success: True

x: array([-1.86643292e-02, -3.75077940e-01, -3.09429907e-01, 1.06962108e-03,

3.50023874e-04, 1.03079001e-02])

画二元多项式的方法,用a,b造一个网格,用c表示a和b的函数值(即c=f(a,b)c=f(a,b)c=f(a,b)c=f(a,b)或 c=f(x1,x2)c=f(x1,x2)c=f(x1,x2)c=f(x1,x2)),相当于用坐标轴的连续点做出x1,x2对应的c的等高线

a = np.arange(20,110,1)

b = np.arange(20,110,1)

xs, ys = np.meshgrid(a,b)

c = result[0] + result[1]*xs + result[2]*ys + result[3]*(xs**2) + result[4]*(ys**2) + result[5]*(xs*ys)

#散点图做法,有两种点,所以把每类点的数据分开,分别同一张图上画

positive = data1[data1['y'] == 1]

negative = data1[data1['y'] == 0]

positive_x1 = positive.loc[:,'x1']

negative_x2 = negative.loc[:,'x2']

positive_x2 = positive.loc[:,'x2']

negative_x1 = negative.loc[:,'x1']

plt.figure(figsize= (15,15))

plt.contour(xs,ys,c,0, label = 'decision boundary') #画出c的等高线,等于0的那条

plt.scatter(x = positive_x1, y = positive_x2, marker = 'x', color = 'r', label = 'positive')

plt.scatter(x = negative_x1, y = negative_x2, label = 'negative')

plt.legend()

曲线分类的效果比线性分类直观上拟合效果更佳

原文链接:https://blog.csdn.net/qq_17541489/article/details/105198647

逻辑回归python sigmoid(z)_python实现吴恩达机器学习练习2(逻辑回归)-data1相关推荐

  1. 逻辑回归python正则化 选择参数_吴恩达机器学习笔记(三)——正则化(Regularization)...

    1.过拟合的问题(Over-fitting) 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为0),但是可能会不能推广到新的数据. (1)下图是一个回归问题 ...

  2. python分类预测降低准确率_python实现吴恩达机器学习练习3(多元分类器和神经网络)...

    Programming Exercise 3: Multi-class Classification and Neural Networks 吴恩达机器学习教程练习3,练习数据是5000个手写数字(0 ...

  3. 吴恩达机器学习作业二——逻辑回归

    有了作业一的铺垫,作业二的代码更容易理解了. 逻辑回归 题目描述:在训练的初始阶段,我们将要构建一个逻辑回归模型来预测,某个学生是否被大学录取.设想你是大学相关部分的管理者,想通过申请学生两次测试的评 ...

  4. 吴恩达机器学习课后习题——逻辑回归

    机器学习课后作业-逻辑回归 逻辑回归 逻辑回归算法,是一种给分类算法,这个算法的实质是:它输出值永远在0到 1 之间. 将要构建一个逻辑回归模型来预测,某个学生是否被大学录取.设想你是大学相关部分的管 ...

  5. 吴恩达机器学习 8.6 逻辑回归(Logistic Regression)

    6.1 分类问题 参考文档: 6 - 1 - Classification (8 min).mkv 在这个以及接下来的几个视频中,开始介绍分类问题. 在分类问题中,你要预测的变量 $y$ 是离散的值, ...

  6. 吴恩达机器学习之线性逻辑回归实现部分

    C++实现 "linear_regression.h" //二分类逻辑回归模型 struct elem_log {double y;double* x; //用数组传入自变量数据( ...

  7. 吴恩达机器学习笔记 —— 7 Logistic回归

    http://www.cnblogs.com/xing901022/p/9332529.html 本章主要讲解了逻辑回归相关的问题,比如什么是分类?逻辑回归如何定义损失函数?逻辑回归如何求最优解?如何 ...

  8. 吴恩达|机器学习作业2.0Logistic 回归

    2.0.Logistic 回归 1)题目: 在本部分的练习中,您将使用Logistic回归模型来预测一个学生是否被大学录取.假设你是大学某个院系的管理员,你想通过申请人在两门考试中的表现来决定每个人的 ...

  9. python 异常检测算法_吴恩达机器学习中文版笔记:异常检测(Anomaly Detection)

    大数据文摘经授权转载 作者:黄海广 在接下来的一系列视频中,我将向大家介绍异常检测(Anomaly detection)问题.这是机器学习算法的一个常见应用.这种算法的一个有趣之处在于:它虽然主要用于 ...

最新文章

  1. NC:王金锋等揭示阴道菌群异位对子宫健康的影响
  2. RHEL7: unbound(DNS server)的简单配置
  3. nginx rewrite 参数和例子
  4. python读取word文档
  5. TCP 三次握手过程详解
  6. 计算机创建快捷方式w10,win10无法创建快捷方式,win10发送快捷方式磁盘满了
  7. 05_HttpClient_模拟登陆
  8. 唏嘘!一代手机OS退场:没生态、没开发者是失败主因
  9. 清华大学计算机学院研究生导师,清华大学计算机科学与技术系研究生导师简介-武永卫...
  10. 如何用JavaScript实现轮播图(幻灯片)的制作
  11. Flash cs4 for mac 序列号
  12. SQL语句-考勤统计表按照年份统计员工每月的加班调休数据
  13. OpenERP的外贸企业ERP方案
  14. php循环26个英文字母,有趣的真人字母操,形象生动容易学,帮孩子瞬间搞定26个英文字母,效果满分!...
  15. Kindle如何带封面传书
  16. 企业微信支付功能怎么开通?
  17. win10如何显示我的电脑在桌面
  18. 最优化方法(学习笔记)-第十一章等式约束优化问题
  19. 2023年音视频开发前景如何?音视频开发需要掌握哪些技术?
  20. c语言函数指针、结构体、枚举实例(详细)解析(快速掌握)

热门文章

  1. netty使用从0到1
  2. sql 计算空间列两地点之间距离
  3. 微信小程序开发视频教程新鲜出炉
  4. WPF 制作圆角按钮
  5. 以后看下try,catch在C#下面的成本
  6. 简单快速开发C\S架构程序用最简单的不分层最快的效率达到功能要求的例子程序FrmKnowledge日积月累功能的实现...
  7. Python 接受输入数字,并求和 (异常,跳出死循环换)
  8. 搭建dubbo项目解决dubbo.xml标签报错的问题
  9. VS2017 Pro未能找到路径“……\bin\roslyn\csc.exe”的解决方案
  10. json loads No JSON object could be decoded 问题解决