LogisticRegression 梯度上升及决策边界代码实现

版权声明:转载请声明转自Juanlyjack https://blog.csdn.net/m0_38088359/article/details/82052263

LogisticRegression

梯度上升及决策边界代码实现
时间原因,暂时先敲这两部分,模型准确率后期完善。

import numpy as np

def loadDataSet(file_name):
    dataMat = []                                                     #创建数据列表
    labelMat = []                                                    #创建标签列表
    fr = open(file_name)                                         #打开文件
    for line in fr.readlines():                                      #逐行读取
        lineArr = line.strip().split()                               #去回车,放入列表
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])  #添加数据
        labelMat.append(int(lineArr[2]))                             #添加标签
    fr.close()                                                       #关闭文件
    return dataMat, labelMat                                        #返回

def sigmoid(inX):
    return 1.0/(1+np.exp(-inX))

def gradAscent(dataMat,Labels,alpha=0.001):
    dataMatrix = np.mat(dataMat)
    labelsMat = np.mat(Labels).transpose()
    m, n = np.shape(dataMatrix)                                #返回dataMatrix的大小。m为行数,n为列数。
    alpha = alpha                                              #学习速率,控制更新的幅度。
    maxCycles = 500                                            #最大迭代次数
    weights = np.ones((n,1))
    for i in range(maxCycles):
        H = sigmoid(dataMatrix * weights)                     #梯度上升矢量化公式
        error = labelsMat - H
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

def  DecisionBoundary():
    dataMat, labelMat = loadDataSet()                 #加载数据集
    dataArr = np.array(dataMat)                      #转换成numpy的array数组
    n = np.shape(dataMat)[0]                         #数据个数
    xcord1 = []; ycord1 = []                           #正样本
    xcord2 = []; ycord2 = []                           #负样本
    for i in range(n):                             #根据数据集标签进行分类
        if int(labelMat[i]) == 1:
            xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
        else:
            xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    print("正样本:{}".format(xcord1,ycord1))
    print("负样本:{}".format(xcord2,ycord2))
if __name__ == '__main__':
    dataMat, labelMat = loadDataSet(file_name)
    weights = gradAscent(dataMat, labelMat)
    DecisionBoundary()

猜你喜欢

转载自blog.csdn.net/m0_38088359/article/details/82052263
今日推荐