1、导入需要的库
import pandas as pd
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
from scipy.optimize import minimize
2、加载和显示数据
def loadData(file,delimeter):#delimeter指的是分隔符
data=np.loadtxt(file,delimiter=delimeter)
print("数据结构为:",data.shape)
print(data[1:6,:])#显示前五行数据
return data
def plotData(data,label_x,label_y,label_pos,label_neg,axes=None):
neg=data[:,2]==0
pos=data[:,2]==1
if axes==None:
axes=plt.gca()
axes.scatter(data[pos][:,0],data[pos][:,1],marker="*",c='g',s=60,linewidth=2,label=label_pos)
axes.scatter(data[neg][:,0],data[neg][:,1],c='r',s=60,linewidth=2,label=label_neg)
axes.set_xlabel(label_x)
axes.set_ylabel(label_y)
axes.legend()
#print(neg)
#print(pos)
print("pos",data[pos])
注意这里delimiter指的是数据之间的分割符号
3、调用函数显示数据
data=loadData("./data1.txt",',')
x=np.c_[np.ones((data.shape[0],1)),data[:,0:2]]
y=np.c_[data[:,2]]
plotData(data,"exam 1 score","exam 2 score","pass","fail")
注:https://blog.csdn.net/qq_33728095/article/details/102512600
这个网址说明了np.c_的用法
4、定义激活函数
def sigmoid(z):
return (1/(1+np.exp(-z)))
5、定义损失函数
def costFunction(theta,x,y):
m=y.size
h=sigmoid(x.dot(theta))
j=-1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y))
if np.isnan(j[0]):
return (np.inf)
return j[0]
注:dot:计算过程就是将向量中对应元素相乘,再相加所得。即普通的向量乘法运算。最后得到一个数字。
6、定义梯度下降函数
def gradient(theta,x,y):
m=y.size
h=sigmoid(x.dot(theta.reshape(-1,1)))
print(h.shape[0],h.shape[1])
print(theta.reshape(-1,1))
grad=(1.0/m)*x.T.dot(h-y)
return (grad.flatten())
7、显示损失
initial_thera=np.zeros(x.shape[1])
cost=costFunction(initial_thera,x,y)
grad=gradient(initial_thera,x,y)
print('cost=',cost)
8、寻找分类边界、预测结果
res=minimize(costFunction,np.zeros(x.shape[1]),args=(x,y),jac=gradient,options={'maxiter':400})
sigmoid(np.array([1,45, 85]).dot(res.x.T))
注:https://www.jianshu.com/p/72948cce955f这个网址是关于minimize函数的使用的
以上一切的类似于一个有监督的神经网络训练过程