线性不可分分类的实现

使用逻辑回归可以处理线性不可分分类问题。和线性可分相比,引入多项式会使决策边界变得弯曲,从而实现非线性分类。

读入数据

train=np.loadtxt('./data3.csv',delimiter=',',skiprows=1)
train_x=train[:,0:2]
train_y=train[:,2]
plt.show()

参数初始化并标准化X

#参数初始化
theta=np.random.rand(4)

#标准化
mu=train_x.mean(axis=0)
sigma=train_x.std(axis=0)
def standardize(x):
    return (x-mu)/sigma

train_z=standardize(train_x)

#增加x0和x3
def to_matrix(x):
    x0=np.ones([x.shape[0],1])
    x3=x[:,0,np.newaxis]**2
    return np.hstack([x0,x,x3])

X=to_matrix(train_z)

学习过程

#sigmoid函数
def f(x):
    return 1/(1+np.exp(-np.dot(x,theta)))

#学习率
ETA=1e-3

#重复次数
epoch=5000

#重复学习
for _ in range(epoch):
    theta=theta-ETA*np.dot(f(X)-train_y,X)

绘制决策边界

x1=np.linspace(-2,2,100)
x2=-(theta[0]+theta[1]*x1+theta[3]*x1**2)/theta[2]

plt.plot(train_z[train_y==1,0],train_z[train_y==1,1],'o')
plt.plot(train_z[train_y==0,0],train_z[train_y==0,1],'x')
plt.plot(x1,x2,linestyle='dashed')
plt.show()

绘制精度曲线

#参数初始化
theta=np.random.rand(4)

#精度的历史记录
accuracies=[]

#定义结果返回函数
def classify(x):
    return (f(x)>=0.5).astype(np.int)

#重复学习
for _ in range(epoch):
    theta=theta-ETA*np.dot(f(X)-train_y,X)
    #计算现在的精度
    result=classify(X)==train_y
    accuracy=len(result[result==True])/len(result)
    accuracies.append(accuracy)

#将精度画成图
x=np.arange(len(accuracies))

plt.plot(x,accuracies)
plt.show()

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权,转载请注明出处。
文章名称:《线性不可分分类的实现》
文章来自:泰恩数据
文章链接:https://tyne.cc/760.html
本站资源仅供个人学习使用,请勿用于商业用途。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址