一、回归与分类的联系
相同点:回归和分类都要根据训练样本拟合出一个函数h(x)
不同点:首先声明逻辑回归属于分类问题,以逻辑回归和线性回归说明问题:
1、线性回归的拟合函数无h(x)=w0+w1.x1+w2.x2+...+wn.xn;逻辑回归的拟合函数为g(x)=sigmoid(h(x))
2、逻辑回归的最后输出为0或者1(多个输入对应一个输出),而线性回归最后输出为连续型的数据,能够对连续型的数据做出预测(即一个输入对应一个输出)
二、局部加权线性回归的基本思想以及什么是欠拟合和过拟合?
三、怎么解决过拟合的问题以及什么是正则化?
2、针对过拟合问题,通常会考虑两种途径来解决:
1) 减少特征的数量:
-人工的选择保留哪些特征;
-模型选择算法(不懂)
2) 正则化
-保留所有的特征,但是降低参数 θj 的量/值;
-正则化的好处是当特征很多时,每一个特征都会对预测y贡献一份合适的力量;
四、什么是岭回归?
参考:
http://www.cnblogs.com/zhangchaoyang/articles/2802806.html
其中里面提到了病态矩阵、满秩矩阵等概念。
从中得出:
1、回归分析中常用的最小二乘法是一种无偏估计。
2、岭回归解决了传统最小二乘法缺乏稳定性与可靠性的问题。
3、数值计算方法的“稳定性”是指在计算过程中舍入误差是可以控制的。
4、岭回归是在自变量信息矩阵的主对角线元素上人为地加入一个非负因子,从而使回归系数的估计稍有偏差、而估计的稳定性却可能明显提高的一种回归分析方法,它是最小二乘法的一种补充,岭回归可以修复病态矩阵,达到较好的效果。
5、岭回归就是一个带二范数惩罚的最小二乘回归,lasso是一个带一范数惩罚的最小二乘回归,并给出了公式的推导。
6、什么时候使用岭回归:
a) 数据的特征值比样本点还多的情况
b) 输入数据的矩阵x不是满秩矩阵
c) 当X不是列满秩,或者某些列之间的线性相关性比较大时,XTX的行列式接近于0,即XTX接近于奇异,计算(XTX)-1时误差会很大
岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。
五、权衡偏差和方差
参考:线性回归,偏差、方差权衡
从中得出:
1)对于一个给定了具体系数的估计函数,是不能说f(x)的方差是多少。方差是多个模型间的比较,而非对一个模型而言的。
2)模型越复杂,偏差就越小,方差越大;而模型越简单,偏差就越大,方差越小
六、线性回归代码实现。代码源自:机器学习实战 王斌等译
伪代码:
- 首先计算XTX
- 判断该行列式是否等于零,如果等于零说明该矩阵不能求逆
- 如果能求逆,则利用公式
,求出回归参数w
'''
功能:输入数据
'''
def loadDataSet(fileName): #general function to parse tab -delimited floats
numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1])) #数据的最后一列为y值
return dataMat,labelMat
'''
功能:线性回归
'''
def standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T #注意将数据转换为矩阵,因为只有矩阵才有求逆
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0:
print "This matrix is singular, cannot do inverse"
return
ws = xTx.I * (xMat.T*yMat) #ws为回归参数
return ws
'''
功能:画出线性回归图
'''
def plotfig_Regress(xMat,yMat,ws):
xMat = mat(xMat)
yMat = mat(yMat)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0]) #注意flatten的用法
## yHat = xMat*ws #yHat为预测值
xCopy = xMat.copy()
xCopy.sort(0) #将输入数据进行升序,这样画出来的效果更好一些
yHat = xCopy*ws
ax.plot(xCopy[:,1].flatten().A[0],yHat.flatten().A[0]) #注意要将矩阵转为数组类型,否则会出错
plt.show()
xArr,yArr = loadDataSet('ex0.txt')
ws = standRegres(xArr,yArr)
print 'ws=',ws
plotfig_Regress(xArr,yArr,ws)
运行结果:
>>>
ws= [[ 3.00774324]
[ 1.69532264]]
分析:
- y = ws[0] + ws[1]*x1 其实方程应该是 y = ws[0]*x0 + ws[1]*x1。我们人为的令x0为1.0即,从ex0.txt输入文件中可以看出第一列全部为1.0;我们求出的ws的两个值即为方程中的ws[0],ws[1]
参考文章:
1、Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
2、Coursera公开课笔记: 斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”