感知机(perceptron)是二分类的线性分类模型,其中输入是实例的特征向量,输出是类别,类别取+1和-1二值。感知机的目标是求出一个超平面将训练数据进行线性划分。
下面基于鸢尾花数据进行实现感知机算法。
简单介绍下鸢尾花数据:iris数据集的中文名是安德森鸢尾花卉数据集,英文全称是Anderson’s Iris data set。iris数据集是一个150行5列的二维表。具体来说是150个样本,每个样本是数据集中的每行数据,每个样本有4个特征(前4列),1个标签(第五列)。4个特征分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度,标签共有3个,分别是山鸢尾、变色鸢尾还是维吉尼亚鸢尾。
目标是建立一个分类器,通过样本的四个特征判断样本属于哪个品种。
1.首先查看数据集内容和详细信息:
from sklearn import datasets
iris = datasets.load_iris()
print(iris.data.shape)
print(iris.data[:5])
print(iris.target.shape)
print(iris.target)
2.创建DataFrame,读取数据
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data,columns=iris.feature_names)
df['label'] = iris.target
在spyder中可以直接查看df的构成
3.直接实现感知机
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
iris = load_iris()
df = pd.DataFrame(iris.data,columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
plt.scatter(df[:50]['petal length'],df[:50]['petal width'],label='0')
plt.scatter(df[50:100]['petal length'],df[50:100]['petal width'],label='1')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()
data = np.array(df.iloc[:100, [2, 3, -1]])
X = data[:,:-1]
y = data[:,-1]
y = np.array([1 if i==1 else -1 for i in y])
class Model():
def __init__(self):
self.w = np.ones(len(data[0])-1,dtype=np.float32)
self.b = 0
self.l_rate = 0.1
def sign(self,x,w,b):
y = np.dot(x,w) + b
return y
def fit(self,X_train,y_train):
is_wrong = False
while not is_wrong:
wrong_count = 0
for d in range(len(X_train)):
X = X_train[d]
y = y_train[d]
if y*self.sign(X, self.w, self.b) <= 0:
self.w = self.w + self.l_rate * np.dot(y,X)
self.b = self.b + self.l_rate * y
wrong_count += 1
if wrong_count == 0:
is_wrong = True
return 'Perceptron Model'
def score(self):
pass
perceptron = Model()
perceptron.fit(X,y)
print('权重:', perceptron.w[0], perceptron.w[1])
print('偏置:', perceptron.b)
x_points = np.linspace(-3, 7,10)
y_ = -(perceptron.w[0]*x_points + perceptron.b)/perceptron.w[1]
plt.plot(x_points, y_)
plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
分类结果:
4.使用sklearn构造感知机
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.linear_model import Perceptron
iris = load_iris()
df = pd.DataFrame(iris.data,columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
plt.scatter(df[:50]['petal length'],df[:50]['petal width'],label='0')
plt.scatter(df[50:100]['petal length'],df[50:100]['petal width'],label='1')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()
data = np.array(df.iloc[:100, [2, 3, -1]])
X = data[:,:-1]
y = data[:,-1]
y = np.array([1 if i==1 else -1 for i in y])
clf = Perceptron(fit_intercept=True, max_iter=100, shuffle=True)
clf.fit(X,y)
print('权重:',clf.coef_)
print('偏置:',clf.intercept_)
x_points = np.linspace(-3, 7,10)
y_ = -(clf.coef_[0][0]*x_points + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_points, y_)
plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
分类结果:
5.结论
可以看出不管哪种实现感知机的方法,都可以很好的对数据集进行分类,但是学到的权重和偏置是不一样的。这是不是也可以体现感知机的一个重要特性,只要将类别分开就行,不在乎点到超平面的距离是否为最短。
相关知识
【python机器学习】KNN算法实现回归(基于鸢尾花数据集)
用python实现KNN算法对鸢尾花的分类
卷积神经网络实现鸢尾花数据分类python代码实现
Python原生代码实现KNN算法(鸢尾花数据集)
KNN算法实现鸢尾花数据集分类
【人工智能】基于分类算法的学生学业预警系统应用
CMOFPA:多目标花授粉算法
《Python机器学习开发实战》电子书在线阅读
Python机器学习基础教程
python深度学习之用lightgbm算法实现鸢尾花种类的分类任务实战源码
网址: 感知机算法python实现 https://m.huajiangbk.com/newsview506006.html
上一篇: 甘薯芽变与芽变选种 |
下一篇: 基于javaweb的鲜花销售系统 |