线性回归

机器学习主要分为有监督问题(有label标签)和无监督问题(无label标签)

回归分类的区别在于:回归问题,最终的预测结果是具体数值,而非类别;分类问题,最终的预测结果属于类别1或者类别0。

简单线性回归:

(1)做决定的过程通常是根据两个或多个变量之间的关系

(2)回归分析用来建立方程模拟两个或多个变量之间如何关联

(3)简单线性回归包含一个自变量x和一个因变量y,两个变量的关系用一条直线模拟。

(4)若包含大于等于两个自变量,叫多元回归分析。

简单线性回归模型:

其中β0和β1是参数,需要求出来。

ε是偏差,且值是独立的,满足正态分布且均值等于0.

简单线性回归方程:

E(y)是y的期望值(均值)。

估计的简单线性回归方程:

其中,因变量是y的估计值,b0是β0的估计值,b1是β1的估计值.

简单线性回归模型举例:
汽车卖家做电视广告数量与卖出的汽车数量:
广告数量x 卖出的车y
1 14
3 24
2 18
1 17
3 27

 

 

 

 

如何用样本求得线性回归方程 

衡量模型的好坏是:

括号中前者为真实值,后者为估计值,所以需使上式值最小,求得:

我们用python求其线性回归方程,并预测假设有一周广告数量为6,预测的汽车销售量是多少?

# -*- encoding=utf-8 -*-
#简单线性回归:只有一个自变量 y=k*x+b 预测使 (y-y*)^2  最小
import numpy as np

def fitSLR(x,y):
    n=len(x)
    dinominator = 0
    numerator=0
    for i in range(0,n):
        numerator += (x[i]-np.mean(x))*(y[i]-np.mean(y))
        dinominator += (x[i]-np.mean(x))**2
        
    print("numerator:"+str(numerator))
    print("dinominator:"+str(dinominator))
    
    b1 = numerator/float(dinominator)
    b0 = np.mean(y)/float(np.mean(x))
    
    return b0,b1

# y= b0+x*b1
def prefict(x,b0,b1):
    return b0+x*b1

x=[1,3,2,1,3]
y=[14,24,18,17,27]

b0,b1=fitSLR(x, y)
print('b0='+str(b0))
print('b1='+str(b1))
y_predict = prefict(6,b0,b1)
print("y_predict:"+str(y_predict))

求得:b0=10,b1=5,一周广告数量为6时,预测的汽车销售量是40

 

另一个例子:

银行可贷款额度与工资年龄的关系
工资 年龄 额度
4000 25 20000
8000 30 70000
5000 28 35000
7500 33 50000
12000 40 85000

 

 

 

 

 

 

 

 工资和年龄是特征,我们定义工资为x1,年龄为x2。

目标是预测银行会贷款多少钱。表中的额度是标签。

工资和年龄都会影响最终银行贷款的结果,这个影响因子我们定义为θ1(工资对额度的影响),θ2(年龄对额度的影响),相当于权重。

针对这个例子,用线性回归进行解释:

X1,X2就是我们的两个特征(年龄,工资),Y是银行最终会借多少钱。

找到最合适的一条线(想象一个高维)来最好的拟合我们的数据点。

拟合的平面,其中θ0为偏置项:

 

hθ(x)是预测值,表示银行贷款的额度。

整合上式为:

真实值和预测值之间存在的误差用ε表示。

对于每个样本:

           (1)

其中y(i)表示真实值,θTx(i)表示预测值,ε是误差。

误差ε(i)是独立且具有相同的分布,并且服从均值为0(μ=0)方差为θ2的高斯分布(就是正态分布)。

独立是说样本间(如张三和李四)是单独的,不会相互影响;同分布是说他俩都来的是该银行,符合这个模型。

因为误差服从高斯分布,所以:

    (2)

将(1)带入(2):

 θ是要找的参数,L(θ)是似然函数,m表示样本数:求其最大值

将似然函数L(θ)变成对数似然(因为乘法难解,加法比较容易,对数里面的乘法可以转化为加法):

展开化简:

 (3)

目标函数:

其中y(i)是真实值,θTx(i)是预测值,就是要让其差值尽可能小,也就是目标函数求最小值。

 简易线性回归代码实现:

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets #sklearn是python的机器学习库,导入数据集
class LinearRegression():
    def __init__(self):
        self.w = None

    def fit(self, X, y):
        X = np.insert(X, 0, 1, axis=1)  #定义权重西塔0的x为1
        print (X.shape)        
        X_ = np.linalg.inv(X.T.dot(X))
        self.w = X_.dot(X.T).dot(y)  #权重西塔值,公式结果
        

    def predict(self, X):
        # Insert constant ones for bias weights
        X = np.insert(X, 0, 1, axis=1)
        y_pred = X.dot(self.w)
        return y_pred
def mean_squared_error(y_true, y_pred):
    mse = np.mean(np.power(y_true - y_pred, 2))
    return mse
def main():
    # Load the diabetes dataset
    diabetes = datasets.load_diabetes()

    # Use only one feature
    X = diabetes.data[:, np.newaxis, 2]
    print (X.shape)
    # Split the data into training/testing sets
    x_train, x_test = X[:-20], X[-20:]

    # Split the targets into training/testing sets
    y_train, y_test = diabetes.target[:-20], diabetes.target[-20:]

    clf = LinearRegression()
    clf.fit(x_train, y_train)
    y_pred = clf.predict(x_test)

    # Print the mean squared error
    print ("Mean Squared Error:", mean_squared_error(y_test, y_pred))

    # Plot the results
    plt.scatter(x_test[:,0], y_test,  color='black')
    plt.plot(x_test[:,0], y_pred, color='blue', linewidth=3)
    plt.show()
main()

运行结果:

 

posted @ 2017-10-18 11:18  十二Zh  阅读(847)  评论(0)    收藏  举报