1. 程式人生 > >人工智慧深度學習TensorFlow通過感知器實現鳶尾花資料集分類

人工智慧深度學習TensorFlow通過感知器實現鳶尾花資料集分類

一.iris資料集簡介

iris資料集的中文名是安德森鳶尾花卉資料集,英文全稱是Anderson’s Iris data set。iris包含150個樣本,對應資料集的每行資料。每行資料包含每個樣本的四個特徵和樣本的類別資訊,所以iris資料集是一個150行5列的二維表。

通俗地說,iris資料集是用來給花做分類的資料集,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特徵(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特徵來判斷樣本屬於山鳶尾、變色鳶尾還是維吉尼亞鳶尾(這三個名詞都是花的品種)。

二、資料來源

https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

三、感知器表示R,評價E,優化O

參閱 深度學習與TensorFlow實戰P45-47頁

四、TensorFlow通過感知器實現鳶尾花資料集分類的python程式碼

import tensorflow as tf

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split

from sklearn import preprocessing

def init_weights(shape):

return tf.Variable(tf.random_normal(shape,stddev=0.01))

#建立分割線

def plotLine(slope,bias):

x = np.arange(-3,3,0.5)

y = x*slope+bias

plt.plot(x,y)

if __name__ == "__main__":

#匯入資料,這裡用了pandas庫

df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)

features = df.iloc[1:len(df.index),[0,2]].values

labels = df.iloc[1:len(df.index),4].values

#調節資料,這一步很關鍵

scaler = preprocessing.StandardScaler().fit(features)

features_standard = scaler.transform(features)

#選取兩種花的兩類特徵

for index,label in enumerate(labels):

if label == "Iris-setosa":

plt.scatter(features[index,0], features[index,1], color='red', marker='o', label='setosa')

else:

plt.scatter(features[index,0], features[index,1], color='blue', marker='x', label='versicolor')

plt.xlabel('petal len')

plt.ylabel('sepal len')

plt.show()

#轉換一下標籤

labels=np.where(labels=="Iris-setosa",1,-1)

#使用sklearn類庫快速分割資料集

features_train, features_test, lables_train, labels_test=train_test_split(features_standard,labels,test_size=0.33)

#定義placeholder容器,第9章將會描述

X= tf.placeholder(tf.float32)

Y= tf.placeholder(tf.float32)

#初始化模型引數

w= init_weights([2,1])

b= tf.Variable(tf.zeros([1,1]))

#建立感知模型

predict_Y= tf.sign(tf.matmul(X,w)+b)

#定義損失函式

loss = tf.reduce_mean(tf.square(predict_Y-lables_train))

#定義優化方法

optimizer = tf.train.GradientDescentOptimizer(0.01)

train_step = optimizer.minimize(loss)

#初始化變數,執行模型

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

#開始訓練

for i in range(300):

sess.run(train_step,feed_dict = {X:features_train, Y:lables_train})

#提取訓練好的模型

w1= sess.run(w).flatten()[0]

w2= sess.run(w).flatten()[1]

b= sess.run(b).flatten()

#將測試資料和感知器分割線顯示出來

for index, label in enumerate(labels_test):

if label ==1:

plt.scatter(features_test[index, 0], features_test[index,1],color='red', marker='o', label='setosa')

else:

plt.scatter(features_test[index, 0], features_test[index,1],color='blue', marker='x', label='versicolor')

plt.xlabel('petal len')

plt.ylabel('sepal len')

plotLine(-w1/w2, -b/w2)

plt.show()

看看執行效果介面: