這篇文章中,我們來一次實戰(zhàn),我認為這是入門機器學(xué)習(xí)的最直觀的一個例子。
下面是一段python代碼中的二維數(shù)組(2行100列),我們記為x_data
[[ 0.42758232 0.41523728 0.7364561 0.53956449 0.14633773 0.56222874
0.18499938 0.26582134 0.73552477 0.56200433 0.60219848 0.05914833
0.94559932 0.32925037 0.91233349 0.37451747 0.82570422 0.6413793
0.45711643 0.0510349 0.49253303 0.60542917 0.72097594 0.15595818
0.42432156 0.12067413 0.06372201 0.10101804 0.93738174 0.66310227
0.09741133 0.49941415 0.07158906 0.66589403 0.84585708 0.63900119
0.68535918 0.20270246 0.29771215 0.76680732 0.79395735 0.90801775
0.60454905 0.32533091 0.64171505 0.99730647 0.97167498 0.55845433
0.85073692 0.79326469 0.55319452 0.91423094 0.44408876 0.30601162
0.41607821 0.36261719 0.3868331 0.45728528 0.24841437 0.37683052
0.18237418 0.98569024 0.98132664 0.96703428 0.67860758 0.84513372
0.11679788 0.89380908 0.76054925 0.47602558 0.04213563 0.52820212
0.73093456 0.21677995 0.85897821 0.97049636 0.39711675 0.01180799
0.58834493 0.01842264 0.92626923 0.45766795 0.49880844 0.31671363
0.79903597 0.88061112 0.63573354 0.97412097 0.68437254 0.59815019
0.2723268 0.39425883 0.75241357 0.9579795 0.4241344 0.60848516
0.20262484 0.51457667 0.20744105 0.04812595]
[ 0.31976271 0.96551085 0.74686199 0.68523073 0.76263547 0.64432484
0.29724655 0.22450443 0.78051567 0.07997933 0.95134073 0.89156324
0.10389187 0.30935422 0.17702582 0.31272656 0.32682714 0.10123607
0.23373818 0.6247763 0.39454943 0.54197389 0.42791456 0.89178556
0.13581613 0.11662268 0.56151962 0.03865582 0.12745501 0.09533363
0.36215487 0.6063754 0.44721866 0.16352764 0.0175478 0.2745387
0.16954912 0.20520292 0.97252476 0.68919301 0.77762645 0.99751168
0.48580641 0.74408424 0.97986132 0.48074049 0.35011715 0.20372978
0.66633642 0.77604395 0.35104433 0.6027807 0.31352159 0.44550824
0.53263241 0.34016448 0.42796895 0.40930313 0.13593936 0.37489557
0.92516851 0.5538547 0.98710853 0.68188816 0.25437263 0.82512838
0.65908498 0.38657269 0.86543506 0.42110944 0.10221514 0.71449763
0.0390586 0.07711767 0.69850391 0.81870884 0.89288706 0.62117141
0.61512709 0.18505932 0.87685937 0.14009871 0.68119746 0.4527097
0.52289557 0.17806749 0.15934397 0.99448085 0.53543651 0.11325162
0.25579432 0.21486521 0.65362966 0.89440835 0.82798028 0.48527789
0.53906453 0.78469306 0.75793225 0.48855975]]
下面這段數(shù)字,是一個100個元素的數(shù)組,可以理解為1行100列,我么記為y_data
[ 0.40671077 0.5346259 0.52301801 0.4910026 0.46716087 0.48508784
0.37794925 0.37148302 0.52965561 0.3721963 0.550488 0.48422748
0.41533831 0.39479588 0.42663851 0.39999706 0.44793585 0.38438514
0.39245928 0.43005875 0.42816319 0.4689377 0.45768051 0.49395293
0.36959538 0.33539195 0.41867613 0.31783297 0.41922918 0.38537695
0.38217211 0.47121649 0.39660264 0.39929493 0.38809527 0.41880786
0.40244574 0.36131083 0.52427617 0.51451933 0.53492103 0.59030411
0.45761619 0.48134994 0.56014377 0.49587874 0.46719093 0.39659139
0.51834098 0.53453526 0.42552832 0.51197923 0.40711319 0.41970281
0.4481343 0.40429462 0.4242771 0.42758915 0.35202931 0.41266217
0.50327112 0.50933996 0.59555437 0.53308106 0.41873528 0.54953905
0.44349678 0.46669545 0.54914194 0.43182445 0.32465659 0.49571974
0.38090518 0.33710153 0.5255986 0.5607914 0.51828909 0.42541508
0.48185991 0.33885413 0.5679988 0.37378654 0.48612034 0.4222133
0.48448271 0.42367461 0.39544215 0.59630827 0.47552456 0.38246534
0.37839154 0.38239892 0.50596729 0.57467962 0.5080095 0.45790409
0.42807539 0.50839628 0.47233055 0.40252455]
x_data和y_data之間有一定的關(guān)系,這個關(guān)系是什么不得而知。我們假設(shè)如下關(guān)系:
y_data = w*x_data +b
事實上,大多數(shù)情況下,當我們假設(shè)兩組數(shù)據(jù)之間的關(guān)聯(lián)關(guān)系的時候,都可以采用加權(quán)和加偏置的方式來猜測,只是加權(quán)和加偏置的方式可以多種多樣,這是數(shù)學(xué)上的原理,這里不深究?,F(xiàn)在問題變成了我們熟悉的解方程中的未知數(shù)w和b。
這種方程的解,顯然不是那么容易得到,特別是對于未知數(shù)特別多的情況下。但是對于計算機而言,卻不是難事,它可以采用迭代遞歸的方式調(diào)整未知量去擬合這個方程。就類似于我們手動通過描點的方式得出w和b(不知道你是不是在上學(xué)的時候有過這樣的經(jīng)歷,方程解不出來,就拿一些點畫出來,然后拿尺子量的方式計算斜率)。
類似于這樣一個過程:

