我们所谓的建模过程,其实就是找到一个模型,最大程度的拟合我们的数据。 在简单线回归问题中,模型就是我们的直线方程:y = ax + b 。
要想最大的拟合数据,本质上就是找到没有拟合的部分,也就是损失的部分尽量小,就是损失函数(loss function)(也有算法是衡量拟合的程度,称函数为效用函数(utility function)):
因此,推导思路为:
通过分析问题,确定问题的损失函数或者效用函数;
然后通过最优化损失函数或者效用函数,获得机器学习的模型
近乎所有参数学习算法都是这样的套路,区别是模型不同,建立的目标函数不同,优化的方式也不同。
回到简单线性回归问题,目标:
[if !vml]
[endif]
###简单线性回归算法的实现
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1.,2.,3.,4.,5.])
y = np.array([1.,3.,2.,3.,5,])
plt.scatter(x,y)
plt.axis([0,6,0,6])
plt.show()
# 首先要计算x和y的均值
x_mean = np.mean(x)
y_mean = np.mean(y)
# a的分子num、分母d
num = 0.0
d = 0.0
for x_i,y_i in zip(x,y): # zip函数打包成[(x_i,y_i)...]的形式
num = num + (x_i - x_mean) * (y_i - y_mean)
d= d + (x_i - x_mean) ** 2
a = num / d
b = y_mean - a * x_mean
y_hat = a * x + b
plt.scatter(x,y) #绘制散点图
plt.plot(x,y_hat,color='r') #绘制直线
plt.axis([0,6,0,6])
plt.show()
x_predict = 6
y_predict = a * x_predict + b
print(y_predict)
##向量化运算
import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a, b)
toc = time.time()
print("c: %f" % c)
print("vectorized version:" +str(1000*(toc-tic)) + "ms")
c = 0
tic = time.time()
for i in range(1000000):
c+= a[i] * b[i]
toc = time.time()
print("c: %f" % c)
print("for loop:" +str(1000*(toc-tic)) + "ms")
网友评论