吴恩达机器学习课后习题(逻辑回归)

一、逻辑回归

逻辑回归主要用于分类问题,有正负值用0与1表示,根据数据集计算出参数向量,并画出决策边界,计算预测值准确率,并用可以对新数据集进行预测。

二、实现逻辑回归

导入数据包,实现逻辑回归时,可以使用梯度下降算法,也可以直接使用高级优化算法(共轭梯度法),更加简便。使用高级优化算法可以自动选择学习率。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as opt #在cmd中输入pip install scipy命令安装

读取文件数据,注意header=None后自定义names属性,不会丢失第一行数据。

path = "E:\\pyCharm\\workspace\\ex2_Andrew\\ex2data1.txt"
data = pd.read_csv(path,header=None,names=['Exam 1','Exam 2','Admitted'])
print(data.head())

分类别找到两组数据,一组为结果为1的数据集,一组为结果为0的数据集。

positive = data[data['Admitted'].isin([1])] #isin函数,用于查看某列中是否包含某个字符串,返回值为布尔
negative = data[data['Admitted'].isin([0])]

设计代价函数。逻辑回归中使用sigmoid函数作为假设函数(线性回归中使用线性函数),代价函数与线性回归不同,根据公式编写代码即可。

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

def computeCost(theta,X,y): #逻辑回归代价函数
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    first = np.multiply(y,np.log(sigmoid(X*theta.T)))
    second = np.multiply((1-y),np.log(1-sigmoid(X*theta.T)))
    return -(np.sum(first+second)/(len(X)))

初始化工作,与线性回归相同,需要加一列值为1的数据,用于和theta[0]相乘,使用iloc函数分割数据集为X(属性)与y(结果1/0),初始化theta为0向量并计算初始代价。

data.insert(0,'Ones',1)
cols = data.shape[1]
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
theta = np.zeros(3)
X = np.matrix(X.values)
y = np.matrix(y.values)
print("计算初始代价:")
print(computeCost(theta,X,y))

使用高级优化算法,需要先对梯度进行计算(此处使用函数名为gredientDecent,其实这个函数并没有下降theta的作用),循环次数为theta值的个数,计算出的就是每个theta值对应的梯度(代价函数的导数),计算后返回计算出的梯度向量。
使用高级算法fmin_tnc可以直接算出可以拟合数据的theta值,返回赋值给result变量。

def gredientDecent(theta,X,y): #仅对theta矩阵的各个参数计算梯度,并未下降theta,返回下降算法后的梯度
    X = np.matrix(X)
    y = np.matrix(y)
    theta = np.matrix(theta)
    parameters = int(theta.ravel().shape[1])
    grad = np.zeros(parameters)
    error = sigmoid(X*theta.T)-y
    for i in range(parameters):
        term = np.multiply(error,X[:,i])
        grad[i] = np.sum(term)/len(X)
    return grad

result = opt.fmin_tnc(func=computeCost,x0=theta,fprime=gredientDecent,args=(X,y)) #高级优化算法
print("返回高级算法的result:")
print(result)
print("计算合适theta值后的代价为:")
print(computeCost(result[0], X, y))

画出数据集的散点图,并根据计算出的theta向量画出决策曲线。

plotting_x1 = np.linspace(30,100,100) #构造等差数列,在30到100分之间,分隔100份
plotting_h1 = ( - result[0][0] - result[0][1] * plotting_x1) / result[0][2]
#根据h1公式计算,-(theta[0]+theta[1]*x)/theta[2],此公式可以得到散点图的决策边界,是提前给的

fig, ax = plt.subplots(figsize=(8,6))
ax.plot(plotting_x1, plotting_h1, 'y', label='Prediction')
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()

进行对新数据的预测。hfunc1函数用于简单预测新数据集的结果,注意hfunc1函数的两个参数必须都是matrix矩阵才可以正确运行,故需要将想要预测的数据pre与result[0]都变为矩阵,才可以调用hfunc1函数。(也可以在sigmoid函数的参数中使用np.dot()函数,意味向量点乘,传入一个整数)

def hfunc1(theta, X):
    return sigmoid(X*theta.T)
pre = [1,45,85]
pre = np.matrix(pre)
the = np.matrix(result[0])
print("该同学通过的概率为:",hfunc1(the,pre))

预测正确率。probability被赋值为使用sigmoid函数计算的所有结果,数值均在0-1之间。
correct则记录的是预测的值是否与已有数据集的真实值相同,算出accuracy即为准确率。

def predict(theta, X):
    probability = sigmoid(X * theta.T) #theta为1*3,X为100*3,theta.T为3*1矩阵
    return [1 if x >= 0.5 else 0 for x in probability]

theta_min = np.matrix(result[0])
predictions = predict(theta_min, X) #此函数theta_min为1*3的矩阵,X必须在之前设置为array或matrix,否则dataframe不可用,为100*3
correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]
accuracy = (sum(map(int, correct)) % len(correct))
print ('accuracy = {0}%'.format(accuracy))

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值