目录
1.Sigmoid函数
首先我们要先介绍一下Sigmoid函数,也称为逻辑函数(Logistic function):
图像:
函数特点: 从上图可以看到sigmoid函数是一个s形的曲线,自变量取值范围是R,值域在[0, 1]之间,在远离0的地方函数的值会很快接近0或者1。它的这个特性对于解决二分类问题十分重要。
2.cost函数:交叉熵函数
3.建立模型
直线Z=WX ,此直线也称为决策边界,对应于Z=0,以及概率为0.5,在此直线上的点的概率大于0.5,在此直线下的点的概率小于0.5,所以X是固定的,我们要改变W的值,从而改变Z的方向使得每个点到Z的cost值最小。
4.公式求解
求最优的决策边界,即求最优的线
直线方程:Z=WX
预测函数H(X):
cost函数:
cost函数对w求偏导:
5.使用梯度下降法迭代求出最优的W
5.1初始化w
5.2更新w
5.3迭代到一定次数或达到某一阈值
6.代码展示
import numpy as np
import matplotlib.pyplot as plt
def loaddate(filename):
"""
加载文件导入数据和标签
"""
file = open(filename)
x=[]
y=[]
for line in file.readlines():
line = line.strip().split()
x.append([1,float(line[0]),float(line[1])])
y.append(float(line[-1]))
xmat = np.mat(x)
ymat = np.mat(y).T
file.close()
return xmat,ymat
def w_calc(xmat,ymat,alpha=0.001, maxiter = 10000):
"""
梯度下降更新w
"""
# w init
w = np.mat(np.random.randn(3,1))
# w update
for i in range(maxiter):
H = 1/(1+np.exp(-xmat*w)) # 预测值
dw = np.dot(xmat.T,H-ymat) # cost对w的导数
w -= alpha*dw # 更新w
return w
xmat,ymat = loaddate('DATA.txt')
#print('xmat:',xmat,xmat.shape)
#print('ymat:',ymat,ymat.shape)
W = w_calc(xmat,ymat)
print(W)
# 画出散点图
plt.scatter(xmat[:,1][ymat==0].A,xmat[:,2][ymat==0].A,marker = '^',s=150,label = 'label=0')
plt.scatter(xmat[:,1][ymat==1].A,xmat[:,2][ymat==1].A,s=150,label = 'label=1')
# 画出z
w0 = W[0, 0]
w1 = W[1, 0]
w2 = W[2, 0]
plotx1 = np.arange(1,7,0.01)
plotx2 = -w0/w2-w1/w2*plotx1
plt.plot(plotx1,plotx2,c='r',label='decision_boundary')
plt.grid()
plt.legend()
plt.show()