最小二乘法
#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