首先,逻辑回归并不是用于解决回归问题,而是分类问题。
逻辑回归自然要用到逻辑函数 Sigmoid
这个函数有个特点,其取值范围在0到1之间。该函数图像为:
我们令
可以将输出限制在 (0,1)
以下是推导过程
# 读取数据并预处理
def pretreat(file):
data = pd.read_csv(file,sep=',')
data.dropna(how='any',axis=0) # 缺失值处理
#异常值处理
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lowerBound = Q1 - 1.5 * IQR
upperBound = Q3 + 1.5 * IQR
data[(data>=lowerBound) & (data<=upperBound)]
m = data.shape[0] # 样例数
n = len(data.columns) - 1 # 特征个数
X = np.hstack([ np.ones([m,1]),data.iloc[:,0:-1] ]) #得到X
y = np.array([data.iloc[:,-1]]).transpose() #得到y
W = np.random.random([n+1,1]) * 2 * 1 - 1 #权重
a = np.random.random() #学习率
return X,y,W,a
# 逻辑函数
def sigmoid(z):
return 1 / ( 1 + np.exp(-z) )
# 代价函数
def costFunction(X,y,W):
temp1 = np.multiply( y,np.log( sigmoid(np.dot(X,W)) ) )
temp2 = np.multiply( 1-y,np.log(1-sigmoid(np.dot(X,W)) ) )
m = X.shape[0]
J = -1/m * (temp1+temp2).sum()
return J
# 梯度下降
def gradient(X,y,W,a):
temp1 = sigmoid(np.dot(X,W)) - y
temp2 = np.dot(temp1.transpose(),X)
temp3 = a / m * temp2.transpose()
W = W - temp3
return W