局部加权线性回归,线性回归高级版

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('\t')))
    print (len(open(fileName).readline().split('\t')))
    numFeat = len(open(fileName).readline().split('\t'))-1#因为最后一个是\n所以特征的数量要-1
    print (numFeat)
    dataMat = []; labelMat = []
    fr = open(fileName)
    fr.readline()
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        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次带高斯的回归..

posted on 2018-01-24 21:10  张博的博客  阅读(403)  评论(0编辑  收藏  举报

导航