zoukankan      html  css  js  c++  java
  • 局部加权线性回归,线性回归高级版

    http://www.cnblogs.com/mooba/p/5947161.html

    本来不想乱改别人的,但是他的不对,跑不出来有错误

    我自己做了个数据

    height weight
    1.5 50
    1.5 60
    1.5 70
    1.6 98
    1.9 89
    2.0 120
    2.5 54
    0.2 5
    1 20

    __author__ = 'abel'
    import matplotlib.pyplot as plt  
    import numpy as np  
    import scipy as sp  
    from scipy.stats import norm   #正态分布 他妈的还以为是度量..
    from sklearn.pipeline import Pipeline  
    from sklearn.linear_model import LinearRegression  
    from sklearn.preprocessing import PolynomialFeatures  
    from sklearn import linear_model  
    # -*- coding: utf-8 -*-
    """
    author: Alan
    date:2016/4/3
    局部加权线性回归,参考《机器学习实战》
    """
    from numpy import *
    def loadDataSet():
        fileName = '新建文本文.txt'
        print ((open(fileName).readline().split('	')))
        print (len(open(fileName).readline().split('	')))
        numFeat = len(open(fileName).readline().split('	'))-1#因为最后一个是
    所以特征的数量要-1
        print (numFeat)
        dataMat = []; labelMat = []
        fr = open(fileName)
        fr.readline()
        for line in fr.readlines():
            lineArr = []
            curLine = line.strip().split('	')
            for i in range(numFeat-1):
                lineArr.append(float(curLine[i]))
            dataMat.append(lineArr)
            labelMat.append(float(curLine[-1]))
            
        return dataMat, labelMat
    
    
    
    def lwlr(testPoint, xArr, yArr, k = 1.0):
        '''
        the algorithm of lwlr
        其实整个算法的本质就在于这个cross function的书写.
        而他之所以效果好就是因为他有一个testPoint这个点的使用,导致他是一个非参数学习.
        每一次都需要给定这个你要预测的点X,来让算法重新生成关于这个预测值的有关联最大的训练集来生成最适合这个
        预测点的算法的 参数.继续说就是用于预测点足够进的值来进行加权LR.这个加权比值用k来控制.
        '''
        xMat = mat(xArr); yMat = mat(yArr).T
        m = shape(xMat)[0]#样本个数
        weights = mat(eye(m))#单位矩阵,用于存储权重
        for j in range(m):
            diffMat = testPoint - xMat[j]
            weights[j, j] = exp(diffMat * diffMat.T/(-2.0*k**2))#用高斯核求权重
        xTx = xMat.T * (weights * xMat) #括号里面是把样本乘以对应的权重
        
        ws = linalg.pinv(xTx) * (xMat.T * (weights * yMat))
        return testPoint * ws
    
    def lwlrTest(testArr, xArr, yArr,k):
        num = shape(testArr)[0]
        print (num)
        yHat = zeros(num)#存储预测的label
        for i in range(num):
            yHat[i] = lwlr(testArr[i], xArr, yArr, k)
        print (yHat)
        print (666666)
        return yHat
    #绘制估计的点和原始点的对比图    
    #k控制训练点距离查询点的衰减速率,越小,衰减越快
    def rmse(y_test, y):  
        return sp.sqrt(sp.mean((y_test - y) ** 2))  
    def plotData(k):
        xArr, yArr = loadDataSet()
        print (xArr)
        print (yArr)
        #用lwlr对整个数据集进行估计
        yHat = lwlrTest(xArr, xArr, yArr, k )
        print (rmse(yHat,yArr))
        degree=[4]
        for d in degree:  
           clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
                        ('linear', LinearRegression(fit_intercept=True))])  #这个fit_intercept一般选True效果更好
           clf.fit(xArr,yArr)
           y=clf.predict(xArr)
        print (rmse(y,yArr))   
        #
    plotData(0.1)#直接这一句就够了,利用函数自动调用其他函数 1是加权系数
    #经过上面测试4次函数都没有这个高斯加权回归效果好,真心叼,缺陷就是比较慢

     话说感觉可以改成2次的么,2次带高斯的回归..

  • 相关阅读:
    NSURLConnection的异步请求方式
    <iOS>关于Xcode上的Other linker flags
    使用十六进制色值表示UIColor
    kubernetes & docker
    01 docker的安装与基本使用
    08 数组
    07 grep 正则
    06 信号处理和expect
    05 函数
    04 流程控制
  • 原文地址:https://www.cnblogs.com/zhangbo2008/p/8343580.html
Copyright © 2011-2022 走看看