机器学习----梯度下降法单变量线性回归及python实现

最近开始学习机器学习基础算法,在看吴恩达的视频,从单变量线性回归开始
1.单变量线性回归:
已有大量数据,包括不同尺寸的房子和这些房子对应的价格,目标是拟合一条线型直线来模拟房子尺寸和房子价格的关系。
2.总体思路:
首先,假设我们拟合的直线方程为y = theta1x+theta0,也就是说我们的目的是找到合适的theta1和thea0,使得直线能够很好的描述数据。
接下来,我们设置代价函数J = ∑(yi-yi’)^2/2m,其中yi是theta1
xi+theta0计算得到的房价,yi’是真实的房价,也就是说当J取得最小时,我们就获得了最理想的拟合函数和theta1与thea0的值。
那么接下来如何修改theta1与thea0以达到J取最小值的目的呢?这里使用梯度下降的方法,将全部房子尺寸数据输入,获得预测的房价与真实的房价以代价函数的方式作比较,按照代价函数的变化梯度以学习率a来修改theta1与thea0。
即:
theta0 = theta0 - a * ∂J/∂theta0
theta1 = theta1 - a * ∂J/∂theta1

3.代码实现

import numpy as np
import pandas as pd

class gradient:
    def __init__(self,input,output,theta1,theta0):
        self.input = input
        self.output = output
        self.theta0 = theta0
        self.theta1 = theta1
        self.alpha = 0.001
        self.predict = np.zeros(len(self.input))

    def calculate(self):
        bias = self.theta0 * np.ones(len(self.input))
        self.predict = self.theta1 * self.input + self.theta0 * bias

    def cost_function(self):
        J = 0
        for i in range(len(self.input)):
            J += pow(self.predict[i]-self.output[i],2)
        J = J / 2 / len(self.input)
        return J
        
    def update(self):
        sum0 = 0
        sum1 = 0
        for i in range(len(self.input)):
            sum0 += np.sum(self.predict - self.output)
            sum1 += np.sum((self.predict - self.output) * self.input)
        temp0 = self.theta0 - self.alpha / len(self.input) * sum0
        temp1 = self.theta1 - self.alpha / len(self.input) * sum1
        self.theta0 = temp0
        self.theta1 = temp1

    def run(self):
        self.calculate()
        cost = self.cost_function()
        self.update()
        print(cost)
        print(self.predict)
        print(self.theta1,self.theta0)


if __name__ == "__main__":
    input = np.array([2,4,6,8])
    output = np.array([2,5,6,9])
    theta0 = 0
    theta1 = 1
    gra = gradient(input,output,theta1,theta0)
    for i in range(1000):
        gra.run()
    gra1 = gradient(input,output,1.1,0)
    gra1.calculate()
    J = gra1.cost_function()
    print(J)


4.最终结果

0.10000000614458825                                   (最终代价函数)
[2.20018101 4.40009048 6.59999995 8.79990942]         (对应输入的预测值)
1.0999547357165402 0.016478349935662516               (theta1与theta0的值)

你可能感兴趣的:(机器学习)