代码部分
# -*- 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 #步长(学习率)