逻辑回归(logistic regression) 非线性回归例子: .这个例子中的关系不能很好的用线性关系进行模拟,所以我们要另外做曲线模拟它。
为了更好的处理,还需要用sigmoid函数平滑化。
sigmoid函数图像为
所以预测函数为:
我们要求解的问题可以转化成,求解一组参数使得J()最小化。求解方法时求偏导让导数为零。
当然上面这个方法求解过于复杂,我们也可以使用梯度下降的方法。非线性方程其实就是一个超平面,我们可以求偏导找出梯度,沿着梯度下降的方向不断走就可以找到最低点。
求解函数为
其中a是更新率(learning weight)
所以求完偏导的结果为:
h(x) = theta * x(i)
这就是更新函数,我们呢需要重复更新直到 收敛
实例 import numpy as npimport randomdef genData (numPoints,bias,variance ): x = np.zeros(shape=(numPoints,2 )) y = np.zeros(shape=(numPoints)) for i in range (0 ,numPoints): x[i][0 ]=1 x[i][1 ]=i y[i]=(i+bias)+random.uniform(0 ,1 )+variance return x,y def gradientDescent (x,y,theta,alpha,m,numIterations ): xTran = np.transpose(x) for i in range (numIterations): hypothesis = np.dot(x,theta) loss = hypothesis-y cost = np.sum (loss**2 )/(2 *m) gradient=np.dot(xTran,loss)/m theta = theta-alpha*gradient print ("Iteration %d | cost :%f" %(i,cost)) return theta x,y = genData(100 , 25 , 10 ) print "x:" print xprint "y:" print ym,n = np.shape(x) n_y = np.shape(y) print ("m:" +str (m)+" n:" +str (n)+" n_y:" +str (n_y))numIterations = 100000 alpha = 0.0005 theta = np.ones(n) theta= gradientDescent(x, y, theta, alpha, m, numIterations) print (theta)
使用线性回归还是非线性回归 在高中已经学过了,如果是一元线性回归的话会使用相关系数r来描述相关性,来决定是否使用线性回归。它的公式是
如果是多元线性回归就要用
这个公式中第一个yi是估计值,也就是说先要把回归方程求出来再估计相关性。
但是R^2会受样本量影响,随样本量增大而增大,所以要一个小小的改进。
这个方程就是改进后的方程,先把开始的R^2算出来,然后带入,其中N是样本个数,P是维数(自变量个数)