如何用Python實現機器學習算法?
謝邀!
這個問題估計會答成“茴香豆有幾種寫法” 這種類型的答案。因為用python實現linear regression實在是太多方法了,我簡單舉幾個例子。
線性回歸嘛,是個很簡單的回歸問題。目的是希望構建的模型能夠更好的擬合樣本數據,不管是一元線性回歸還是多元線性回歸,x和y的關系都假設是線性的。就是下面這樣的:
一般線性回歸的公式是y=wx+b。 x是變量,多元的話就是x1,x2....xn這樣,當然w也會對應的有多個。模型使用時,也是根據觀測的x值來預測y值的。
那么,其實模型要計算的就是w和b了對吧,如何求得w和b使得這個直線更好的擬合數據呢。一般我們用最小二乘法。
最小二乘法的原理和最優化方法就不細講了,百度上隨處可見,主要是介紹下各種實現方法。
1. 只用Python和科學計算庫numpy,不使用機器學習框架def Linear_regression():# get train data
data =np.loadtxt('data.csv',delimiter=',')#define hyperparamters
#learning_rate is used for update gradient
#defint the number that will iteration
# define y =mx+b
learning_rate = 0.001
initial_b =0.0
initial_m = 0.0
num_iter = 1000
#train model
#optimizing b and m
[b ,m] = optimizer(data,initial_b,initial_m,learning_rate,num_iter)
其中最關鍵的部分是optimizer,也就是最優化參數的過程,
def optimizer(data,starting_b,starting_m,learning_rate,num_iter):
b = starting_bm = starting_m#gradient descent
for i in range(num_iter):
#update b and m with the new more accurate b and m by performing# thie gradient step
b,m =compute_gradient(b,m,data,learning_rate)
if i%100==0:print 'iter {0}:error={1}'.format(i,compute_error(b,m,data))
return [b,m]
優化方法可以選用梯度下降來實現,梯度下降算法如下:
def compute_gradient(b_current,m_current,data ,learning_rate):
b_gradient = 0
m_gradient = 0
N = float(len(data))
x = data[:,0]
y = data[:,1]
b_gradient = -(2/N)*(y-m_current*x-b_current)
b_gradient = np.sum(b_gradient,axis=0)
m_gradient = -(2/N)*x*(y-m_current*x-b_current)
m_gradient = np.sum(m_gradient,axis=0)
#update our b and m values using out partial derivations
new_b = b_current - (learning_rate * b_gradient)
new_m = m_current - (learning_rate * m_gradient)
return [new_b,new_m]
每次迭代一個樣本的時候都會計算當前參數的預測值和目標值的梯度,以此來決定參數優化的方向。
2. 利用scikit-learn等機器學習庫完全用python寫一個linear regression的話其實就是復現一下算法的各個流程,如果不是學生可能很少會這么做,因為比較費時費力。更快捷的方式是使用各種算法庫,基本都封裝了這種簡單的統計學習方法。比如在scikit-learn中,可以直接通過調用API完成模型的構建和訓練
df = pd.read_csv(StringIO(csv_data))
# 建立線性回歸模型
regr = linear_model.LinearRegression()
# 擬合
regr.fit(df['x'], df['y'])
linear_model就是scikit-learn中封裝好的一系列線性模型庫,線性回歸的話調用其中的LinearRegression()就可以了。
3.利用TensorFlow是的,tf也可以。Tensorflow雖然被人民所熟知是因為它廣泛的應用在深度學習領域,但是它其實也是個機器學習庫,封裝了各種統計學習的方法。和構建其他deep learning模型類似。Tensorflow構建線性回歸模型更簡單, = =||。
# 生成1維W矩陣,取值是[-1, 1]之間的隨機數
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0), name='W')
# 生成1維b矩陣,初始值是0
b = tf.Variable(tf.zeros([1]), name='b')
# 以預估值y和實際值y_data之間的均方誤差作為損失
loss = tf.reduce_mean(tf.square(y - y_data), name='loss')
# 采用梯度下降法來優化參數
optimizer = tf.train.GradientDescentOptimizer(0.5)
# 訓練的過程就是最小化這個誤差值
train = optimizer.minimize(loss, name='train')
sess = tf.Session() #這種定義session的方法也可以,但是不推薦。
init = tf.global_variables_initializer()
sess.run(init)
# 初始化的w和b是多少
print("W=", sess.run(W), "b=", sess.run(b), "loss=", sess.run(loss))
# 執行N次訓練
for step in range(1000):
sess.run(train)
# 輸出訓練好的W和b
print("W=", sess.run(W), "b=", sess.run(b), "loss=", sess.run(loss))
小結除了我提到的這些方法,其他各種三方庫實現LinearRegression都不復雜,畢竟這是個入門級的統計學習模型,最重要的是理解它的本質。
* 如果覺得有幫助的話,歡迎關注我,會給大家分享更多深度學習、機器學習方面的實戰經驗,謝謝!