Machine Learning学习之岭回归

最小二乘法

#coding=utf8
from numpy import *
class Min2c:
      def __init__(self,data):
            self.data=data
            self.result=self.__min2c()
      def __min2c(self):
            self.Y=mat([self.data[i][1] for i in range(len(self.data))])
            self.X=mat([([1]+self.data[i][0]) for i in range(len(self.data))])
            #print Y
            # 最小二乘法
            self.B=(self.X.T*self.X).I*(self.X.T)*(self.Y.T)
            return self.B
      def check(self):
            #print self.X,self.B
            res=self.X*self.B-self.Y.T
            print res


#print mat([1,3,3]).T

data=[
      [[1.1,1.1],16.3],
      [[1.4,1.5],16.8],
      [[1.7,1.8],19.2],
      [[1.7,1.7],18.0],
      [[1.8,1.9],19.5],
      [[1.8,1.8],20.9],
      [[1.9,1.8],21.1],
      [[2.0,2.1],20.9],
      [[2.3,2.4],20.3],
      [[2.4,2.5],22.0]
            ]

mint=Min2c(data)
mint.check()
print "reslt is"
print mint.result

岭回归

#coding=utf8
from numpy import *
import matplotlib.pyplot as plt
from matplotlib.pyplot import savefig
class lingR:
      def __init__(self,data,ma,num,kk):
            self.data=data
            self.ma=ma
            self.num=num
            self.result=self.__min2c()
            self.kk=kk
      def __min2c(self):
            self.Y=mat([self.data[i][1] for i in range(len(self.data))])
            self.X=mat([([1]+self.data[i][0]) for i in range(len(self.data))])
            #print Y
            # 最小二乘法
            #dM=
            E=[[0 for j in range(len(self.X.T))]for i in range(len(self.X.T))]
            for j in range(len(E)):
                  E[j][j]=1
            E=mat(E)
            self.B=[[] for i in range(len(E))]
            k=0
            Ax=[]
            for k in range(self.num):
                  for j in range(len(E)):
                        self.B[j].append(array(((self.X.T*self.X+k*E).I*(self.X.T)*(self.Y.T)).T)[0][j])
                  k*=1.0*self.ma/self.num
                  Ax.append(k)
            color=['b','m','r','w','y','c','g','k']

            for t in range(len(self.B)):
                  plt.plot(Ax, self.B[t],color[t%(len(color))])

            my_x_ticks = arange(0,self.ma,1.0*self.ma/10)
            plt.xticks(my_x_ticks)
            #保存为图片输出
            savefig('power.png', dpi=175) 
            plt.show()

            return self.B

      #check 暂时用不到
      def check(self):
            #print self.X,self.B
            E=[[0 for j in range(len(self.X.T))]for i in range(len(self.X.T))]
            for j in range(len(E)):
                  E[j][j]=1
            E=mat(E)
            self.B=(self.X.T*self.X+self.kk*E).I*(self.X.T)*(self.Y.T)
            res=self.X*self.B-self.Y.T
            print "self.B"
            print self.B
            print "error"
            print res


#print mat([1,3,3]).T

data=[
      [[1.1,1.1],16.3],
      [[1.4,1.5],16.8],
      [[1.7,1.8],19.2],
      [[1.7,1.7],18.0],
      [[1.8,1.9],19.5],
      [[1.8,1.8],20.9],
      [[1.9,1.8],21.1],
      [[2.0,2.1],20.9],
      [[2.3,2.4],20.3],
      [[2.4,2.5],22.0]
            ]

mint=lingR(data,3,50,0.6)
mint.check()
print "reslt is"
#print mint.result

岭回归结果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值