机器学习笔记(十七)——非线性单层感知器

本博客仅用于个人学习,不用于传播教学,主要是记自己能够看得懂的笔记(

学习知识、资源和数据来自:机器学习算法基础-覃秉丰_哔哩哔哩_bilibili

对于非线性的问题,比如异或问题这种不能用直线解决的问题(如下图),可以选择用非线性的输入来解决。

方法其实与之前的非线性逻辑回归有点像,所以就不用多说了。

Python代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures

x_data=np.array([[1,0,0,0,0,0],[1,1,0,1,0,0],[1,0,1,0,0,1],[1,1,1,1,1,1]]) #坐标,格式为[1,x1,x2,x1^2,x1*x2,x2^2]
y_data=np.array([[1],[-1],[-1],[1]]) #标签

x0=[0,1]
y0=[0,1]
x1=[1,0]
y1=[0,1]
plt.plot(x0,y0,'bo')
plt.plot(x1,y1,'rx')
plt.show()

w=(np.random.random([6,1])-0.5)*2 #随机的-1到1的数
print(w)

lr=0.01 #learning rate
for i in range(5000):
    y=np.dot(x_data,w)
    w_=lr*np.dot(x_data.T,y_data-y)#/float(x_data.shape[0])
    w+=w_
print(w)

model=PolynomialFeatures(degree=2)
xx=np.arange(-1,2,0.02)
yy=np.arange(-1,2,0.02)
xx,yy=np.meshgrid(xx,yy)
z=model.fit_transform(np.c_[xx.ravel(),yy.ravel()])*np.mat(w)
for i in range(len(z)):
    if z[i]<0:
        z[i]=0
    else:
        z[i]=1
z=z.reshape(xx.shape)
plt.contourf(xx,yy,z)

plt.plot(x0,y0,'bo')
plt.plot(x1,y1,'rx')
plt.show()

w=np.mat(w)
print(x_data*w) #与真实值比较

得到结果:

[[ 0.88654597]
[ 0.45097739]
[-0.37685373]
[ 0.54111887]
[-0.40834884]
[ 0.56432373]]
[[ 0.99983515]
[-1.04493328]
[-1.47045127]
[-0.95479179]
[ 3.99952981]
[-0.5292738 ]]

[[ 0.99983515]
[-0.99988992]
[-0.99988992]
[ 0.99991482]]

posted @ 2021-08-02 15:25  Lcy的瞎bb  阅读(165)  评论(0编辑  收藏  举报