16.python实现线性单元和梯度下降-10月4日编程作业-Relu函数

目录

课堂笔记

代码实现1

运行结果1

代码实现2

评定一个学生的综合绩点

运行结果2

小结


课堂笔记

代码实现1

from cgi import print_environ
from functools import reduce
import numpy as np



#定义感知器类
class perceptron(object):
 
    #感知器初始化函数(参数个数,激活函数)
    def __init__(self, input_num, activator):
        self.activator = activator
        self.weights = [0.0 for _ in range(input_num)] #将每个参数对应权值设为0
        self.bias = 0.0 #偏置值设为0
 
    #输出训练所得权值与偏置值
    def __str__(self):
        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
 
    #计算激活函数值
    def predict(self, input_vec):
        return self.activator(reduce(lambda a, b : a + b, map(lambda xw : xw[0] * xw[1], zip(input_vec, self.weights)), 0.0) + self.bias)
 
    #更新权重与偏置值
    def _update_weights(self, input_vec, output, label, rate):
        delta = label - output #计算预测值与真值之差
        self.weights = list(map(lambda xw : xw[1] + rate * delta * xw[0], zip(input_vec, self.weights))) #更新权重
        self.bias = rate + delta #更新偏置
 
    #迭代计算
    def _one_iteration(self, input_vecs, labels, rate):
        samples = zip(input_vecs, labels)
        for(input_vec, label) in samples:
            output = self.predict(input_vec) #计算激活函数值
            self._update_weights(input_vec, output, label, rate) #更新权值与偏置值
 
    #训练数据得权值、偏置值
    def train(self, input_vecs, labels, iteration, rate):
        for _ in range(iteration):
            self._one_iteration(input_vecs, labels, rate)
 
#定义激活函数  f = lambda x: x
def f(x):
    return x

 #def get_training_dataset():
 #   input_vecs = [[0.2104,3],[0.1600,3],[0.2400,3],[0.1416,2],[0.3000,4]]
 #   labels = [0.400,0.330,0.369,0.232,0.540]
 #   return input_vecs, labels

#def get_training_dataset():
    input_vecs = [[0,0],[-0.886041760444641,0],[0.520373702049255,0],[-1.20951724052429,-1.58113884925842],[1.57518529891968,1.58113884925842]]
    labels = [0.257084310054779,-0.440431356430054,-0.0518154688179493,-1.41695320606232,1.65211570262909]
    return input_vecs, labels

#def get_training_dataset():
    input_vecs = [[0.434343457221985,0.5],[0.116161584854126,0.5],[0.621212124824524,0.5],[0,0],[1,1]]
    labels = [0.545454561710358,0.318181812763214,0.444805204868317,0,1]
    return input_vecs, labels

#构建训练集
def get_training_dataset():
    input_vecs = [[5], [3], [8], [1.4], [10.1]] #输入向量列表,每一项是员工的工作年限
    labels = [5500, 2300, 7600, 1800, 11400] # 期望的输出列表,月薪,注意要与输入一一对应
    return input_vecs, labels

#构建训练集训练感知器
def train_linear_unit():
    p = perceptron(1, f)
    input_vecs, labels = get_training_dataset()
    p.train(input_vecs, labels, 5, 0.0001) #初始设置:迭代10轮,学习率是0.01
    return p


#主函数
if __name__ == '__main__':
    linear_unit = train_linear_unit()
    print(linear_unit)
    #顺便与标记对比一下 大概看一下训练效果 
    print ('Work 5 years, monthly salary = %.2f' % linear_unit.predict([5]))
    print ('Work 3 years, monthly salary = %.2f' % linear_unit.predict([3]))
    print ('Work 8 years, monthly salary = %.2f' % linear_unit.predict([8]))
    print ('Work 1.4 years, monthly salary = %.2f' % linear_unit.predict([1.4]))
    print ('Work 3.4 years, monthly salary = %.2f' % linear_unit.predict([3.4]))
    print ('Work 1.5 years, monthly salary = %.2f' % linear_unit.predict([1.5]))
    print ('Work 15 years, monthly salary = %.2f' % linear_unit.predict([15]))
    print ('Work 6.3 years, monthly salary = %.2f' % linear_unit.predict([6.3]))




#if __name__ == '__main__':
#    linear_unit = train_linear_unit()
#   print(linear_unit)
#    print('[居住面积,房间数量] = [2104,3] 最终价格为:%.2f' % linear_unit.predict([2104,3]))
#    print('[居住面积,房间数量] = [1600,3] 最终价格为:%.2f' % linear_unit.predict([1600,3]))
#    print('[居住面积,房间数量] = [2400,3] 最终价格为:%.2f' % linear_unit.predict([2400,3]))
#    print('[居住面积,房间数量] = [1416,2] 最终价格为:%.2f' % linear_unit.predict([1416,2]))
#    print('[居住面积,房间数量] = [3000,4] 最终价格为:%.2f' % linear_unit.predict([3000,4]))

 

运行结果1

代码实现2

评定一个学生的综合绩点

影响该学生综合绩点的特征向量[x^{(i)}]包括学业绩点、学生工作、科研成绩和实践表现,每个特征参与评定的比重不同,即参数[w^{(i)}]不同,还规定有基础分b,我们通过训练样本数据集得到[w^{(i)}]可预测下一届学生的综合绩点。

from cgi import print_environ
from functools import reduce
import numpy as np



