#在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個位置上...
五線城市列表
晉江 福建經濟發達縣級市 增城 廣東經濟發達縣級市 諸暨 浙江經濟發達縣級市 丹陽 江蘇經濟發達縣級市 玉環 浙江經濟發達縣 常熟 江蘇經濟發達縣級市 崇明 上海經濟發達縣 餘姚 浙江經濟發達縣級市 奉化 浙江經濟發達縣級市 海寧 浙江經濟發達縣級市 瀏陽市湖南縣級市 大理 雲南縣級市 州府 麗江 ...