zoukankan      html  css  js  c++  java
  • 转载: scikit-learn学习之回归分析

    目录(?)[+]

    ======================================================================
    本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正   

    ======================================================================

    另外一篇基于《机器学习实战》的Logistic回归分析的博客请参考:点击阅读,其主要是采用Python代码实现回归模型

    还有一篇是纯实战案例博客请参考 ,Logistic回归模型案例实战:《机器学习实战》Logistic回归算法(2)


    目录:

    1、概念

    2、简单线性回归(Simple Liner Regession)

    3、元性回归(Mutiple Regession)

    4、非线性回归(Logistic Regession)


    一:概念            

    1:集中趋势衡量

            1.1均值(平均值,平均数)(mean)
            1.2中位数(median):将数据中的所有数按大小排列顺序,位于中间的拿个书就是中位数
                    个数为奇数,取中间值
                    个数为偶数,取中间两个数的平均值
            1.3众数:数据中出现最多的数

    2:离散程度的衡量

            2.1方差(variance)
            2.2标准差(standard deviation)


    3:回归中的相关度

         3.1:皮尔逊相关度
         衡量两个相关强度的量,取值范围是[-1,1],计算公式为:

    4:R平方值

    决定系数(可决系数,拟合优度),反应因变量的全部变异能通过回归关系被自变量解释的比例,取值范围[0,1],可决系数越大,说明在总变差中由模型作出了解释的部分占的比重越大,模型拟合优度越好。反之可决系数小,说明模型对样本观测值的拟合程度越差。
    描述:如R平方为0.8,则表示回归关系可以解释因变量80%的变异,换句话说,如果我们能控制自变量不变,则因变量变异程度将会减少80%
    对于 简单线性回归来说,R^2= r * r
    对于多元线性回归来说,
    SSR表示由模型引起的误差平方和,SST表示由实际值引起的差值平方和
     
    R平方也有局限性,会随着自变量的增大而增大
    一个关于相关系数的BBS:http://bbs.pinggu.org/thread-3034786-1-1.html


    5:皮尔逊相关系数和R平方值计算示例

    [python] view plain copy 在CODE上查看代码片派生到我的代码片
    1. #coding:utf-8  
    2. ''''' 
    3. Created on 2015年11月8日 
    4.  
    5. @author: Administrator 
    6. '''  
    7. import numpy as np  
    8. import math  
    9.   
    10. #求解皮尔逊相关系数  
    11. def computeCorrelation(X, Y):  
    12.     xBar = np.mean(X)  
    13.     yBar = np.mean(Y)  
    14.     SSR = 0  
    15.     varX = 0  
    16.     varY = 0  
    17.     for i in range(0, len(X)):  
    18.         #对应分子部分  
    19.         diffXXBar = X[i] - xBar  
    20.         diffYYBar = Y[i] - yBar  
    21.         SSR +=(diffXXBar * diffYYBar)  
    22.         #对应分母求和部分  
    23.         varX += diffXXBar**2  
    24.         varY += diffYYBar**2  
    25.     SST = math.sqrt(varX * varY)  
    26.     return SSR/SST  
    27.   
    28. def polyfit(x, y, degree):  
    29.     results = {}  
    30.     #coeffs 为相关系数,x自变量,y因变量,degree为最高幂  
    31.     coeffs = np.polyfit(x, y, degree)  
    32.       
    33.     #定义一个字典存放值,值为相关系数list  
    34.     results['polynomial'] = coeffs.tolist()  
    35.       
    36.     #p相当于直线方程  
    37.     p = np.poly1d(coeffs)    
    38.     yhat = p(x)  #传入x,计算预测值为yhat  
    39.       
    40.     ybar = np.sum(y)/len(y)  #计算均值      
    41.     #对应公式  
    42.     ssreg = np.sum((yhat - ybar) ** 2)  
    43.     sstot = np.sum((y - ybar) ** 2)  
    44.     results['determination'] = ssreg / sstot  
    45.   
    46.     print" results :",results  
    47.     return results  
    48.   
    49.   
    50.   
    51. testX = [1, 3, 8, 7, 9]  
    52. testY = [10, 12, 24, 21, 34]  
    53.   
    54. #输出的是简单线性回归的皮尔逊相关度和R平方值  
    55. print "r : ",computeCorrelation(testX, testY)  
    56. print "r^2 : ",str(computeCorrelation(testX, testY)**2)  
    57.   
    58. #  
    59. print polyfit(testX, testY, 1)["determination"]  

    结果显示为:


    二:简单线性回归


    1:回归与分类的区别

           回归(regession):Y变量为连续型数值,如房价,人数,降雨量
           分类(classification):Y变量为类别型,如颜色类别,电脑品牌,有无信誉


    2:简单线性回归介绍

           回归分析:是指建立方程模拟两个或者多个变量之间如何关联
           回归模型:是指被用来描述因变量(y)和自变量(x)以及偏差(error)之间的关系的方程,函数表示为:
                           
           简单线性回归方程:模型转变为即为回归方程(类似于一条直线,参数为斜率和y轴的交点)
           线性关系包含:正相关,负相关,无关
           估计线性方程:
                           
           关于偏差:

    3:简单线性回归示例

    [python] view plain copy 在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf8  
    2. ''''' 
    3. Created on 2016年4月24日 
    4.  
    5. @author: Gamer Think 
    6. '''  
    7. #Simple Regession  
    8. import numpy as np  
    9.   
    10. #周广告播放数量  
    11. x = [1,3,2,1,3]  
    12. #周汽车销售数据  
    13. y = [14,24,18,17,27]  
    14.   
    15. #使用最小二乘法  
    16. def fitSLR(x,y):  
    17.     n = len(x)  
    18.     denominator  = 0  
    19.     numerator = 0  
    20.     for i in range(0,n):  
    21.         numerator += (x[i]-np.mean(x)* (y[i]-np.mean(y)) )  
    22.         denominator += (x[i]-np.mean(x))**2  
    23.       
    24.     print "denominator:",denominator  
    25.     print "numerator:",numerator  
    26.       
    27.     b1 = numerator/float(denominator)  
    28. #     b0 = np.mean(y)/float(np.mean(x))   
    29.     b0 = np.mean(y)-b1*np.mean(x)  
    30.       
    31.     return b0,b1  
    32.   
    33. def predict(b0,b1,x):  
    34.     return b0+b1*x  
    35.   
    36. b0,b1 = fitSLR(x,y)  
    37.   
    38. x_test = 6  
    39. print "y_test:",predict(b0,b1,x_test)</span></span>  

    :多元性回归

    1:多元回归简介
            与简单线性回归的区别:有多个变量x
            多元回归模型:
    多元回归方程:
    估计多元回归方程:(y变成y_hat,即求得是估计值)
    估计方法:
    2:多元线性回归示例

                                                                   
                         我们需要的数据是第二,三,四列的数据
     
    [python] view plain copy 在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8  
    2. ''''' 
    3. Created on 2016年4月24日 
    4.  
    5. @author: Gamer Think 
    6. '''  
    7. from sklearn import linear_model  
    8. import numpy as np  
    9. from numpy import genfromtxt #可以将非array格式的list转化为array  
    10.   
    11. datapath = "data.csv"  
    12. deliverData = genfromtxt(datapath,delimiter=",") #将csv文件转化为numpy.array格式  
    13.   
    14. print "data:",deliverData  
    15.   
    16. X= deliverData[:,:-1]  
    17. Y = deliverData[:,-1]  
    18. print "X:",X  
    19. print "Y:",Y  
    20.   
    21. regr = linear_model.LinearRegression()  
    22. regr.fit(X,Y)  
    23.   
    24. print "coefficients:",regr.coef_        #与X结合的值  
    25. print "intercept:",regr.intercept_         #类似于截距  
    26.   
    27. x_pre = [102,6]  
    28. y_pre = regr.predict(x_pre)  
    29. print "Y-Predict:",y_pre  
    30. </span></span>  

    3:如果自变量中有分类型变量(categorical data),如何处理?
         e g:
                  

                   首先将分类型变量进行转化为如下形式(第四五六列表示0,1,2,为1表示使用该型号车)
                 
                 调用的代码其实和上边的是一样的:
    [python] view plain copy 在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;font-size:18px;">#coding:utf-8  
    2. ''''' 
    3. Created on 2016年4月24日 
    4.  
    5. @author: Gamer Think 
    6. '''  
    7. from numpy import genfromtxt  
    8. import numpy as np  
    9. from sklearn import datasets, linear_model  
    10.   
    11. dataPath = "dataDumpy.csv"  
    12. deleveryData = genfromtxt(dataPath, delimiter=',')  
    13.   
    14. print "data: ",deleveryData  
    15.   
    16. X = deleveryData[:, :-1]  
    17. Y = deleveryData[:, -1]  
    18. print "X: ",X  
    19. print "Y: ",Y  
    20.    
    21. regr = linear_model.LinearRegression()  
    22. regr.fit(X, Y)  
    23.    
    24. print "Coefficients:",regr.coef_  #与X结合的值  
    25. print "Intercept:",regr.intercept_ #类似于截距  
    26. #   
    27. xPred = [102,6,0,0,1]  
    28. yPred = regr.predict(xPred)  
    29. print "predict y : ",yPred</span></span>  


     4:关于误差


     

    四:非线性回归

        非线性回归又称为逻辑回归

    1:概率

         对一件事情发生可能性的衡量,取值范围是0~1,计算方法包括,个人置信,历史数据,模拟数据
         条件概率:
       


    非线性回归实例:

    [python] view plain copy 在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8  
    2. ''''' 
    3. Created on 2016年4月24日 
    4.  
    5. @author: Gamer Think 
    6. '''  
    7. import numpy as np  
    8. import random  
    9.   
    10. ''''' 
    11. 梯度下降算法 
    12. 参数说明:X,Y 
    13. theta:一组向量和x相乘的一组值 
    14. alpha:梯度下降时的参数,即每一步下降多少 
    15. m:实例的个数 
    16. numIteration:迭代计算的次数,可以理解为梯度下降多少步 
    17. '''  
    18. def gradientDescent(X,Y,theta,alpha,m,numIteration):  
    19.     x_trains = X.transpose()  #X的转置矩阵  
    20.     for i in range(0,numIteration):      
    21.         hypothesis = np.dot(X,theta)      #内积形式,X与theta的乘积  ,求出y的估计值  
    22.         loss = hypothesis - Y             #估计值与真实值之间的差  
    23.           
    24.         #通用的梯度下降算法,和logistic Regession中所描述的cost函数不一致  
    25.         cos = np.sum(loss**2)/(2*m)  
    26.         print "Iteration %d | Cost:%f" % (i,cos)  
    27.           
    28.         gradient = np.dot(x_trains,loss)/m  
    29.         theta = theta - alpha*gradient  
    30.           
    31.     return theta  
    32.   
    33.   
    34. ''''' 
    35. numPoints : 点的个数 
    36. bias :偏好ֵ 
    37. variance : 统计学概念, 偏差和 
    38. 产生样本点和对应的标签  
    39. '''  
    40. def genData(numPoints,bias,variance):  
    41.     X = np.zeros(shape=(numPoints,2))     #归类的数据  
    42.     Y = np.zeros(shape=numPoints)         #归类的标签  
    43.       
    44.     for i in range(0,numPoints):   #从0~len(numPoints)-1执行如下  
    45.         X[i][0] = 1  
    46.         X[i][1] = i  
    47.         #制造target数据  
    48.         Y[i] = (i+bias) + random.uniform(0,1)*variance  
    49.           
    50.     return X,Y  
    51.   
    52. X,Y = genData(100, 25, 10)  
    53. # print  "X:",X  
    54. # print  "Y:",Y  
    55.   
    56. m, n = np.shape(X)  
    57. n_y = np.shape(Y)  
    58.   
    59. # print "x shape :", m, "  ", n  
    60. # print "y length :",n_y  
    61.   
    62. numIterations =100000  
    63. alpha = 0.0005  
    64. theta = np.ones(n)  
    65. theta = gradientDescent(X, Y, theta, alpha, m, numIterations)  
    66.   
    67. print "theta: " ,theta  
    68.   
    69. </span></span>  

    点击 进入个人在有道云笔记的回归分析相关,感兴趣的可以看一下
  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/harvey888/p/5852757.html
Copyright © 2011-2022 走看看