逻辑回归(Logistic Regression)
逻辑回归模型的假设是:,其中x代表特征向量,θ代表参数向量
一个常用的逻辑函数为S形函数(sigmoid function),公式为:
逻辑回归模型的代价函数为,其中m为样本个数
简化后为:
Python代码实现如下:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid_z(z):
"""
计算逻辑函数 S形函数
对于给定的x,通过已经确定的参数(θ)计算得出h_θ(x)= 0.7,则表示y有70%的概率y为正向类,相应的y为负向类的概率为1-0.7=0.3
:param z:预测的输出变量的值,即θ^TX的值
:return: g(z)的值:输出变量y=z时,为正向类的几率
"""
return 1 / (1 + np.exp(-z)) # np.exp(k) 求e的幂次方 e^k
def sigmoid(theta, X):
"""
计算逻辑函数 S形函数
:param theta:参数向量
:param X:特征矩阵
:return:
"""
theta = np.mat(theta)
X = np.mat(X)
z = X * theta.T # θ和X^(i)的维度是相同的,θ是向量,θj是标量,它与每一个x(i)样本的第j个维度相乘,即:θj*x(i,j);输入时注意
return 1 / (1 + np.exp(-z)) # np.exp(k) 求e的幂次方 e^k
def cost(theta, X, y):
"""
逻辑回归算法的代价函数
:param theta:参数向量
:param X:特征矩阵
:param y:结果为正向类/负向类
:return:
"""
theta = np.mat(theta)
X = np.mat(X) # 创建矩阵;若输入X本身为矩阵,则不会创建副本,只是创建一个引用;等价于np.matrix(X,copy=False)和np.asmatrix(X)
y = np.mat(y) # np.matrix(X)默认为np.matrix(X,copy=True)
# X:m*(n+1) theta:1*(n+1)
first = np.multiply(-y, np.log(sigmoid(theta, X))) # np.multiply()数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致
second = np.multiply((1 - y), np.log(1 - sigmoid(theta, X)))
return np.sum(first - second)
if __name__ == "__main__":
# 逻辑函数 S 形函数 test
n = 2 # θ^T@X的值为2
re = sigmoid_z(n) # 计算g(2),即输出变量为1时(即输出变量为正向类)的可能性
print("test:" + str(re))
X_m = np.array([[1, 2, 3, 4], [1, 1, 2, 0]]) # X为特征矩阵是m*(n+1)
y_m = np.array([1, 0]) # y为实际的结果变量(正向类/负向类),y的数量对应的是样本的数量,即m
theta_m = np.array([1, 0, 2, 1]) # theta是参数向量:1*(n+1)
# 逻辑函数S形函数
re_sig = sigmoid(theta_m, X_m)
print("逻辑函数:" + str(re_sig))
# 逻辑函数的代价函数
re_cost = cost(theta_m, X_m, y_m)
print("逻辑函数代价函数:" + str(re_cost))
# 画出S形函数的图像 用函数sigmoid_z(z)
xx = np.arange(-10, 10, 1)
yy = sigmoid_z(xx)
plt.plot(xx, yy)
plt.show()