用TensorFlow機(jī)器學(xué)習(xí)框架構(gòu)建學(xué)校學(xué)科成績(jī)的線性模型

TensorFlow機(jī)器學(xué)習(xí)框架

TensorFlow是Google開(kāi)源的一個(gè)機(jī)器學(xué)習(xí)框架,它可以在Python環(huán)境下運(yùn)行,我昨天認(rèn)識(shí)和接觸它。


image

模型構(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è)式子:
{\begin{aligned} 物理成績(jī) &\approx a \times 語(yǔ)文成績(jī) \\ &+ b \times 數(shù)學(xué)成績(jī) \\ &+ c \times 英語(yǔ)成績(jī) \\ &+ d \times 化學(xué)成績(jī) \\ &+ e \times 生物成績(jī) \\ &+ s \end{aligned}}
我們只需要使用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])

成果

{\begin{aligned} 物理成績(jī) \approx &-0.04158394 \times 語(yǔ)文成績(jī) \\ &+ 0.37960723 \times 數(shù)學(xué)成績(jī) \\ &+ 0.18630792 \times 英語(yǔ)成績(jī) \\ &+ 0.48215818 \times 化學(xué)成績(jī) \\ &+ 0.28883076 \times 生物成績(jī) \\ &- 26.1632100 \end{aligned}}

image

猜想和總結(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ǔ)文往往拖他后退。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容