用python和tensorflow求解上述方程的代碼如下:
import tensorflow as tf
# 設(shè)置兩個變量
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
# 初始化變量
init = tf.initialize_all_variables()
# 構(gòu)造方程
y = tf.matmul(W, x_data) + b
# 最小化方差, 這幾句代碼的意思是,每執(zhí)行一次,就調(diào)整一次w和b,使得y的值和y_data之間的差距越來越小。
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# 多次執(zhí)行train,來調(diào)整w和b的值。每調(diào)整20次,打印出來w和b值看看。
with tf.Session() as sess:
sess.run(init)
# 擬合平面
for step in xrange(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
200輪迭代計算的過程:
0 : w = [[-0.42694762 1.05048251]] , b = [ 0.29054722]
20 : w = [[-0.00765039 0.36172628]] , b = [ 0.26989755]
40 : w = [[ 0.08106617 0.23362274]] , b = [ 0.29180717]
60 : w = [[ 0.09694061 0.20715918]] , b = [ 0.29771015]
80 : w = [[ 0.09959587 0.20157203]] , b = [ 0.29934704]
100 : w = [[ 0.09997934 0.20035832]] , b = [ 0.29981107]
120 : w = [[ 0.10001348 0.20008519]] , b = [ 0.29994476]
140 : w = [[ 0.10000791 0.20002116]] , b = [ 0.29998374]
160 : w = [[ 0.10000313 0.20000549]] , b = [ 0.29999518]
180 : w = [[ 0.10000109 0.20000149]] , b = [ 0.29999855]
200 : w = [[ 0.10000036 0.20000042]] , b = [ 0.29999956]
你應(yīng)該可以看到w和b的值分別是多少了,沒錯w = [0.1, 0.2],b = 0.3。
所以求解出來的方程為:y_data = [0.1, 0.2]*x_data +0.3
這就是一個完整的訓(xùn)練過程,通過不斷地輸入樣本讓機器學(xué)習(xí),調(diào)整其權(quán)值進行收斂。最終得到一組近似適應(yīng)所有樣本的權(quán)值。機器學(xué)習(xí),就是從看似雜亂無章的海量樣本中,學(xué)習(xí)出它的規(guī)律。
機器學(xué)習(xí)其實就是訓(xùn)練權(quán)值的過程,有了這個權(quán)值(規(guī)律),只要給一個輸入,就能得到對應(yīng)的輸出?,F(xiàn)在你對識別花草軟件背后的原理有點感覺了嗎?
下一篇文章,我們一起看看機器學(xué)習(xí)相關(guān)的開發(fā)語言和開發(fā)框架。