Python机器学习之非线性回归

  非线性回归相较于线性回归而言,总带有一丢丢复杂的神秘感。关于线性回归模型相信各位已耳熟能详,因此这里主要讨论非线性回归模型。其实非线性回归中很大一部分是基于多项式的回归模型,即利用曲线方程代替直线方程拟合坐标图上各点,使得各点到曲线的距离总和最短。
  一元m次多项式回归方程为:

图片名称

  二元二次多项式回归方程为:

图片名称

  多项式回归的最大优点就是可以通过增加x的高次项对实测点进行逼近,直至满意为止。事实上,多项式回归可以处理很大一类非线性问题,它在分析中占有重要的地位,因为任何一个函数都可以分段用多项式来逼近。
  举一个房屋价格与房屋尺寸非线性拟合的实例,数据集下载地址:prices.txt

· 算法构建代码

# python -version 3.5+   
import matplotlib.pyplot as plt    
import numpy as np    
from sklearn import linear_model   
from sklearn.preprocessing import PolynomialFeatures   

# 读取数据集
datasets_X = [] #建立datasets_X储存房屋尺寸数据
datasets_Y = [] #建立datasets_Y储存房屋成交价格数据
fr = open('E:\\prices.txt', 'r', encoding='utf-8') #指定prices.txt数据集所在路径
lines = fr.readlines() #读取一整个文件夹
for line in lines: #逐行读取,循环遍历所有数据
    items = line.strip().split(",") #变量之间按逗号进行分隔
    datasets_X.append(int(items[0])) #读取的数据转换为int型
    datasets_Y.append(int(items[1]))

# 数据预处理
length = len(datasets_X)
datasets_X = np.array(datasets_X).reshape([length, 1]) #将datasets_X转化为数组
datasets_Y = np.array(datasets_Y)
minX = min(datasets_X) #以数据datasets_X的最大值和最小值为范围,建立等差数列,方便后续画图
maxX = max(datasets_X)
X = np.arange(minX, maxX).reshape([-1, 1])

# 数据建模
poly_reg = PolynomialFeatures(degree=2) #degree=2表示二次多项式
X_poly = poly_reg.fit_transform(datasets_X) #构造datasets_X二次多项式特征X_poly
lin_reg_2 = linear_model.LinearRegression() #创建线性回归模型
lin_reg_2.fit(X_poly, datasets_Y) #使用线性回归模型学习X_poly和datasets_Y之间的映射关系

· 测试结果代码

# 查看回归系数
print('Coefficients:',lin_reg_2.coef_)
# 查看截距项
print('intercept:',lin_reg_2.intercept_)  

# 数据可视化
plt.scatter(datasets_X, datasets_Y, color='orange')   
plt.plot(X, lin_reg_2.predict(poly_reg.fit_transform(X)), color='blue')   
plt.xlabel('Area')   
plt.ylabel('Price')   
plt.show()   

· 部分结果展示

相关系数Coefficients: [  0.00000000e+00   4.93982848e-02   1.89186822e-05]     
截距项intercept: 151.846967505     
非线性回归公式:Y = 151.8470 + 4.9398e-02*x + 1.8919e-05*x^2

非线性拟合图:

图片名称

分类: 机器学习算法