首页 > 分享 > 感知机算法python实现

感知机算法python实现

感知机(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的鲜花销售系统