根据工作年限预测工资python代码实现
生活随笔
收集整理的這篇文章主要介紹了
根据工作年限预测工资python代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面:感知器有一個問題,當面對的數據集不是線性可分的時候,『感知器規則』可能無法收斂,這意味著我們永遠也無法完成一個感知器的訓練。為了解決這個問題,我們使用一個可導的線性函數來替代感知器的階躍函數,這種感知器就叫做線性單元。線性單元在面對線性不可分的數據集時,會收斂到一個最佳的近似值。
此篇文章涉及到的主要知識點是線性單元模型的實現,與感知器對比,只有激活函數的不同。本段代碼中的線性函數是f(x)=x,大家可以自行更改激活函數,比如更改為sigmod函數。
代碼如下(python3)
#!/usr/bin/env python # -*- coding: UTF-8 -*-from __future__ import print_function from functools import reduceclass VectorOp(object):"""實現向量計算操作"""def dot(x, y):"""計算兩個向量x和y的內積"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]按元素相乘# 變成[x1*y1, x2*y2, x3*y3]# 然后利用reduce求和return reduce(lambda a, b: a + b, VectorOp.element_multiply(x, y), 0.0)@staticmethoddef element_multiply(x, y):"""將兩個向量x和y按元素相乘"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]打包在一起# 變成[(x1,y1),(x2,y2),(x3,y3),...]# 然后利用map函數計算[x1*y1, x2*y2, x3*y3]return list(map(lambda x_y: x_y[0] * x_y[1], zip(x, y)))@staticmethoddef element_add(x, y):"""將兩個向量x和y按元素相加"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]打包在一起# 變成[(x1,y1),(x2,y2),(x3,y3),...]# 然后利用map函數計算[x1+y1, x2+y2, x3+y3]return list(map(lambda x_y: x_y[0] + x_y[1], zip(x, y)))@staticmethoddef scala_multiply(v, s):"""將向量v中的每個元素和標量s相乘"""return map(lambda e: e * s, v)class Perceptron(object):def __init__(self, input_num, activator):"""初始化感知器,設置輸入參數的個數,以及激活函數。激活函數的類型為double -> double"""self.activator = activator# 權重向量初始化為0self.weights = [0.0] * input_num# 偏置項初始化為0self.bias = 0.0def __str__(self):"""打印學習到的權重、偏置項"""return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)def predict(self, input_vec):"""輸入向量,輸出感知器的計算結果"""# 計算向量input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]的內積# 然后加上biasreturn self.activator(VectorOp.dot(input_vec, self.weights) + self.bias)def train(self, input_vecs, labels, iteration, rate):"""輸入訓練數據:一組向量、與每個向量對應的label;以及訓練輪數、學習率"""for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):"""一次迭代,把所有的訓練數據過一遍"""# 把輸入和輸出打包在一起,成為樣本的列表[(input_vec, label), ...]# 而每個訓練樣本是(input_vec, label)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 _update_weights(self, input_vec, output, label, rate):"""按照感知器規則更新權重"""# 首先計算本次更新的delta# 然后把input_vec[x1,x2,x3,...]向量中的每個值乘上delta,得到每個權重更新# 最后再把權重更新按元素加到原先的weights[w1,w2,w3,...]上delta = label - outputself.weights = VectorOp.element_add(self.weights, VectorOp.scala_multiply(input_vec, rate * delta))# 更新biasself.bias += rate * delta#定義激活函數f f = lambda x: xclass LinearUnit(Perceptron):def __init__(self, input_num):'''初始化線性單元,設置輸入參數的個數'''Perceptron.__init__(self, input_num, f)def get_training_dataset():'''捏造5個人的收入數據'''# 構建訓練數據# 輸入向量列表,每一項是工作年限input_vecs = [[5], [3], [8], [1.4], [10.1]]# 期望的輸出列表,月薪,注意要與輸入一一對應labels = [5500, 2300, 7600, 1800, 11400]return input_vecs, labels def train_linear_unit():'''使用數據訓練線性單元'''# 創建感知器,輸入參數的特征數為1(工作年限)lu = LinearUnit(1)# 訓練,迭代10輪, 學習速率為0.01input_vecs, labels = get_training_dataset()lu.train(input_vecs, labels, 10, 0.01)#返回訓練好的線性單元return ludef plot(linear_unit):import matplotlib.pyplot as pltinput_vecs, labels = get_training_dataset()fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(map(lambda x: x[0], input_vecs), labels)weights = linear_unit.weightsbias = linear_unit.biasx = range(0,12,1)y = map(lambda x:weights[0] * x + bias, x)ax.plot(x, y)plt.show()if __name__ == '__main__': '''訓練線性單元'''linear_unit = train_linear_unit()# 打印訓練獲得的權重print (linear_unit)# 測試print ('Work 3.4 years, monthly salary = %.2f' % linear_unit.predict([3.4]))print ('Work 15 years, monthly salary = %.2f' % linear_unit.predict([15]))print ('Work 1.5 years, monthly salary = %.2f' % linear_unit.predict([1.5]))print ('Work 6.3 years, monthly salary = %.2f' % linear_unit.predict([6.3]))plot(linear_unit)參考資料:https://www.zybuluo.com/hanbingtao/note/448086
總結
以上是生活随笔為你收集整理的根据工作年限预测工资python代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 感知器python代码
- 下一篇: 地产相继入局智能家居,LifeSmart