import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x = np.linspace(-5,5,100)
y = sigmoid(x)
plt.plot(x,y,color='green')
#损失函数
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from mpl_toolkits.mplot3d import Axes3D
#Z-score归一化
from sklearn.preprocessing import scale,StandardScaler
#加载数据
X,y = datasets.load_breast_cancer(return_X_y=True)
X=X[:,:2]#切片两个特征
#建模
model = LogisticRegression()
#训练,和之前线性回归,类似
#后面其他方法,算法,类似
model.fit(X,y)
#逻辑回归线性方程拿出来:系数
w1 = model.coef_[0,0]
w2 = model.coef_[0,1]
b = model.intercept_
print('方程系数',w1,w2)
print('截距',b)
#sigmoid函数
def sigmoid(X,w1,w2,b):
z = w1*X[0] + w2*X[1] + b#方程表示
return 1/(1+ np.exp(-z))
#损失函数
def loss_function(X,y,w1,w2,b):
loss = 0
for X_i,y_i in zip(X,y):
p = sigmoid(X_i,w1,w2,b)#概率
p=np.clip(p,0.0001,0.999)#裁剪 np.clip 在 loss_function 中的使用是为了防止概率值为0或1,这在对数计算中会导致数值不稳定。
loss+= -y_i * np.log(p) +(1-y_i)* np.log(1-p)
return loss
#定义参数w1,w2取值空间
w1_space= np.linspace (w1 - 2,w1 +2,100)
w2_space = np.linspace(w2 - 2,w2 +2,100)
#损失计算
#loss1_ 是通过遍历 w1_space 中的所有 w1 值,并计算每个 w1 值对应的损失函数值来创建的。这个过程是损失函数在不同 w1 权重参数下的表现,可以帮助我们理解权重参数如何影响模型的性能。
loss1_ = np.array([loss_function(X,y,i,w2,b) for i in w1_space])
loss2_ = np.array([loss_function(X,y,w1,i,b) for i in w2_space])
#可视化
fig1 = plt.figure(figsize=(12,9))
plt.subplot(2,2,1)
plt.plot(w1_space,loss1_,color='green')
plt.subplot(2,2,2)
plt.plot(w1_space,loss1_,color='red')
#逻辑回归代码实现
#将数据拆分
from sklearn.model_selection import train_test_split
X,y = datasets.load_iris(return_X_y=True)
cond = y!=2#过滤数据:类别是2,过滤掉 "cond"通常用作条件的缩写,表示一个需要被评估为真或假的表达式。
X=X[cond]
y=y[cond]
#加载数据并拆分
#将调练数据测试数据:80% 训练数据,保留20%,测试数据
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
#训练
model = LogisticRegression()
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
print('预测结果是:',y_pred)
proba_ = model.predict_proba(X_test)
print('预测概率是:\n',proba_)
#概率手动计算
def sigmoid(x):
return 1/(1+np.exp(-z))
#方程系数和截距
w=model.coef_
b=model.intercept_
#求解线性方程
z=X_test.dot(w.reshape(-1))+b
p=sigmoid(z)
#列合并
#np.column_stack([1-p,p])
np.concatenate([(1-p).reshape(-1,1),p.reshape(-1,1)],axis = 1)[:5]
为什么要列合并?因为在逻辑回归中,我们通常需要一个概率矩阵,其中每一行代表一个样本,每一列代表该样本属于某个类别的概率。例如,对于二分类问题,我们通常会有两个列,一个表示属于类别0的概率,另一个表示属于类别1的概率。
loss1_
是通过遍历 w1_space
中的所有 w1
值,并计算每个 w1
值对应的损失函数值来创建的。这个过程是损失函数在不同 w1
权重参数下的表现,可以帮助我们理解权重参数如何影响模型的性能。
np.clip
在 loss_function
中的使用是为了防止概率值为0或1,这在对数计算中会导致数值不稳定。
在编程和逻辑语句中,"cond"通常用作条件的缩写,表示一个需要被评估为真或假的表达式。