- sigmoid 函数介绍
- 逻辑回归原理详解
- 逻辑回归代码实践
1.sigmoid函数
sigmoid表达式:
图像:

sigmoid.png
1.1 计算f(0)
f(0)= 0.5
这个特性可以和概率联系起来 p∈[0,1]
1.2 计算sigmoid函数的导数
=
=
=
=
即:,也就是说想知道某sigmoid函数某一点的导数值,根据它的函数值就能计算,这是它的第二个特性。
因为以上的两个特性,所以我们会用sigmoid函数。
2.构建模型
先来看矩阵X,每一行x是一个样本,右上标数字表示第几个样本,右下标数字表示不同的特征,表示第几个特征,也就是每一列。
这里y是标签,要么为0,要么为1,LR是二分类,class1 = 0,class2 = 1
logit:
公式(1)带入sigmoid函数就得到了公式(2),这就是Logistic Regression的model,是模型参数,找到最优的
,我们用
。
根据sigmoid函数特性:
3.构建损失函数
也就是希望下面这两个式子同时接近1
所以我们给定式子
Loss function:
4.求取损失函数最小值
。
。
5.Logistic代码实践
dataset = pd.read_csv("titanic_data/train.csv")
dataset.head()

titanic.png
dataset = dataset[['Age','Pclass','Sex','Fare','SibSp','Parch','Survived']]
n_dataset = dataset.shape[0]
# feature engineering
dataset['Fare'] = (dataset['Fare'] - dataset['Fare'].mean())/dataset['Fare'].std()
dataset['Sex'] = dataset['Sex'].astype('category').cat.codes
dataset['Pclass'] = (dataset['Pclass'] - dataset['Pclass'].mean())/ dataset['Pclass'].std()
dataset['Age'].fillna(dataset['Age'].mean(),inplace = True)
dataset['Age'] = (dataset['Age'] - dataset['Age'].mean()) / dataset['Age'].std()
dataset['Sex'] = (dataset['Sex'] - dataset['Sex'].mean()) / dataset['Sex'].std()
train_data = dataset.iloc[0:600]
test_data = dataset.iloc[600:]
X_train = train_data.drop(columns = 'Survived').astype('float32')
y_train = train_data['Survived'].astype('float32')
n_train = X_train.shape[0]
X_test = test_data.drop(columns = 'Survived').astype('float32')
y_test = test_data['Survived'].astype('float32')
n_test = test_data.shape[0]
#Set up logistic regression model
def sigmoid(x):
y = 1/(1 + np.exp(-x))
return y
x = np.arange(-10,10,0.1)
y = sigmoid(x)
fig, ax = plt.subplots()
ax.scatter(0,sigmoid(0))
ax.plot(x,y)
plt.show()
n_features = X_train.shape[1]
w = np.zeros(n_features)
b = 0
epoches = 1000
lr = 0.0001
for epoch in range(epoches):
det_w = np.zeros(n_features)
det_b = 0.0
logits = w.dot(X_train.T) + b
y_hat = sigmoid(logits)
det_w = - np.dot((y_train - y_hat),X_train)
det_b = - np.sum(y_train - y_hat)
w = w - lr * det_w
b = b - lr * det_b
def get_accuracy(X,y,w,b):
n_samples = X.shape[0]
predicted_result = []
total_loss = 0
for i in range(n_samples):
x = X.iloc[i]
p = sigmoid(x.dot(w) + b)
if p > 0.5:
predicted_result.append(1)
else:
predicted_result.append(0)
total_loss = 0
for i in range(n_samples):
loss = (y.iloc[i] - predicted_result[i]) ** 2
total_loss += loss
accuracy = (y.shape[0] - total_loss) / y.shape[0]
return accuracy
#训练集
get_accuracy(X_train,y_train,w,b)
0.8016666666666666
#测试集
get_accuracy(X_test,y_test,w,b)
0.8006872852233677