美文网首页
逻辑回归与梯度下降Demo

逻辑回归与梯度下降Demo

作者: 唯师默蓝 | 来源:发表于2019-03-29 00:30 被阅读0次
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings("ignore")
    f = open('C:\\Users\\admin\\Desktop\\梯度下降\\data\\LogiReg_data.txt')
    # header = None, csv文件中第一行是列名,不是数据
    # names = [],自己设置列名
    pdData = pd.read_csv(f, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
    # 输出文件的前五行
    print(pdData.head())
    # 输出数据的维度 (100,3) 2维:100表示数据个数有100个,3表示每个样本有3列
    print(pdData.shape)
    
    # 指定正例,样本数据中,若Admitted列为1,则为positive
    positive = pdData[pdData['Admitted'] == 1]
    # 指定负例,样本数据中,若Admitted列为0,则为negative
    negative = pdData[pdData['Admitted'] == 0]
    
    # figsize:指定画图的大小,长 10和宽 5
    # 建立一个fig对象,建立一个axis对象
    fig,ax=plt.subplots(figsize=(10,5))
    
    #scatter:画散点图,label:标签,c:颜色(b蓝色,r红色),marker:散点图中点的样子
    ax.scatter(positive["Exam 1"],positive["Exam 2"],s=30,c='b',marker='o',label='Admitted')
    ax.scatter(negative["Exam 1"],negative["Exam 2"],s=30,c='r',marker='x',label='Not Admitted')
    ax.legend()
    # 设置横坐标下的文本
    ax.set_xlabel("Exam 1 Score")
    # 设置纵坐标旁的文本
    ax.set_ylabel("Exam 2 Score")
    # plt.show()
    
    def sigmoid(z):
        return 1 / (1 + np.exp(-z))
    
    #创建一个包含20个等间距值-10到10的向量
    nums = np.arange(-10, 10, step=1)
    fig, ax = plt.subplots(figsize=(12,4))
    ax.plot(nums, sigmoid(nums), 'r')
    # plt.show()
    
    # 预测函数,矩阵相乘
    def model(X, theta):
        return sigmoid(np.dot(X, theta.T))
    
    # 在 dataFrames 中新增加一列,这一列的值全为 1
    pdData.insert(0, 'Ones', 1)
    
    # 将数据的 Pandas表示转换为可用于进一步计算的数组
    orig_data = pdData.as_matrix()
    cols = orig_data.shape[1]
    X = orig_data[:,0:cols-1]
    y = orig_data[:,cols-1:cols]
    
    # 构造 一行三列 的theta参数
    theta = np.zeros([1, 3])
    
    # 定义损失函数 , 对数似然函数去负号
    # left: 输入 x 和 theta , 求sigmoid值 得 a -> 求 a 的对数值,得 b -> 与 y 相乘
    # right: 输入 x 和 theta , 求sigmoid值 得 a -> 求 1 - a 的对数值,得 b -> 与 1 - y 相乘
    # 损失函数的值 -> 平均损失值 : sum(left - right)/x的数量
    def cost(X, y, theta):
        left = np.multiply(-y, np.log(model(X, theta)))
        right = np.multiply(1 - y, np.log(1 - model(X, theta)))
        return np.sum(left - right) / (len(X))
    print(cost(X, y, theta))
    
    # 计算梯度
    # 对theta求偏导
    def gradient(X, y, theta):
        # 占位:设置梯度的大小,和theta的维度是一样的
        grad = np.zeros(theta.shape)
        # ravel()扁平化操作,把多维数组变成一维数组
        error = (model(X, theta) - y).ravel()
        for j in range(len(theta.ravel())):  # for each parmeter
            # X[:,j]  冒号代表全体样本,j取第j列
            term = np.multiply(error, X[:, j])
            # 算最终值 求和再除以个数
            grad[0, j] = np.sum(term) / len(X)
        return grad
    

    相关文章

      网友评论

          本文标题:逻辑回归与梯度下降Demo

          本文链接:https://www.haomeiwen.com/subject/whxkbqtx.html