python中计算如何实现_详解:如何用Python实现机器学习算法(1)

一、线性回归

1、代价函数

20171225180645510.png

其中:

20171225180645211.png

下面就是要求出theta,使代价最小,即代表我们拟合出来的方程距离真实值最近

共有m条数据,其中

20171225180645801.png代表我们要拟合出来的方程到真实值距离的平方,平方的原因是因为可能有负值,正负可能会抵消

前面有系数2的原因是下面求梯度是对每个变量求偏导,2可以消去

实现代码:

# 计算代价函数

def computerCost(X,y,theta):

m = len(y)

J = 0

J = (np.transpose(X*theta-y))*(X*theta-y)/(2*m) #计算代价J

return J

注意这里的X是真实数据前加了一列1,因为有theta(0)

2、梯度下降算法

代价函数对

20171225180645144.png求偏导得到:

20171225180645709.png

所以对theta的更新可以写为:

20171225180645437.png

其中

20171225180645509.png为学习速率,控制梯度下降的速度,一般取0.01,0.03,0.1,0.3.....

为什么梯度下降可以逐步减小代价函数?

假设函数f(x)

泰勒展开:f(x+△x)=f(x)+f'(x)*△x+o(△x),

令:△x=-α*f'(x) ,即负梯度方向乘以一个很小的步长α

将△x代入泰勒展开式中:f(x+x)=f(x)-α*[f'(x)]²+o(△x)

可以看出,α是取得很小的正数,[f'(x)]²也是正数,所以可以得出:f(x+△x)<=f(x)

所以沿着负梯度放下,函数在减小,多维情况一样。

# 梯度下降算法

def gradientDescent(X,y,theta,alpha,num_iters):

m = len(y)

n = len(theta)

temp = np.matrix(np.zeros((n,num_iters)))   # 暂存每次迭代计算的theta,转化为矩阵形式

J_history = np.zeros((num_iters,1)) #记录每次迭代计算的代价值

for i in range(num_iters):  # 遍历迭代次数

h = np.dot(X,theta)     # 计算内积,matrix可以直接乘

temp[:,i] = theta - ((alpha/m)*(np.dot(np.transpose(X),h-y)))   #梯度的计算

theta = temp[:,i]

J_history[i] = computerCost(X,y,theta)      #调用计算代价函数

print '.',

return theta,J_history

3、均值归一化

目的是使数据都缩放到一个范围内,便于使用梯度下降算法

20171225180645566.png

其中

20171225180645155.png为所有此feture数据的平均值

20171225180645881.png可以是最大值-最小值,也可以是这个feature对应的数据的标准差

实现代码:

# 归一化feature

def featureNormaliza(X):

X_norm = np.array(X)            #将X转化为numpy数组对象,才可以进行矩阵的运算

#定义所需变量

mu = np.zeros((1,X.shape[1]))

sigma = np.zeros((1,X.shape[1]))

mu = np.mean(X_norm,0)          # 求每一列的平均值(0指定为列,1代表行)

sigma = np.std(X_norm,0)        # 求每一列的标准差

for i in range(X.shape[1]):     # 遍历列

X_norm[:,i] = (X_norm[:,i]-mu[i])/sigma[i]  # 归一化

return X_norm,mu,sigma

注意预测的时候也需要均值归一化数据

4、最终运行结果

代价随迭代次数的变化

20171225180645492.png

5、使用scikit-learn库中的线性模型实现

导入包

from sklearn import linear_model

from sklearn.preprocessing import StandardScaler    #引入缩放的包

归一化

# 归一化操作

scaler = StandardScaler()

scaler.fit(X)

x_train = scaler.transform(X)

x_test = scaler.transform(np.array([1650,3]))

线性模型拟合

# 线性模型拟合

model = linear_model.LinearRegression()

model.fit(x_train, y)

预测

#预测结果

result = model.predict(x_test)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值