Menu

Category

Archive

logo


Linear Regression Algorithm (線形回帰) [ 機械学習 ]

2014-04-08 17:07:00 +0900
  • このエントリーをはてなブックマークに追加

Linear Regression は機械学習の中でも、歴史があり広く使われているアルゴリズムです。Perceptron アルゴリズムのようにアウトプットが +1 か -1 のような決定的なものではなく、実際の数字を取ることができます。クレジットカード審査の例で言えば、カード発行の許可・不許可という結果だけでなく、許可された場合にカードの限度額までアウトプットできます。しかし、Linear という名前が暗示しているように、基本的にデータは Perceptron と同じように直線で分類されることができなければなりません。

Linear Regression Algorithm

Linear Regression の一番の目標は、エラー率が最小化された結果を返すことです。図1の赤い線は実際のデータと予想された結果との差(エラー)を表しています。これが最小化されていれば、良い結果ということです。

このエラーを計算する方程式は、

です。この J(theta) がエラー。m はサンプル数。x(i) がトレーニングデータ。y(i) がトレーニングデータの正確な結果(ターゲット関数の返り値)。h(theta)が仮説です。h(theta) は、

となります。x (インプット) と h のドット積です。

エラーを最小化するように theta を調整することが、今回の目標です。今回は、Gradient descent というアルゴリズムを使用します。

まず、theta を全て 0 に初期化します。そして、予め決められた回数分、ループを回してこの theta を最適化していきます。毎度、上記の式の通り、theta がアップデートされます。コードの中で、theta の値をアップデートし続けることで、J(theta) (エラー) の値がどんどん小さくなっていきます。J(theta)の値を print 等すれば、イメージがつかめると思います。

Code

Python で実装したコードがこちらです。このブログの作者が実装したものです。解説も分かりやすくとても参考になりました。大きな流れとしては、theta (仮説) を 0 に初期化して、その際の J(theta) (エラー率)を表示します。そして、gradient_descent 関数を呼び出し、実際の学習をし、結果を表示するという感じです。このコードは、ある会社の経営者が、新しいお店を出店したいという時に、現在出店されているお店の売上とその町の人口を使って、予想するというシンプルなものです。より洗練された変数の数が増えたケースもこのブログ記事には、解説されています。

 1 # http://aimotion.blogspot.com/2011/10/machine-learning-with-python-linear.html
 2  
 3 from numpy import loadtxt, zeros, ones, array, linspace, logspace
 4 from pylab import scatter, show, title, xlabel, ylabel, plot, contour
 5   
 6 #Evaluate the linear regression
 7 def compute_cost(X, y, theta, isPrint=False):
 8     '''
 9     Compute cost for linear regression
10     '''
11     #Number of training samples
12     m = y.size
13   
14     predictions = X.dot(theta).flatten()
15   
16     sqErrors = (predictions - y) ** 2
17   
18     J = (1.0 / (2 * m)) * sqErrors.sum()
19  
20     return J
21   
22   
23 def gradient_descent(X, y, theta, alpha, num_iters):
24     '''
25     Performs gradient descent to learn theta
26     by taking num_items gradient steps with learning
27     rate alpha
28     '''
29     m = y.size
30     J_history = zeros(shape=(num_iters, 1))
31   
32     for i in range(num_iters):
33   
34         predictions = X.dot(theta).flatten()
35   
36         errors_x1 = (predictions - y) * X[:, 0] # X[:, 0] is all 1s
37         errors_x2 = (predictions - y) * X[:, 1]
38   
39         # batch gradient
40         theta[0][0] = theta[0][0] - alpha * (1.0 / m) * errors_x1.sum()
41         theta[1][0] = theta[1][0] - alpha * (1.0 / m) * errors_x2.sum()
42   
43         J_history[i, 0] = compute_cost(X, y, theta, isPrint=True)
44   
45     return theta, J_history
46   
47   
48 #Load the dataset
49 data = loadtxt('ex1data1.txt', delimiter=',')
50  
51 #Plot the data
52 scatter(data[:, 0], data[:, 1], marker='o', c='b')
53 title('Profits distribution')
54 xlabel('Population of City in 10,000s')
55 ylabel('Profit in $10,000s')
56 # show()
57   
58 X = data[:, 0]
59 y = data[:, 1]
60   
61 #number of training samples
62 m = y.size
63   
64 #Add a column of ones to X (interception data)
65 it = ones(shape=(m, 2))
66 it[:, 1] = X
67   
68 #Initialize theta parameters
69 theta = zeros(shape=(2, 1)) # [[0.][0.]]
70   
71 #Some gradient descent settings
72 iterations = 3000
73 alpha = 0.01
74   
75 #compute and display initial cost
76 print compute_cost(it, y, theta, isPrint=True) # 32.0727338775
77   
78 theta, J_history = gradient_descent(it, y, theta, alpha, iterations)
79   
80 print 'theta is', theta
81 #Predict values for population sizes of 35,000 and 70,000
82 predict1 = array([1, 3.5]).dot(theta).flatten()
83 print 'For population = 35,000, we predict a profit of %f' % (predict1 * 10000)
84 predict2 = array([1, 7.0]).dot(theta).flatten()
85 print 'For population = 70,000, we predict a profit of %f' % (predict2 * 10000)
86   
87 #Plot the results
88 result = it.dot(theta).flatten()
89 plot(data[:, 0], result)
90 show()


参考

http://aimotion.blogspot.com/2011/10/machine-learning-with-python-linear.html
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex2/ex2.html