机器学习:线性回归

2018-10-08  22:40:48

 
线性回归(Linear Regression)是机器学习中最经典、最简单的线性模型。也是西瓜书中介绍的第一个模型。
 

1. 原理

西瓜书中LR的定义是:给定数集D={(x1,y1),(x2,y2),...,(xm,ym)},其中xi=(xi1;xi2;...;xid),yi属于R。LR试图学得一个线性模型以尽可能准确地预测实值输出标记。
 
最简单的情况是只有一个自变量x和一个因变更y的数据集,此时LR试图学得:f(xi)=wxi+b,使得f(xi)≈yi
 
均方误差是LR最常用的性能度量。基于均方误差最小化来进行模型求解的方法是“最小二乘法”(least square method)。在LR中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
 
下面以鸢尾花数据集来进行一元线性回归模型的搭建。
 

2. 纯python实现

以Iris数据为例,进行LR编程。
为了完成一元线性回归,仅取iris.csv的前两列
 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

"""一元线性拟合
采用的拟合数据为iris.csv的前两列:SepalLength,SepalWidth
""" 
 
#拟合曲线参数计算
def liner_fitting(data_x,data_y):
      size = len(data_x);
      i=0
      sum_xy=0
      sum_y=0
      sum_x=0
      sum_sqare_x=0
      average_x=0;
      average_y=0;
      while i<size:
          sum_xy+=data_x[i]*data_y[i];
          sum_y+=data_y[i]
          sum_x+=data_x[i]
          sum_sqare_x+=data_x[i]*data_x[i]
          i+=1
      average_x=sum_x/size
      average_y=sum_y/size
      return_k=(size*sum_xy-sum_x*sum_y)/(size*sum_sqare_x-sum_x*sum_x)
      return_b=average_y-average_x*return_k
      return [return_k,return_b]
 
 
#完成完后曲线上相应的函数值的计算
def calculate(data_x,k,b):
    datay=[]
    for x in data_x:
        datay.append(k*x+b)
    return datay


#绘制数据点和拟合后的直线
def draw(data_x,data_y_new,data_y_old):
    plt.plot(data_x,data_y_new,color="black",label='LR')
    plt.scatter(data_x,data_y_old)
    plt.xlabel('SepalLength',size=14)
    plt.ylabel('SepalWidth',size=14) plt.title(
"Linear Regression") plt.legend(loc="upper left") plt.show() def createdata(): df = pd.read_csv('e:/00__python/iris.csv') datax = np.array(df[['SepalLength']]).tolist() datay = np.array(df[['SepalWidth']]).tolist() datax_list = [i for item in datax for i in item] datay_list = [i for item in datay for i in item] return datax_list, datay_list datax,datay = createdata() parameter = liner_fitting(datax,datay) draw_data = calculate(datax,parameter[0],parameter[1]) draw(datax,draw_data,datay)

3. Sklearn实现

利用Sklearn的LinearRegression,sklearn内置了iris的处理函数,代码编写也会方便很多。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import LinearRegression

#导入鸢尾花数据集并获取前两列数据,分别存储至x1和y1数组
irisD = load_iris()
x1 = [n[0] for n in irisD.data]
y1 = [n[1] for n in irisD.data]
x = np.array(x).reshape(len(x),1)
y = np.array(y).reshape(len(y),1)

#直接用线性回归模型,进行训练和预测
clf = LinearRegression()
clf.fit(x,y)
pre = clf.predict(x)

#第三步 调用Matplotlib扩展包并绘制相关图形
plt.scatter(x,y,s=15,marker='x')
plt.plot(x,pre,color="r",linewidth=2,label='LR')
plt.title("Linear Regression")
plt.xlabel('SepalLength',size=14)
plt.ylabel('SepalWidth',size=14)
plt.show()

 
原文地址:https://www.cnblogs.com/marathoner/p/9760428.html