机器学习之一:线性回归

1、线性回归的原理

    线性回归类似拟合出一条广义直线最佳匹配训练集中的所有数据,一般用最小二乘法求解。它指的是拟合出的广义直线代表的真实值和观测到的数据的误差的平方和最小的一条直线。最小二乘法将最优问题转化为函数求极值问题。
数学形式:
y=θ0+θ1x1+θ2x2+...+θnxn,y⊂Ry= \theta_0+\theta_1x_1+\theta_2x_2+...+\theta_n x_n,y\subset Ry=θ0+θ1x1+θ2x2+...+θnxnyR
矩阵形式:
Y=Xθ,Y⊂RkY=X\theta ,Y \subset R^kY=XθYRk
其中X矩阵是k行n+1列的,每一行是一个样本点,每一列是样本的某一个特征。
X=(1x11x12...x1n1x21x22...x2n......1xk1xk2...xkn)θ=(θ0θ1θ2...θn)X=\begin{pmatrix} 1&x_1^1&x_1^2&...&x_1^n\\ 1&x_2^1&x_2^2&...&x_2^n\\...\\...\\1&x_k^1&x_k^2&...&x_k^n\end{pmatrix} \theta=\begin{pmatrix} \theta_0\\\theta_1 \\\theta_2\\...\\\theta_n\end{pmatrix}X=11......1x11x21xk1x12x22xk2.........x1nx2nxknθ=θ0θ1θ2...θn
线性回归可以理解为争取让所有的样本点都落在直线上,即所有样本点和直线的距离很近,因此代价函数为:
minf(x)=∣∣Xθ−Y∣∣2 minf(x)=||X\theta-Y||^2minf(x)=XθY2
利用最小二乘法可以获得代价函数的解析表达式:
θ=(XTX)−1XTY \theta=(X^TX)^{-1}X^TYθ=(XTX)1XTY
线性回归优点:实现简单,计算简单;
线性回归缺点:不能拟合非线性数据;

2、线性回归代码实现:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model

X_parameters=[[1],[2],[3],[4],[5]]
Y_parameters=[[4],[5],[6],[7],[8]]
predict_value=6
regr = linear_model.LinearRegression()                   # 线性模型的使用
regr.fit(X_parameters, Y_parameters)                     # 对参数进行拟合
predict_outcome = regr.predict(predict_value)            # 产生预测值
theta0=regr.intercept_                                   # Intercept value:偏差值
theta1=regr.coef_                                        # coefficient value:权重值
plt.scatter(X_parameters,Y_parameters,color='blue')
plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)
>>plt.show()

这里写图片描述

3、多项式回归代码实现

import numpy as np  
import matplotlib.pyplot as plt  
import matplotlib.mlab as mlab
from sklearn import datasets, linear_model
from scipy.optimize import leastsq

 #样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([1,2,3,4,5,6])
Yi=np.array([9.1,18.3,32,47,69.5,94.8])
'''
    1设定拟合函数和偏差函数
    2函数的形状确定过程:先画样本图像,再根据样本图像大致形状确定函数形式(直线、抛物线、正弦余弦等)
'''
   #需要拟合的函数func:指定函数的形状,可以为二次函数,三次函数......多次函数,次数越高系数越多
def func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
   #偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(p,x,y):
    return func(p,x)-y
'''    
    1.leastsq函数的返回值tuple,第一个元素是求解结果,第二个是求解的代价值(个人理解)
    2.官网的原话(第二个值):Value of the cost function at the solution
    3.实例:Para=>(array([ 0.61349535,  1.79409255]), 3)
    4.返回值元组中第一个值的数量跟需要求解的参数的数量一致
'''
   #k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[10,10,10]
   #把error函数中除了p0以外的参数打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
   #读取结果
a,b,c=Para[0]
print("a=",a,"b=",b,"c=",c)
print("cost:"+str(Para[1]))
print("求解的拟合直线为:")
print("y="+str(round(a,2))+"x*x+"+str(round(b,2))+"x+"+str(c))
plt.scatter(Xi,Yi,color="green",linewidth=2) 
x=np.linspace(0,12,100) ##在0-15直接画100个连续点
y=a*x*x+b*x+c ##函数式
plt.plot(x,y,color="red",linewidth=2) 
plt.show()

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值