# 跟着AI学AI(2): 逻辑回归

## 提问：请使用numpy写一个逻辑回归模型

``````import numpy as np

class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
# 初始化参数
self.lr = lr  # 学习率
self.num_iter = num_iter  # 迭代次数
self.fit_intercept = fit_intercept  # 是否加入截距
self.verbose = verbose  # 是否打印迭代过程

# 给X加上一列全为1的列，作为截距
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)

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

def __loss(self, h, y):
# 损失函数
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()

def fit(self, X, y):
if self.fit_intercept:

# 权重初始化
self.theta = np.zeros(X.shape[1])

for i in range(self.num_iter):
# 计算z
z = np.dot(X, self.theta)

# 计算h
h = self.__sigmoid(z)

# 计算梯度
gradient = np.dot(X.T, (h - y)) / y.size

# 更新权重

if(self.verbose == True and i % 10000 == 0):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
print(f'loss: {self.__loss(h, y)} t')

def predict_prob(self, X):
if self.fit_intercept:

return self.__sigmoid(np.dot(X, self.theta))

def predict(self, X, threshold):
return self.predict_prob(X) >= threshold

``````

## 提问：请使用unittest写一个训练和预测的测试用例

``````import unittest

class TestLogisticRegression(unittest.TestCase):
def setUp(self):
self.X_train = np.array([[1, 2], [3, 4], [5, 6]])
self.y_train = np.array([0, 1, 0])
self.X_test = np.array([[2, 3], [4, 5]])
self.y_test = np.array([0, 1])
self.lr = LogisticRegression(lr=0.1, num_iter=300000)

def test_fit(self):
self.lr.fit(self.X_train, self.y_train)
self.assertAlmostEqual(self.lr.theta[0], -10.0, places=1)
self.assertAlmostEqual(self.lr.theta[1], 9.0, places=1)
self.assertAlmostEqual(self.lr.theta[2], 0.0, places=1)

def test_predict_prob(self):
self.lr.fit(self.X_train, self.y_train)
prob = self.lr.predict_prob(self.X_test)
self.assertAlmostEqual(prob[0], 0.047, places=3)
self.assertAlmostEqual(prob[1], 0.999, places=3)

def test_predict(self):
self.lr.fit(self.X_train, self.y_train)
pred = self.lr.predict(self.X_test, 0.5)
self.assertEqual(pred[0], 0)
self.assertEqual(pred[1], 1)

if __name__ == '__main__':
unittest.main()
``````

## 提问：假设有一组变量{p_i}决定了用户写博客的开心指数P，有另一组变量{q_j}决定了用户写博客不开心指数Q，P和p_i，Q和q_j是线性回归关系么？如果是请写出他们的关系。

P和p_i，Q和q_j不一定是线性回归关系。如果它们之间存在线性关系，则可以使用线性回归模型来建模。具体来说，如果存在一组系数{a_i}和{b_j}，使得P ≈ ∑a_ip_i和Q ≈ ∑b_jq_j，则可以使用线性回归模型来建模P和Q。然而，如果它们之间存在非线性关系，则需要使用其他的模型来建模。

## 提问：假设P和p_i，Q和q_j是线性回归关系，那么P-Q和{p_i-q_i}的关系表达式是什么？

P-Q ≈ (∑a_ip_i) - (∑b_jq_j) ≈ ∑(a_ip_i - b_jq_j) ≈ ∑(p_i - q_j)*(a_i - b_j)

## 提问：如果P-Q>0时，用户选择写博客，否则用户不写博客，假设Y表示用户是否写博客，W={ai-bj},X={pi-q_j}，那么Y和W、X之间是什么关系

Y = 1 if P-Q > 0 else 0
W = {a_i - b_j}
X = {p_i - q_j}
Y和W、X之间的关系是，Y是由X和W的线性组合得到的，即Y = f(XW)，其中f是一个阶跃函数，当XW>0时，f(XW)=1，否则f(XW)=0。因此，Y和W、X之间是一个线性关系。

## 提问：但是f是一个阶跃函数，怎么能说Y和W、X之间是一个线性关系呢？

Y和W、X之间虽然可以表示为线性关系Y = f(XW)，但是由于f是一个阶跃函数，它的输出只有0和1两种可能，因此Y和W、X之间并不是一个真正的线性关系。相反，它们之间存在一个非线性的映射关系，即阶跃函数f。

## 提问：也就是说，P和pi是线性关系，Q和qi是线性关系，P-Q 和 p_i-qj 也是线性关系，但是Y和X，W并不是线性关系？

P和pi是线性关系，Q和qi是线性关系，P-Q 和 p_i-qj 也是线性关系，但是Y和X，W并不是线性关系。

## 提问：那么概率P(Yi=1)和概率P(P-Q+e>0)之间存在什么关系？

P(Yi=1) = P(Q<P-e)

## 提问：请将 P(Yi=1) = P(Q<P-e) 写成关于随机变量e的累积分布函数的表达式，并给出推导过程。

P(Yi=1) = P(Q<P-e)
P(Yi=1) = 1 - P(Q>=P-e)
P(Yi=1) = 1 - P(P-Q<=e)
P(Yi=1) = 1 - F(e)

## 提问：请问 F(e) 的计算复杂么？

F(e) 的计算复杂度取决于所使用的概率分布函数。对于一些常见的概率分布函数，如正态分布和指数分布，F(e) 的计算可以在常数时间内完成。对于其他的概率分布函数，如混合高斯分布和Beta分布，F(e) 的计算可能需要使用数值积分等复杂的方法，计算复杂度较高。

## 提问：那么，逻辑回归的损失函数交叉熵的梯度是什么？请用链式求导法则给出推导过程。

∂L(y, f(x))/∂w = ∂L(y, f(x))/∂f(x) * ∂f(x)/∂w

∂f(x)/∂w = f(x)(1-f(x)) * ∂(w^Tx)/∂w = f(x)(1-f(x)) * x

∂L(y, f(x))/∂w = (f(x)-y)x

## 提问：有哪些著名的使用逻辑回归分类的成功例子。

1. 信用评分：逻辑回归可以用于信用评分，即根据客户的个人信息和历史信用记录来预测其未来的信用表现。这种方法已经被广泛应用于银行、信用卡公司和其他金融机构中。
2. 医学诊断：逻辑回归可以用于医学诊断，例如预测某种疾病的患病风险或预测某种治疗方法的疗效。这种方法已经被广泛应用于医疗保健领域中。
3. 市场营销：逻辑回归可以用于市场营销，例如预测客户是否会购买某种产品或服务。这种方法已经被广泛应用于电子商务和在线广告中。
4. 自然语言处理：逻辑回归可以用于自然语言处理，例如情感分析和文本分类。这种方法已经被广泛应用于社交媒体、新闻和评论等领域中。
5. 图像识别：逻辑回归可以用于图像识别，例如识别数字、字母和人脸等。这种方法已经被广泛应用于计算机视觉和人工智能领域中。

–end–

THE END