python实现 逻辑回归(Logistic Regression)算法

1. 实验原理

可参考下面这篇博文,讲的蛮清楚的

https://blog.csdn.net/guoziqing506/article/details/81328402

 

2. 实验数据

数据来源:https://archive.ics.uci.edu/ml/datasets/Ecoli

(因为是二分类问题,实际使用时只留下了两类数据,并把分类结果置为0或1)

 

3. 代码实现

import numpy as np
from numpy import mat
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

picCount = 1

def drawing(data, weight):
    global picCount
    plt.scatter(data[0:77, 1].tolist(), data[0:77, 2].tolist(), c='r', label='a')
    plt.scatter(data[77:, 1].tolist(), data[77:, 2].tolist(), c='b', label='b')
    x = np.arange(-0.5, 0.6, 0.1)
    # 矩阵转换为array,不转的话x和y的维度会不同
    weight = np.array(weight)
    y = (-weight[0] - weight[1] * x) / weight[2]
    print(('Weights of {} :\n %s' % str(weight)).format(picCount))
    plt.plot(x, y)
    plt.savefig(r'E:\Material\Logistic Regression\\{}jpg'.format(picCount))  # 保存图片
    picCount += 1
    plt.show()

def regression(data, label):
    # data: m * n
    # 数据矩阵的列数
    n = np.shape(data)[1]
    # 权值向量,初始值为1
    weight = np.ones((n, 1))
    label = mat(label).T
    for i in range(50):
        # 得到的是m维的向量
        sigs = sigmoid(data * weight)
        weight = weight + data.T * (label - sigs)
        drawing(data, weight)
    return weight

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

if __name__ == '__main__':
    url = r'C:\Users\70423\Desktop\ecoli.data'
    ori_data = np.loadtxt(url, usecols=(range(1, 9)), dtype=str)
    # 数据集
    data = ori_data[:, :7]
    # 标签集
    label = []
    for d in ori_data:
        label.append(int(d[7]))
    # PCA降维,维数为2
    pca = PCA(n_components=2)
    reduce_data = pca.fit_transform(data)
    m = np.shape(reduce_data)[0]
    # 给降维后的矩阵加入一列为1的数,方便计算偏移量
    reduce_data = np.hstack((mat(np.ones((m, 1))), reduce_data))
    weight = regression(reduce_data, label)
    drawing(reduce_data, weight)

 

4. 代码分析

代码的关键部分则是逻辑回归的实现,通过上述实验原理分析很容易写出:

def regression(data, label):
    # data: m * n
    # 数据矩阵的列数
    n = np.shape(data)[1]
    # 权值向量,初始值为1
    weight = np.ones((n, 1))
    label = mat(label).T
    for i in range(50):
        # 得到的是m维的向量
        sigs = sigmoid(data * weight)
        weight = weight + data.T * (label - sigs)
        drawing(data, weight)
    return weight

 

5. 实验结果及分析

随着迭代的进行(程序设置了50次迭代),权值和分割线的变化情况如下:

前三次迭代:

python实现 逻辑回归(Logistic Regression)算法_第1张图片

python实现 逻辑回归(Logistic Regression)算法_第2张图片

python实现 逻辑回归(Logistic Regression)算法_第3张图片

python实现 逻辑回归(Logistic Regression)算法_第4张图片

中间三次迭代:

python实现 逻辑回归(Logistic Regression)算法_第5张图片

python实现 逻辑回归(Logistic Regression)算法_第6张图片

python实现 逻辑回归(Logistic Regression)算法_第7张图片

python实现 逻辑回归(Logistic Regression)算法_第8张图片

最后三次迭代:

python实现 逻辑回归(Logistic Regression)算法_第9张图片

python实现 逻辑回归(Logistic Regression)算法_第10张图片

python实现 逻辑回归(Logistic Regression)算法_第11张图片

python实现 逻辑回归(Logistic Regression)算法_第12张图片

综上所述,除了数据集本身噪声点的干扰,可以看出逻辑回归的分类效果还是不错的。

 

你可能感兴趣的:(机器学习,python,深度学习,机器学习,人工智能)