机器学习的方式
监督学习,非监督学习,增强学习
感知机
- 感知机接收一个样本输入x,然后将其和权重w结合,计算网络输入z。z接着被传递给激活函数,产生一个二分类输出-1或1作为预测的样本类别。在整个学习阶段,输出用于计算预测错误率和更新权重参数。
- 感知机算法仅在两个类别确实线性可分并且学习率充分小的情况下才能保证收敛。如果两个类别不能被同一线性决策界分开,我们可以设置最大训练集迭代次数或者可容忍的错误分类样本数来停止算法的学习过程。
使用python实现感知机算法
定义一个感知机接口作为python类,类中的主要方法主要有初始化方法,fit方法和predict方法
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import numpy as np
class Perceptron(Object):
def __init__(self,eta=0.01,n_iter=10):
self.eta=eta
self.n_iter = n_iter
def fit(self,x,y):
self.w_ = np.zeros(1+X.shape[1])
self.errors =[]
for _ in range(self.n_iter):
errors = 0
for xi,target in zip(X,y):
update = self.eta * (target -self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self
def net_input(self,X):
return np.dot(X,self.w_[1:]) +self.w_[0]
def predict(self,X):
return np.where(self.net_input(X)>=0.0,1,-1)
有了以上的代码实现,我们可以初始化一个新的Perceptron对象,并且对学习率eta和迭代次数n_iter赋值,fit方法先对权重参数初始化,然后对训练集中每一个样本循环,根据感知机算法对权重进行更新。类别通过predict方法进行预测。除此之外,self.errors_还记录了每一轮中误分类的样本数,有助于我们接下来分析感知机的训练过程。
使用lris数据集检验感知机模型
>>> import pandas as pd
>>> df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
>>> df.tail()
0 1 2 3 4
145 6.7 3.0 5.2 2.3 Iris-virginica
146 6.3 2.5 5.0 1.9 Iris-virginica
147 6.5 3.0 5.2 2.0 Iris-virginica
148 6.2 3.4 5.4 2.3 Iris-virginica
149 5.9 3.0 5.1 1.8 Iris-virginica
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> y = df.iloc[0:100, 4].values
>>> y = np.where(y == 'Iris-setosa', -1, 1)
>>> X = df.iloc[0:100, [0, 2]].values
>>> plt.scatter(X[:50, 0], X[:50, 1],color='red', marker='o', label='setosa')
<matplotlib.collections.PathCollection object at 0x1302b3710>
>>> plt.scatter(X[50:100, 0], X[50:100, 1],color='blue', marker='x', label='versicolor')
<matplotlib.collections.PathCollection object at 0x1302cd1d0>
>>> plt.xlabel('petal length')
<matplotlib.text.Text object at 0x112053d10>
>>> plt.ylabel('sepal length')
<matplotlib.text.Text object at 0x119615bd0>
>>> plt.legend(loc='upper left')
<matplotlib.legend.Legend object at 0x1302fc890>
>>> plt.show()
>>>
最终出现的效果图如下: