import matplotlib.pyplot as plt
import numpy as np
import random
import math
#--------------------------------------------------------------------------------------------
# 讀取鳶尾花資料
# 花萼長, 花萼寬, 花瓣長, 花瓣寬, 花種編號 (山鳶尾花:1, 變色鳶尾花:2, 維吉尼亞鳶尾花:3)
#--------------------------------------------------------------------------------------------
data=np.genfromtxt('iris.csv', names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'classes'], delimiter=',')
#--------------------
# 亂數重排資料
#--------------------
np.random.shuffle(data)
#--------------------------------
# 將資料分成訓練資料及測試資料
#--------------------------------
training_data=data[:120]
testing_data=data[120:]
#---------------------------
# 繪圖
#---------------------------
feature_1='petal_length'
feature_2='petal_width'
fig = plt.figure()
sub = fig.add_subplot(111)
sub.plot(training_data[feature_1][training_data['classes']==1], training_data[feature_2][training_data['classes']==1], 'bd', alpha=0.2)
sub.plot(training_data[feature_1][training_data['classes']==2], training_data[feature_2][training_data['classes']==2], 'ro', alpha=0.2)
sub.plot(training_data[feature_1][training_data['classes']==3], training_data[feature_2][training_data['classes']==3], 'gv', alpha=0.2)
#--------------------------------
# 山鳶尾花(1)中心點
#--------------------------------
fc_11=np.mean(training_data[feature_1][training_data['classes']==1])
fc_12=np.mean(training_data[feature_2][training_data['classes']==1])
print('山鳶尾花')
print(feature_1, ':', fc_11)
print(feature_2, ':', fc_12)
print('-'*20)
#-----------------------------------
# 變色鳶尾花(2)中心點
#-----------------------------------
fc_21=np.mean(training_data[feature_1][training_data['classes']==2])
fc_22=np.mean(training_data[feature_2][training_data['classes']==2])
print('變色鳶尾花')
print(feature_1, ':', fc_21)
print(feature_2, ':', fc_22)
print('-'*20)
#--------------------------------------
# 維吉尼亞鳶尾花(3)中心點
#--------------------------------------
fc_31=np.mean(training_data[feature_1][training_data['classes']==3])
fc_32=np.mean(training_data[feature_2][training_data['classes']==3])
print('維吉尼亞鳶尾花')
print(feature_1, ':', fc_31)
print(feature_2, ':', fc_32)
print('-'*20)
#---------------------------
# 繪出各品種鳶尾花中心點
#---------------------------
sub.plot(fc_11, fc_12, 'bs', alpha=1.0)
sub.plot(fc_21, fc_22, 'rs', alpha=1.0)
sub.plot(fc_31, fc_32, 'gs', alpha=1.0)
#---------------------------
# 設定圖標題
#---------------------------
plt.title('Iris flower')
#---------------------------
# 設定資料說明
#---------------------------
plt.legend(['setosa', 'versicolor', 'virginica'], numpoints=1, loc='upper left')
#---------------------------
# 設定x軸及y軸標題
#---------------------------
plt.xlabel(feature_1)
plt.ylabel(feature_2)
#---------------------------
# 儲存圖檔
#---------------------------
fig.savefig('graph.png')
#---------------------------
# 進行測試資料的分類
#---------------------------
correct=0
total=0
for t in testing_data:
d1=math.pow(t[feature_1]-fc_11, 2) + math.pow(t[feature_2]-fc_12, 2)
d2=math.pow(t[feature_1]-fc_21, 2) + math.pow(t[feature_2]-fc_22, 2)
d3=math.pow(t[feature_1]-fc_31, 2) + math.pow(t[feature_2]-fc_32, 2)
guess=0
if(d1<=d2 and d1<=d3):
guess=1
print('猜測品種:', '山鳶尾花')
if(d2<=d1 and d2<=d3):
guess=2
print('猜測品種:', '變色鳶尾花')
if(d3<=d1 and d3<=d2):
guess=3
print('猜測品種:', '維吉尼亞鳶尾花')
total=total+1
if(guess==t['classes']):
correct=correct+1
print('答對')
else:
print('答錯')
print('-'*30)
print('共答題數:', total)
print('答對題數:', correct)
print('答對比率:', correct/total*100 , '%')
5.1,3.5,1.4,0.2,1
4.9,3.0,1.4,0.2,1
4.7,3.2,1.3,0.2,1
4.6,3.1,1.5,0.2,1
5.0,3.6,1.4,0.2,1
5.4,3.9,1.7,0.4,1
4.6,3.4,1.4,0.3,1
5.0,3.4,1.5,0.2,1
4.4,2.9,1.4,0.2,1
4.9,3.1,1.5,0.1,1
5.4,3.7,1.5,0.2,1
4.8,3.4,1.6,0.2,1
4.8,3.0,1.4,0.1,1
4.3,3.0,1.1,0.1,1
5.8,4.0,1.2,0.2,1
5.7,4.4,1.5,0.4,1
5.4,3.9,1.3,0.4,1
5.1,3.5,1.4,0.3,1
5.7,3.8,1.7,0.3,1
5.1,3.8,1.5,0.3,1
5.4,3.4,1.7,0.2,1
5.1,3.7,1.5,0.4,1
4.6,3.6,1.0,0.2,1
5.1,3.3,1.7,0.5,1
4.8,3.4,1.9,0.2,1
5.0,3.0,1.6,0.2,1
5.0,3.4,1.6,0.4,1
5.2,3.5,1.5,0.2,1
5.2,3.4,1.4,0.2,1
4.7,3.2,1.6,0.2,1
4.8,3.1,1.6,0.2,1
5.4,3.4,1.5,0.4,1
5.2,4.1,1.5,0.1,1
5.5,4.2,1.4,0.2,1
4.9,3.1,1.5,0.1,1
5.0,3.2,1.2,0.2,1
5.5,3.5,1.3,0.2,1
4.9,3.1,1.5,0.1,1
4.4,3.0,1.3,0.2,1
5.1,3.4,1.5,0.2,1
5.0,3.5,1.3,0.3,1
4.5,2.3,1.3,0.3,1
4.4,3.2,1.3,0.2,1
5.0,3.5,1.6,0.6,1
5.1,3.8,1.9,0.4,1
4.8,3.0,1.4,0.3,1
5.1,3.8,1.6,0.2,1
4.6,3.2,1.4,0.2,1
5.3,3.7,1.5,0.2,1
5.0,3.3,1.4,0.2,1
7.0,3.2,4.7,1.4,2
6.4,3.2,4.5,1.5,2
6.9,3.1,4.9,1.5,2
5.5,2.3,4.0,1.3,2
6.5,2.8,4.6,1.5,2
5.7,2.8,4.5,1.3,2
6.3,3.3,4.7,1.6,2
4.9,2.4,3.3,1.0,2
6.6,2.9,4.6,1.3,2
5.2,2.7,3.9,1.4,2
5.0,2.0,3.5,1.0,2
5.9,3.0,4.2,1.5,2
6.0,2.2,4.0,1.0,2
6.1,2.9,4.7,1.4,2
5.6,2.9,3.6,1.3,2
6.7,3.1,4.4,1.4,2
5.6,3.0,4.5,1.5,2
5.8,2.7,4.1,1.0,2
6.2,2.2,4.5,1.5,2
5.6,2.5,3.9,1.1,2
5.9,3.2,4.8,1.8,2
6.1,2.8,4.0,1.3,2
6.3,2.5,4.9,1.5,2
6.1,2.8,4.7,1.2,2
6.4,2.9,4.3,1.3,2
6.6,3.0,4.4,1.4,2
6.8,2.8,4.8,1.4,2
6.7,3.0,5.0,1.7,2
6.0,2.9,4.5,1.5,2
5.7,2.6,3.5,1.0,2
5.5,2.4,3.8,1.1,2
5.5,2.4,3.7,1.0,2
5.8,2.7,3.9,1.2,2
6.0,2.7,5.1,1.6,2
5.4,3.0,4.5,1.5,2
6.0,3.4,4.5,1.6,2
6.7,3.1,4.7,1.5,2
6.3,2.3,4.4,1.3,2
5.6,3.0,4.1,1.3,2
5.5,2.5,4.0,1.3,2
5.5,2.6,4.4,1.2,2
6.1,3.0,4.6,1.4,2
5.8,2.6,4.0,1.2,2
5.0,2.3,3.3,1.0,2
5.6,2.7,4.2,1.3,2
5.7,3.0,4.2,1.2,2
5.7,2.9,4.2,1.3,2
6.2,2.9,4.3,1.3,2
5.1,2.5,3.0,1.1,2
5.7,2.8,4.1,1.3,2
6.3,3.3,6.0,2.5,3
5.8,2.7,5.1,1.9,3
7.1,3.0,5.9,2.1,3
6.3,2.9,5.6,1.8,3
6.5,3.0,5.8,2.2,3
7.6,3.0,6.6,2.1,3
4.9,2.5,4.5,1.7,3
7.3,2.9,6.3,1.8,3
6.7,2.5,5.8,1.8,3
7.2,3.6,6.1,2.5,3
6.5,3.2,5.1,2.0,3
6.4,2.7,5.3,1.9,3
6.8,3.0,5.5,2.1,3
5.7,2.5,5.0,2.0,3
5.8,2.8,5.1,2.4,3
6.4,3.2,5.3,2.3,3
6.5,3.0,5.5,1.8,3
7.7,3.8,6.7,2.2,3
7.7,2.6,6.9,2.3,3
6.0,2.2,5.0,1.5,3
6.9,3.2,5.7,2.3,3
5.6,2.8,4.9,2.0,3
7.7,2.8,6.7,2.0,3
6.3,2.7,4.9,1.8,3
6.7,3.3,5.7,2.1,3
7.2,3.2,6.0,1.8,3
6.2,2.8,4.8,1.8,3
6.1,3.0,4.9,1.8,3
6.4,2.8,5.6,2.1,3
7.2,3.0,5.8,1.6,3
7.4,2.8,6.1,1.9,3
7.9,3.8,6.4,2.0,3
6.4,2.8,5.6,2.2,3
6.3,2.8,5.1,1.5,3
6.1,2.6,5.6,1.4,3
7.7,3.0,6.1,2.3,3
6.3,3.4,5.6,2.4,3
6.4,3.1,5.5,1.8,3
6.0,3.0,4.8,1.8,3
6.9,3.1,5.4,2.1,3
6.7,3.1,5.6,2.4,3
6.9,3.1,5.1,2.3,3
5.8,2.7,5.1,1.9,3
6.8,3.2,5.9,2.3,3
6.7,3.3,5.7,2.5,3
6.7,3.0,5.2,2.3,3
6.3,2.5,5.0,1.9,3
6.5,3.0,5.2,2.0,3
6.2,3.4,5.4,2.3,3
5.9,3.0,5.1,1.8,3