机器学习---线性回归

一元线性回归模型

​ 一元线性回归顾名思义自变量的个数为1个,因变量的个数也是1个。需要我们根据训练数据去学得一个线性模型以尽可能的准确的预测实值的输出。
f ( x ) = w X + b f(x)=wX+b f(x)=wX+b
​ 那么我们如何去确定w和b的值呢?根据衡量预测值与实际值之间的区别,我们可以令均方误差最小化。基于这种均方误差最小化来进行模型求解的方法成为最小二乘法。

​ 对目标函数分别对w和b求导,并令导数为0,即可解出w和b的值。也可以使用梯度下降法,求出w和b。案例1为使用梯度下降法求解,案例2(鸢尾花)和案例3(波士顿房价)为使用sklearn封装好的函数去拟合。

###################################线性回归#########################################
#还是以y = wx + b为例
import matplotlib.pyplot as plt
 
x = [14.1,15.1,16.1,15.3,14.2,14.5,14.6,14.8,16.3,16.6,15.6,16.7,14.7,16.2,16.7,14.8,14.9,15.9,16.3,17.0,15.0,16.3,17.1,16.0,17.2,17.4,15.5,16.8,17.4,16.9]
y = [15.8,16.3,14.5,16.6,16.7,15.0,14.9,15.2,15.3,16.6,17.0,16.4,16.5,15.4,15.8,14.8,16.0,17.3,15.7,14.4,15.8,16.7,14.9,16.9,15.5,16.6,17.7,18.0,15.9,18.0]
#这里是我随便创造的数据,一共30个
 
#这里我将数据分为了训练集和测试集
x_train = x[0:20]
y_train = y[0:20]
 
x_test = x[20:]
y_test = y[20:]
 
#给参数w和b的初始值分别为1.0和-1.0,以及学习率为0.0001,求10000次参数
w_start = 1.0
b_start = -1.0
learn = 0.0001
times = 10000
 
for i in range(times):
    sum_w = 0
    sum_b = 0
    
    #这里就是我们的梯度下降法,通过它,使我们的损失函数变小,求出我们要的新参数w和b
    for i in range(len(x_train)):
        sum_w += (y_train[i] - w_start * x_train[i]-b_start) * (-x_train[i])
        sum_b += (y_train[i] - w_start * x_train[i]-b_start) * (-1)
    
    w_start = w_start - 2 * sum_w * learn
    b_start = b_start - 2 * sum_b * learn
 
plt.figure(figsize=(20,8))#改变图片大小
plt.scatter(x_train, y_train,c='r')#画出我们训练集的散点图
plt.plot([i for i in range(0,20)],[(w_start * i + b_start) for i in range(0,20)])#画出我们通过梯度下降法求出来的新的参数w,b的y = wx + b的直线图
plt.show()
 
#下面这里是为了检测我得出的线性回归模型理想程度
 
#这是训练集的所有真实数据与我模型(y=wx+b)相减得出来的误差值
total_train_loss = 0
for i in range(len(x_train)):
    y_hat = w_start * x_train[i] + b_start
    total_train_loss += (y_train[i] - y_hat) ** 2
print("训练集的误差:"+str(total_train_loss))
 
#这是测试集的所有真实数据与我模型(y=wx+b)相减得出来的误差值
total_test_loss = 0
for i in range(len(x_test)):
    y_hat = w_start * x_test[i] + b_start
    total_test_loss += (y_test[i] - y_hat) ** 2
print("测试集的误差:"+str(total_test_loss))
import numpy as np
import matplotlib.pyplot as plt
#用于线性回归的类
from sklearn.linear_model import LinearRegression
#用来切分训练集与测试集
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
#使用precision设置输出精度。默认为8,此处设置为2。
np.set_printoptions(precision=2)
#加载鸢尾花数据 其中包括data和target,data为鸢尾花的四个特征,target为鸢尾花的三个种类(0,1,2)
iris = load_iris()
#获取花瓣长度作为x,花瓣宽度作为y。
x = iris.data[:,2].reshape(-1,1)  #reshape函数可以将数据重新组织转化为1列n行
y = iris.data[:,3];
#LinearRegression()的参数如下:
#fit_intercept:是否有截据,如果没有则直线过原点;
#normalize:是否将数据归一化;
#copy_X:默认为True,当为True时,X会被copied,否则X将会被覆写;
#n_jobs:默认值为1。计算时使用的核数
lr = LinearRegression()  #创建一个回归对象
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)  #random_state随机数种子
#就好像是在系统中已经有了一个0~RAND_MAX的一个乱序序列,我们调用rand()的时候都是参照这个序列和随机种子的,这里没有设置随机种子,因此随机种子为1,当随机种子为x的时候,我们可以根据这个随机种子x来计算出一个随机数f(x, m),其中m为这个序列中的伪随机数。如果随机种子是固定的,那么每次调用rand()依然可以计算出来了。
#使用训练集数据,训练模型。
lr.fit(x_train, y_train)
print('权重:', lr.coef_)
print('截距:', lr.intercept_)
y_hat = lr.predict(x_test)
print('实际值:', y_test[:45])
print('预测值:', y_hat[:45])
sum = 0;
for i in range(0,len(y_hat)):
    sum = sum + (y_hat[i]-y_test[i])**2;
print('误差平方和为:',sum);
#plt.figure(figsize=(10,6));
plt.legend();
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.scatter(x_train,y_train,c='r',label='训练集');
plt.scatter(x_test,y_test,c='g',label='测试集');
plt.plot(x,x*lr.coef_+lr.intercept_,c='orange');
plt.xlabel('花瓣长度');
plt.ylabel('花瓣宽度');
plt.show();
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np;
boston = load_boston()
x = boston.data;
y = boston.target;
df = pd.DataFrame(np.concatenate([x, y.reshape(-1,1)], axis=1),columns = boston.feature_names.tolist()+['MEDV'])
print(df.head());
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0);
lr = LinearRegression();
lr.fit(x_train,y_train);
y_hat = lr.predict(x_test);
sum = 0;
for i in range(0,len(y_hat)):
    sum = sum + (y_hat[i]-y_test[i])**2;
print('误差平方和为:',sum);
plt.legend();
plt.rcParams['font.sans-serif']=['SimHei'];
plt.rcParams['axes.unicode_minus']=False;
plt.plot(y_test,c='r',label='实际值');
plt.plot(y_hat,c='b',label='预测值');
plt.show();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值