机器学习笔记(十七)——非线性单层感知器
本博客仅用于个人学习,不用于传播教学,主要是记自己能够看得懂的笔记(
学习知识、资源和数据来自:机器学习算法基础-覃秉丰_哔哩哔哩_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]]