线性回归Boston_HousePrice(梯度下降法)

代码部分

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

#把数据集转化成pandas的形式,在列尾加上房价PRICE
boston_dataset= datasets.load_boston()  # 导入波士顿房价数据
'''
print(boston.keys())  # 查看键(属性)     ['data','target','feature_names','DESCR', 'filename']
print(boston_dataset.feature_names)# 查看有哪些特征 这里共13种
print(boston_dataset.data.shape) #特征形状
print(boston_dataset.target.shape) #目标形状
'''      
data=pd.DataFrame(boston_dataset.data)
data.columns=boston_dataset.feature_names
data['PRICE']=boston_dataset.target 
print(data)
#取出房间数和房价并转化成矩阵形式
x=data.loc[:,'RM'].as_matrix(columns=None) #pandas按label选择数据,并转化成数组形式,column=None则选择所有数据
y=data.loc[:,'PRICE'].as_matrix(columns=None)
#矩阵转置
m=len(x)
x0=np.full(m,1.0)
z=np.vstack([x0,x]).T
y=np.array([y]).T
x=np.array([x]).T
print(x.T,y.T)
#训练线性模型
#l=LinearRegression()
#l.fit(x,y)
#两种终止条件
loop_max=10000 #最大迭代次数
epsilon=1e-3 #deta theta的精度要求
#初始化权值
np.random.seed(0)  #随机数种子,固定参数后,之后调用随机值函数得到的随机数相同
theta=np.random.randn(2)
alpha=0.000005  #步长(学习率)
diff=0.
error=np.zeros(2)
count=0  #循环次数
finish=0  #终止标志
#梯度下降调参theta
while count < loop_max:
    count+=1
    sum_m=np.zeros(2)
    for i in range(m):
        dif=(np.dot(theta,z[i])-y[i])*z[i]  #对loss函数求梯度
        sum_m=sum_m+dif
    theta=theta-alpha*sum_m #更新参数
    #判断是否已收敛
    if np.linalg.norm(theta-error)<epsilon:
        finish=1
        break
    else:
        error=theta
    print('loop count=%d' % count,'\tw:',theta)
print('loop count=%d' % count,'\tw:',theta)
#可视化
plt.scatter(x,y,s=10,alpha=0.3,c='green')
plt.plot(x,theta[1]*x+theta[0],c='blue',linewidth='1')
plt.xlabel("Number of Rooms")
plt.ylabel("House Price")
plt.show()

运行结果

在这里插入图片描述

注意事项

数据处理

1.np.dot
若二维则做矩阵乘法,若一维则视为向量点乘
在这里插入图片描述
2.np.vatack()&np.hastack()
np.vatack()垂直合并同维数组
np.hastack()水平合并同维数组
在这里插入图片描述

参数调整

1.主要调整学习率,多次试验
alpha=0.000005 #步长(学习率)

理解

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值