#定义感知器类
class perceptron(object):
 
    #感知器初始化函数(参数个数,激活函数)
    def __init__(self, input_num, activator):
        self.activator = activator
        self.weights = [0.0 for _ in range(input_num)] #将每个参数对应权值设为0
        self.bias = 0.0 #偏置值设为0
 
    #输出训练所得权值与偏置值
    def __str__(self):
        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
 
    #计算激活函数值
    def predict(self, input_vec):
        return self.activator(reduce(lambda a, b : a + b, map(lambda xw : xw[0] * xw[1], zip(input_vec, self.weights)), 0.0) + self.bias)
 
    #更新权重与偏置值
    def _update_weights(self, input_vec, output, label, rate):
        delta = label - output #计算预测值与真值之差
        self.weights = list(map(lambda xw : xw[1] + rate * delta * xw[0], zip(input_vec, self.weights))) #更新权重
        self.bias = rate + delta #更新偏置
 
    #迭代计算
    def _one_iteration(self, input_vecs, labels, rate):
        samples = zip(input_vecs, labels)
        for(input_vec, label) in samples:
            output = self.predict(input_vec) #计算激活函数值
            self._update_weights(input_vec, output, label, rate) #更新权值与偏置值
 
    #训练数据得权值、偏置值
    def train(self, input_vecs, labels, iteration, rate):
        for _ in range(iteration):
            self._one_iteration(input_vecs, labels, rate)
 
#定义激活函数  f = lambda x: x
def f(x):
    return x

 #def get_training_dataset():
 #   input_vecs = [[0.2104,3],[0.1600,3],[0.2400,3],[0.1416,2],[0.3000,4]]
 #   labels = [0.400,0.330,0.369,0.232,0.540]
 #   return input_vecs, labels

#def get_training_dataset():
#    input_vecs = [[0,0],[-0.886041760444641,0],[0.520373702049255,0],[-1.20951724052429,-1.58113884925842],[1.57518529891968,1.58113884925842]]
#    labels = [0.257084310054779,-0.440431356430054,-0.0518154688179493,-1.41695320606232,1.65211570262909]
#    return input_vecs, labels

#def get_training_dataset():
#    input_vecs = [[0.434343457221985,0.5],[0.116161584854126,0.5],[0.621212124824524,0.5],[0,0],[1,1]]
#    labels = [0.545454561710358,0.318181812763214,0.444805204868317,0,1]
#    return input_vecs, labels

#构建训练集
#def get_training_dataset():
#    input_vecs = [[5], [3], [8], [1.4], [10.1]] #输入向量列表,每一项是员工的工作年限
#   labels = [5500, 2300, 7600, 1800, 11400] # 期望的输出列表,月薪,注意要与输入一一对应
#    return input_vecs, labels

#构建训练集
def get_training_dataset():
    input_vecs = [[4.5,4.7,4.6,4.8],[4.5,4.0,4.6,4.7],[4.5,4.7,4.3,4.2],[4.7,4.6,4.5,4.3],[4.9,4.0,4.0,4.1],[4.1,4.9,4.8,4.9]]
    labels = [4.57,4.49,4.45,4.61,4.55,4.40]
    return input_vecs, labels


#构建训练集训练感知器
def train_linear_unit():
    p = perceptron(4, f)
    input_vecs, labels = get_training_dataset()
    p.train(input_vecs, labels, 5000, 0.1) #初始设置:迭代10轮,学习率是0.01
    return p


#主函数
if __name__ == '__main__':
    linear_unit = train_linear_unit()
    print(linear_unit)
    print('[学业绩点,学生工作,科研成绩,实践表现] = [4.5,4.7,4.6,4.8] 最终得分为:%.2f' % linear_unit.predict([4.5,4.7,4.6,4.8]))
    print('[学业绩点,学生工作,科研成绩,实践表现] = [4.5,4.0,4.6,4.7] 最终得分为:%.2f' % linear_unit.predict([4.5,4.0,4.6,4.7]))
    print('[学业绩点,学生工作,科研成绩,实践表现] = [4.5,4.7,4.3,4.2] 最终得分为:%.2f' % linear_unit.predict([4.5,4.7,4.3,4.2]))
    print('[学业绩点,学生工作,科研成绩,实践表现] = [5.0,5.0,5.0,5.0] 最终得分为:%.2f' % linear_unit.predict([5.0,5.0,5.0,5.0]))

运行结果2

weights :[0.592273500292354,0.09907395106529637,0.196892896023883,0.09729332034785503]
bias :0.064500
 
[绩点,学生工作,科研成绩,实践表现] = [4.5,4.7,4.6,4.8] 最终得分为:4.57
[绩点,学生工作,科研成绩,实践表现] = [4.5,4.0,4.6,4.7] 最终得分为:4.49
[绩点,学生工作,科研成绩,实践表现] = [4.5,4.7,4.3,4.2] 最终得分为:4.45
[绩点,学生工作,科研成绩,实践表现] = [5.0,5.0,5.0,5.0] 最终得分为:4.99

小结

事实上,一个机器学习算法其实只有两部分

模型 从输入特征x预测输出y的那个函数h(x)

目标函数 目标函数取最小(最大)值时所对应的参数值,就是模型的参数的最优值。很多时候我们只能获得目标函数的局部最小(最大)值,因此也只能得到模型参数的局部最优值

运用优化算法去求取目标函数的最小(最大)值。[随机]梯度{下降|上升}算法就是一个优化算法。针对同一个目标函数,不同的优化算法会推导出不同的训练规则

其实在机器学习中,算法往往并不是关键,真正的关键之处在于选取特征。选取特征需要我们人类对问题的深刻理解,经验、以及思考。而神经网络算法的一个优势,就在于它能够自动学习到应该提取什么特征,从而使算法不再那么依赖人类,而这也是神经网络之所以吸引人的一个方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值