机器学习之监督标题学习__线性分类
一,logistic回归 (逻辑回归):
通过不断修正缩小误差最终得到准确的模型,整个过程中需要不断回归,直到达到指定的次数或者达到设定的精度
二,sigsigmoid函数:
激活函数sigmoid函数是一种阶跃函数,输出范围在[0,1],在回归问题中,我们需要找到最佳的回归系数,需要用到最优化算法。
Sigmoid函数: f(x)=1/(1+exp^(-x)) (exp,高等数学里以自然常数e为底的指数函数)通过此函数将任何数字投射为0到1之间的数,有利于进行判定
三,精度:alpha(模型允许的误差值,一般来说误差越小运算量越大),同时如果过分追求高精度,容易造成模型过度复杂,从而造成过拟合的情况(即在训练集中的预测非常精确,但是在测试集中的准确率非常低)
四,步长(也称学习率)
即每次修正的大小,如果步长变大,则每次向正确参数移动的距离变大,学习效率变高,但是容易造成参数越过正确值
五,梯度
梯度上升和梯度下降:梯度是三维以上的空间用的,类似于二维中的倾斜度,二维中的倾斜度为正的时候线向右倾斜,否则向左倾斜,同理在三维中梯度下降类似于碗装,想要求得碗底那一点就要减,梯度上升类似于蘑菇状,想要求得最大值,就要增加
六,代码实现`
'''python
# -*- coding: utf-8 -*-
"""
Created on Fri Jan 4 20:41:37 2019
@author: ym
"""
from numpy import *
#定义sigmoid的实现
def sigmoid(data):
return 1.0/(1+exp(-data))
#print(sigmoid(40))
#当学习指定次数后退出循环
def gradient_ascent_test1():
def func(old):
return -2*old+4
old=-1
news=0
alpha=0.001
num=5000
for i in range(num):
olds=news
news=olds+alpha*func(olds)
return news
print(gradient_ascent_test1())
#当模型到达指定精度后停止学习
def gradient_ascent_test2():
def func(old):
return -2*old+4
olds=-1
news=0
alpha=0.001 #步长
pricision=0.00001 #精度
while (news-olds)>pricision:
olds=news
news=olds+alpha*func(olds)
return news
print(gradient_ascent_test2())
#数据集前80条作为训练集 后20条作为测试集
#加载数据
def loadDataSet():
i=0
dataMat=[]
labelMat=[]
with open('testSet.txt','r') as fp:
for line in fp.readlines():
if i>80:
break
array=line.strip().split()
dataMat.append([1.0,float(array[0]),float(array[1])])
labelMat.append(int(array[2]))
i=i+1
return dataMat,labelMat
dataMat,labelMat=loadDataSet()
#print(dataMat)
#print(labelMat)
#学习部分 获得模型
def gradientAscent(dataMat,labelMat):
#将python中的list转为 Matrix
dataMat=mat(dataMat)
labelMat=mat(labelMat).T # transpose()转置 ——》》行转置为行 行转置为列
m,n=shape(dataMat) #数据集有n行 3列
#numpy 创建一个值为1 n行1列的值
weights=ones((n,1))
alpha=0.0001 #步长 学习率
num=5000 #迭代的次数
for k in range(num):
tempResult=sigmoid(dataMat*weights)
error=labelMat-tempResult
weights=weights+alpha*dataMat.T*error
return weights
weights=gradientAscent(dataMat,labelMat)
print(weights)
#测试模型
data=[1.0, 0.317029 ,14.739025]
data=mat(data)
y=data*weights
cla=sigmoid(y)
print(y,' ',cla)
'''
`