TensorFlow 五 線性支援向量機的使用

2022-07-21 02:15:11 字數 4557 閱讀 9410

#在tensorflow實現乙個soft margin 支援向量機

#損失函式 懲罰項 使用l2範數

#1/n*σmax(0, y(ax-b)) +σ||a||^2

import

tensorflow as tf

import

numpy as np

import

matplotlib.pyplot as plt

from sklearn import

datasets

sess=tf.session()

#載入鳶尾花集合

iris=datasets.load_iris()

#提取特徵

x_vals=np.array([ [x[0],x[3] ]for x in

iris.data])

#山鳶尾花為1 否則為-1

y_vals=np.array([ 1 if y==0 else -1 for y in

iris.target])

#分割訓練集 測試集

train_indices=np.random.choice(len(x_vals),round(len(x_vals)*0.8),replace=false)

test_indices=list(set(range(len(x_vals)))-set(train_indices))

#陣列分片操作 使得 x_vals必須要array型別

x_vals_train=x_vals[train_indices]

y_vals_trian=y_vals[train_indices]

x_vals_test=x_vals[test_indices]

y_vals_test=y_vals[test_indices]

#設定批量大小 希望用非常大的批量 因為小的批量會使 最大間隔線緩慢移動

batch_size=80

#設定變數 佔位符

x_data=tf.placeholder(shape=[none,2],dtype=tf.float32)

y_target=tf.placeholder(shape=[none,1],dtype=tf.float32)

a=tf.variable(tf.random_normal(shape=[2,1]))

b=tf.variable(tf.random_normal(shape=[1,1]))

#輸出 y=ax-b

model_out=tf.subtract(tf.matmul(x_data,a),b)

#宣告最大間隔損失函式。首先宣告乙個函式計算l2範數,接著增加間隔引數alpha

l2_norm=tf.reduce_sum(tf.square(a))

alpha=tf.constant([0.1])

l2=tf.multiply(alpha,l2_norm)

#分類器 該處y為真實值 1/n*σmax(0, y(ax-b)) +σ||a||^2

classification_term=tf.reduce_mean(tf.maximum(0.,tf.subtract(1.,tf.multiply(y_target,model_out))))

loss=tf.add(classification_term,l2)

#增加**函式 和 準確度函式

prediction=tf.sign(model_out) #

tf.sign ==-1,0,1

accuracy=tf.reduce_mean(tf.cast(tf.equal(prediction,y_target) ,tf.float32))

#梯度下降

my_opt=tf.train.gradientdescentoptimizer(0.01)

train_step=my_opt.minimize(loss)

#初始化上述變數

init=tf.global_variables_initializer()

sess.run(init)

#開始遍歷迭代

loss_rec=

train_acc_rec=

test_acc_rec=

l2_rec=

for i in range(500):

rand_index=np.random.choice(len(x_vals_train),size=batch_size)

#shape(none,2)

rand_x=x_vals_train[rand_index]

rand_y=np.transpose([y_vals_trian[rand_index]])

#執行sess.run(train_step,feed_dict=)

temp_loss =sess.run(loss,feed_dict=)

#新增記錄

#帶入所有訓練集 檢視精確度

train_acc_temp=sess.run(accuracy,feed_dict=)

#帶入所有測試集 檢視精確度

test_acc_temp=sess.run(accuracy,feed_dict=)

#列印if (i+1)%100==0:

print('

step:%d a=%s

'%(i,str(sess.run(a))))

print('

b=%s

'%str(sess.run(b)))

print('

loss:%s

'%str(temp_loss))

#抽取係數 畫圖

[[a1],[a2]]=sess.run(a)

[[b]]=sess.run(b)

#a1x1+a2*x2-b=0 ==> x1=-a2*x2/a1 + b/a1

slope=-a2/a1

y_intercept=b/a1

x1_vals=[ x[1] for x in

x_vals]

#最優分割線 對應所有資料

best_fit=

for i in

x1_vals:

#展示全部資料

線性代數系列(五) 線性相關性

向量組的線性相關性 首先要明確一點,線性相關性是只針對向量組而言的。在前面的文章中,已經大致的涉及到了線性相關性的概念,其實,本質上還是考慮的線性組合。給定乙個向量組v vv,如果除了零向量以外,不存在一組非零的係數向量使得向量組v vv的線性組合為零向量,那麼這個向量組v vv中的向量就是線性無關...

排序演算法(五) 線性時間排序之計數排序

計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。當k o n 時,計數排序的執行時間為o n 計數排序的基本思想是 對於每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到輸出陣列中的位置上了。例如,如果有17個元素小於x則x就應該放在第18個位置上...

五線城市列表

晉江 福建經濟發達縣級市 增城 廣東經濟發達縣級市 諸暨 浙江經濟發達縣級市 丹陽 江蘇經濟發達縣級市 玉環 浙江經濟發達縣 常熟 江蘇經濟發達縣級市 崇明 上海經濟發達縣 餘姚 浙江經濟發達縣級市 奉化 浙江經濟發達縣級市 海寧 浙江經濟發達縣級市 瀏陽市湖南縣級市 大理 雲南縣級市 州府 麗江 ...