1.getA()方法
def plotBestFit(weights):
dataMat, labelMat = loadDataSet()
dataArr = array(dataMat) #将每个数据点的x,y坐标存为矩阵的形式
n = shape(dataArr)[0] #取其行数,也即数据点的个数
#======画数据点
xcord1 = []
ycord1 = []
xcord2 = []
ycord2 = []
for i in range(n):
if int(labelMat[i]) == 1: #若是正例,存到(x1,y1)中
xcord1.append(dataArr[i,1])
ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1])
ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1,ycord1,s=30,c="red",marker = "s")
ax.scatter(xcord2,ycord2,s=30,c="green")
#============
x = arange(-3.0,3.0,0.1) #x为numpy.arange格式,并且以0.1为步长从-3.0到3.0切分。
#拟合曲线为0 = w0*x0+w1*x1+w2*x2, 故x2 = (-w0*x0-w1*x1)/w2, x0为1,x1为x, x2为y,故有
y = (-weights[0] - weights[1]*x)/weights[2]
#x为array格式,weights为matrix格式,故需要调用getA()方法,其将matrix()格式矩阵转为array()格式
ax.plot(x,y)
plt.xlabel("X1")
plt.ylabel("X2")
plt.show()
dataMat, labelMat = loadDataSet()
weights = gradAscent(dataMat, labelMat)
#getA()方法,其将matrix()格式矩阵转为array()格式,type(weights),type(weights.getA())可观察到。
plotBestFit(weights.getA())
getA()是什么的问题,解释如下:
matrix.getA()
Return self as an ndarray object.
Equivalent to np.asarray(self).
Parameters: None
Returns: ret : ndarrayself as an ndarray
也就是说矩阵通过这个getA()这个方法可以将自身返回成一个n维数组对象
为什么要这样做呢?
因为plotBestFit()函数中有计算散点x,y坐标的部分,其中计算y的时候用到了weights,如果weights是矩阵的话,weights[1]就是[[0.48007329]](注意这里有中括号!),就不是一个数了,最终你会发现y的计算结果的len()只有1,而x的len()则是60
2.数据处理时,若遇到缺失值时的处理办法
- 使用可用特征的时均值来填补缺失值
- 使用特殊值来填充,如-1
- 忽略缺失值的样本
- 使用相似的样本均值来填补缺失值
- 使用机器学习的算法来预测缺失值
3.
该算法的主要思想是:根据现有数据对分类边界线建立回归公式,以此分类(二值分类、也称概率分类利用sigmoid函数)。这里的回归指的最佳拟合,表示要找到最佳的参数集,训练的过程就是寻找最佳参数的过程。
优点:计算代价不高,容易理解和计算。
缺点:欠拟合,分类精度可能不高。
适用数值型和标称型数据
4.最优化算法:如梯度上升(求最大值)或是梯度下降(求最小值),求梯度要求在定义的点上有定义且可微,在梯度迭代过程中总能使我们找到最佳的路径。
梯度下降算法
w=w−α▽f(w)
梯度上升算法
w=w+α▽f(w)
5.
梯度下降(上升)算法每次更新回归系数都要遍历整个数据集,而随机梯度下降(上升)算法是梯度下降算法的改进型,一次只用一个样本来更新回归系数,从而占用更少的计算资源。由于可以在新的样本到来时对分类器进行增量式更新,因此随机梯度算法是一个在线学习算法。