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>  

    点击 进入个人在有道云笔记的回归分析相关,感兴趣的可以看一下
  • 相关阅读:
    Java知多少(下)
    Java知多少(112)数据库之删除记录
    Java知多少(111)数据库之修改记录
    Java知多少(110)数据库之插入记录
    Java知多少(109)数据库更新
    Java知多少(108)数据库查询简介
    C# Linq处理list数据
    vs2008 使用百度编辑器
    HTTP 错误 500.19
    联想R720面板右下部分按压后和上面按键串联了
  • 原文地址:https://www.cnblogs.com/harvey888/p/5852757.html
Copyright © 2011-2022 走看看