TensorFlow機(jī)器學(xué)習(xí)框架
TensorFlow是Google開(kāi)源的一個(gè)機(jī)器學(xué)習(xí)框架,它可以在Python環(huán)境下運(yùn)行,我昨天認(rèn)識(shí)和接觸它。
模型構(gòu)建方法&事情經(jīng)過(guò)
昨天我用Excel嘗試?yán)L制了我們學(xué)校高二年級(jí)的各個(gè)學(xué)科——物理散點(diǎn)圖,然后用Excel繪制了三次方回歸曲線,我發(fā)現(xiàn)不論是哪個(gè)學(xué)科與物理,殘差平方都很低,這代表它們之間的的關(guān)系并不明顯,幾乎是隨機(jī)的。
因此我就想,如果一個(gè)量映射到另一個(gè)量的關(guān)系不明顯,那我?guī)讉€(gè)量映射到一個(gè)量可能就會(huì)有比較強(qiáng)的關(guān)系了。但是想要找到這個(gè)關(guān)系,似乎非常困難,我嘗試把各個(gè)學(xué)科與物理的三次方回歸曲線以它的殘差平方為權(quán)重線性混合起來(lái),結(jié)果得到了一個(gè)不三不四的方程,處理極其困難,誤差也很大。
剛好昨天認(rèn)識(shí)了TensorFlow(后面簡(jiǎn)稱(chēng)TF),于是打算下載使用TF訓(xùn)練出我想要的模型,但是在安裝TF的過(guò)程中遇到了很多坑,這里我就不細(xì)說(shuō)了。
在使用TF前,我簡(jiǎn)單的看了幾個(gè)別人寫(xiě)的Demo,然后我就開(kāi)始構(gòu)建學(xué)校學(xué)科成績(jī)的線性模型,步驟基本分為下面幾個(gè)。
1,構(gòu)建模型
我將物理成績(jī)構(gòu)建成一個(gè)線性模型,滿(mǎn)足下面這個(gè)式子:
我們只需要使用TF,把上式的各個(gè)系數(shù)優(yōu)化到最貼近真實(shí),使得我把一個(gè)真實(shí)的成績(jī)代入上式后能得到一個(gè)較為精確的值。
2,找數(shù)據(jù),然后把數(shù)據(jù)轉(zhuǎn)換成csv格式
我找到了我們高二年級(jí)這次期末統(tǒng)考成績(jī)的表格,用Excel打開(kāi)它,然后提取所需要的數(shù)據(jù),另存為csv格式。
3,用Python寫(xiě)一個(gè)讀取csv的程序
要注意csv文件的編碼!其它我就不細(xì)說(shuō)了。
import csv
csv_file = csv.reader(open('cj.csv', encoding='utf-8'))
x_data = []
y_data = []
for data in csv_file:
x_s = data[3]
y_s = data[5]
if not len(x_s) * len(y_s) == 0:
x_data.append(float(x_s))
y_data.append(float(y_s))
print(x_data)
4,用Python寫(xiě)TS的模型訓(xùn)練程序
運(yùn)行下面的這個(gè)程序,訓(xùn)練一千萬(wàn)次來(lái)優(yōu)化系數(shù)。具體不細(xì)說(shuō)了,下面是這個(gè)工程的全部源碼:
import tensorflow as tf
import numpy as np
import csv
csv_file = csv.reader(open('cj.csv', encoding='utf-8'))
a_data = []
b_data = []
c_data = []
d_data = []
e_data = []
y_data = []
for data in csv_file:
a_s = data[0]
b_s = data[1]
c_s = data[2]
d_s = data[3]
e_s = data[4]
y_s = data[5]
if not len(a_s)*len(b_s)*len(c_s)*len(d_s)*len(e_s)*len(y_s) == 0:
a_data.append(float(a_s))
b_data.append(float(b_s))
c_data.append(float(c_s))
d_data.append(float(d_s))
e_data.append(float(e_s))
y_data.append(float(y_s))
# 構(gòu)造一個(gè)線性模型
a = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
c = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
d = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
e = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
s = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
y = a*a_data + b*b_data + c*c_data + d*d_data + e*e_data + s
# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.00001)
train = optimizer.minimize(loss)
# 初始化變量
init = tf.global_variables_initializer()
# 啟動(dòng)圖 (graph)
sess = tf.Session()
sess.run(init)
# 擬合
for step in range(10000001):
sess.run(train)
if step % 1000000 == 0:
print(step, sess.run(a), sess.run(b), sess.run(c), sess.run(d), sess.run(e), sess.run(s))
while True :
a1 = float(input("語(yǔ)文成績(jī):"))
b1 = float(input("數(shù)學(xué)成績(jī):"))
c1 = float(input("英語(yǔ)成績(jī):"))
d1 = float(input("化學(xué)成績(jī):"))
e1 = float(input("生物成績(jī):"))
v = sess.run(a)*a1 + sess.run(b)*b1 + sess.run(c)*c1 + sess.run(d)*d1 + sess.run(e)*e1 + sess.run(s)
print("你的物理成績(jī)大概是:", v[0])
成果
猜想和總結(jié)
上面的一個(gè)模型,使用范圍是有限的,因?yàn)槲业臄?shù)據(jù)僅僅只是我們學(xué)校高二年級(jí)在2019年的期末統(tǒng)考數(shù)據(jù)。精度也是有限的,因?yàn)槲业臄?shù)據(jù)只有1000多個(gè),并且我使用的是線性模型,所以一般來(lái)說(shuō)誤差會(huì)在10以?xún)?nèi),比較好的情況下誤差不超過(guò)2。
如果把模型構(gòu)建成二次方,三次方,甚至更多,那么所得到的模型就越貼近真實(shí),但是訓(xùn)練次數(shù)也要更多,模型的表達(dá)式也會(huì)很復(fù)雜。
上面式子每個(gè)成績(jī)前面的系數(shù),就是這個(gè)學(xué)科成績(jī)對(duì)物理成績(jī)的影響大小,可以發(fā)現(xiàn)化學(xué)成績(jī)前的系數(shù)最大,這代表著大部分化學(xué)成績(jī)優(yōu)秀的學(xué)生,物理成績(jī)也不會(huì)太差。我們還可以發(fā)現(xiàn)語(yǔ)文成績(jī)前面的系數(shù)竟然是負(fù)值!這說(shuō)明,物理成績(jī)較好的學(xué)生,語(yǔ)文往往拖他后退。