逻辑回归
首先,逻辑回归并不是属于回归问题,而是属于分类问题。由于历史原因,他就叫逻辑回归而不叫逻辑分类了。逻辑回归还有梯度下降,在机器学习以及深度学习中都非常频繁地会用到。我们这里的逻辑回归用sigmoid函数,使得我们的预测值在(0,1)区间内,当其大于某个阈值时,可以有那么多的把握认为它为某一类。
下面先上代码
import numpy as np
import matplotlib.pyplot as plt
import math
#training sets
x=np.array([[1,2,3],
[1,2,4],
[1,3,4],
[1,3,3],
[1,4,3],
[1,3,2],
[1,10,6],
[1,10,9],
[1,10,8],
[1,9,7],
[1,7,9],
[1,7,14],
[1,9,14],
[1,1,9],
[1,2,10]])
y=np.array([0,0,0,0,0,0,1,1,1,1,1,1,1,0,0])
theta=np.array([1,1,1])
#每一个数据的h组成的向量
def h(x,theta):
e=2.71828
z=x.dot(theta.T)
return 1/(1+e**(-1*z))
#cost_function
def cost(x,y,theta):
hh=h(x,theta)
j=0
for i in hh:
hh[j]=math.log(i)
j+=1
hhh=1-h(x,theta)
j=0
for i in hhh:
hhh[j]=math.log(i)
j+=1
j=sum(y*hh+(1-y)*(hhh))/len(y)*(-1)
return j
#learning_rate
a=0.001
epoch=int(input())
i=0
while i < epoch:
loss=cost(x,y,theta)
theta=theta-(a*(h(x,theta)-y).dot(x))
i+=1
print('loss: ',loss)
t1=[]
t2=[]
for i in x:
t1.append(i[1])
t2.append(i[2])
t1=np.array(t1)
t2=np.array(t2)
x1=t1
x2=(-1*theta[0]-theta[1]*x1)/theta[2]
plt.plot(x1,x2)
T=np.arctan2(t2,t1)
plt.scatter(t1, t2,s=75,c=T,alpha=0.3)
plt.show()
这图片为迭代一万次结果。我个人将数据集分为了两类,中间那条为训练得到的决策边界。当这条线的值大于0时,为上面的那一类,当他小于0时,为下面的那一类将此函数sigmoid化后,便可以得到阈值为0.5。当然,阈值我们也可自己设定,不过代码相应地就要进行改动。