日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

软件研发工程师转行机器学习之路

發布時間:2024/10/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件研发工程师转行机器学习之路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

機器學習 Machine Learning

  • 1 基礎
    • 1.1 機器學習概念
    • 1.2 學科定位
    • 1.3 機器學習定義
    • 1.4 什么是學習
    • 1.5 深度學習
    • 1.5 監督學習-分類
    • 1.6 監督學習-回歸
    • 1.7 非監督學習
    • 1.8 機器學習步驟框架
  • 2 基本概念
  • 3 監督學習-分類
    • 3.1 決策樹
      • 3.1.1 機器學習中分類和預測算法的評估
      • 3.1.2 什么是決策樹/判定樹?
      • 3.1.2 熵(entropy)概念
      • 3.1.3 決策樹歸納算法(ID3)
      • 3.1.4 樹葉剪枝(避免overfitting)
      • 3.1.5 決策樹的優點
      • 3.1.6 決策樹的缺點
      • 3.1.7 代碼實現
    • 3.2 鄰近取樣
      • 3.2.1 最鄰近規則分類(K-Nearest Neighbor) KNN算法
      • 3.2.2 算法詳述
      • 3.2.3 關于距離衡量方法
      • 3.2.4 算法評價
      • 3.2.5 KNN算法應用
      • 3.2.6 Iris(虹膜)數據集介紹
      • 3.2.7 代碼實現
    • 3.3 支持向量機
      • 3.3.1 原理簡介
      • 3.3.2 定義與公式建立
      • 3.3.3 SVM算法特性
      • 3.3.4 線性不可分情況
      • 3.3.5 具體實現
    • 3.4 神經網絡算法
      • 3.4.1 算法詳述
      • 3.4.2 設計神經網絡結構
      • 3.4.3 Backpropagation算法
      • 3.4.4 非線性轉化方程(Non-linear transformation function )
      • 3.4.5 神經網絡算法應用
  • 4 監督學習-回歸
    • 4.1 簡單線性回歸
      • 4.1.1 前提介紹
      • 4.1.2 簡單線性模型舉例
    • 4.2 多元回歸分析(Multiple Regression)
    • 4.3 非線性回歸-logistic regression
    • 4.3 回歸中的相關度和R平方值
  • 5 非監督學習
    • 5.1 聚類(Clustering):k-means算法
    • 5.2 聚類(Clustering):層次聚類
  • 6 小結
    • 機器學習(Machine Learning)

1 基礎

基礎知識(Basic Concepts)

訓練集,測試集,特征值,監督學習,非監督學習,分類,回歸

1.1 機器學習概念

  • 多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、算法復雜度等多門學科。
  • 專門研究計算機怎樣模擬和實現人類的學習行為,以獲取新的知識和技能,重新組織新的知識結構使之不斷改善自身的性能

1.2 學科定位

  • 人工智能(Artificial Intelligence,AI)的核心,是使計算機具有智能的根本途徑,其應用遍及人工智能的各個領域,主要方法是歸納、綜合而不是演繹。

1.3 機器學習定義

  • 探究和開發一系列算法來如何使計算機不需要通過外部明顯的指示,而可以自己通過數據來學習和建模,并且利用建好的模型和新的輸入來進行預測的學科。
  • 一門不需要外部程序指示,而讓計算機有能力自我學習的學科。
  • 機器學習是一門人工智能的科學,該領域的主要研究對象是人工智能,特別是如何在經驗學習中改善算法的性能。
  • 機器學習是對能通過經驗自動改進的計算機算法的研究。

1.4 什么是學習

  • 針對經驗E(Experience)和一些列的任務T(Task)和一定表現的衡量P(performe),如果隨著經驗的積累,針對定義好的任務T可以提高表現P,說明計算機具有學習能力。
  • 下棋、語音識別、自動駕駛、語言翻譯、計算機視覺、推薦系統、無人機、識別垃圾郵件、人臉識別、推薦系統

1.5 深度學習

  • 深度學習是機器學習延伸出來的一個新領域,由以人腦結構為啟發的神經網絡算法為起源,加之模型結構的增加發展,并伴隨大數據和計算能力的提高而產生的一系列新的算法。
  • 深度學習作為機器學習中延伸出來的一個領域,被應用在圖像處理和計算機視覺,自然語言處理以及語音識別等領域。自2006年至今,學術界和工業界合作在深度學習方面的研究與應用取得了突破性的進展。以ImageNet為數據庫的經典圖像中的物體識別競賽為例,擊敗了所有傳統算法,取得了前所未有的精確度。

1.5 監督學習-分類

監督學習(Supervised Learning):分類(Classification)

  • 決策樹(Decision Tree) ,銀行信用自動評估系統
  • 鄰近取樣(Nearest Neighbor) ,人臉識別
  • 支持向量機(Support Vector Machine) ,圖片中的紅眼檢測,結腸癌晚期分類
  • 神經網絡算法(Neural Network),手寫數字識別,圖片分類

1.6 監督學習-回歸

監督學習(Supervised Learning):回歸(Regression)

  • 線性回歸(Linear Regression),銷量預測,價格預測
  • 非線性回歸(Non-linear Regression),銷售預測,價格預測

1.7 非監督學習

非監督學習(Unsupervised Learning)

  • K-mean算法聚類(Clustering),人臉分類
  • hierarchical dustering算法聚類,人臉噪音移除

1.8 機器學習步驟框架

  • 把數據拆分為訓練集和測試集
  • 用訓練集和訓練集的特征向量來訓練算法
  • 用學習來的算法運用在測試集上來評估算法,可能要調整參數(parameter tuning),
  • 2 基本概念

    • 基本概念:訓練集、測試集、特征值、監督學習、非監督學習、半監督學習、分類、回歸
    • 概念學習是指從有關某個布爾函數的輸入輸出樣例中推斷出該布爾函數。
    • 概念定義在實例(Instance)集合之上,這個集合表示為X。
    • 待學習的概念或目標函數成為目標概念(Target Concept),記作做C。
    • 訓練集(training set / data)/ 訓練樣例(training examples):用來進行訓練,也就是生產模型,或者算法的數據集
    • 測試集(testing set / data)/ 測試樣例(testing example):用來專門進行測試已學習好的模型或者算法的數據集
    • 特征向量(features/feature vector):屬性的集合,通常用一個向量來表示,附屬于一個實例
    • 標記(label):C(x),實例類別的標記
    • 正例:positive example
    • 反例:negative example
    • 分類(Classification):目標標記為類別型數據(category)
    • 回歸(regression):目標標記為連續性數值(Continuous Numeric Value)
    • 有監督學習(supervised learning):訓練集有類別標記(Calss Label)
    • 無監督學習(unsupervised learning):無類別標記(Class Label)
    • 半監督學習(semi-supervised learning):有類別標記訓練集+無類別標記訓練集

    3 監督學習-分類

    監督學習(Superviesd Learning):分類(Classification)

    3.1 決策樹

    決策樹(Decision Tree)

    3.1.1 機器學習中分類和預測算法的評估

    • 準確率
    • 速度
    • 強壯性
    • 可規模性
    • 可解釋性

    3.1.2 什么是決策樹/判定樹?

    • 判定樹是一個類似于流程圖的數結構,其中每個內部節點表示在一個屬性上的測試,每個分支代表一個屬性輸出,而每個樹葉節點代表類和類分布。樹的最頂層是根節點。

    3.1.2 熵(entropy)概念

    • 信息和抽象如何度量?
    • 1948年香農提出信息熵的概念
    • 一條信息的信息量大小和他的不確定性有直接的關系
    • 要搞清楚一件非常不確定的事情,或者是我們一無所知的事情,需要了解大量的信息
    • 信息量的度量等于不確定性的多少
    • 變量的不確定性越大,熵也越大

    3.1.3 決策樹歸納算法(ID3)

    信息獲取量(Information Gain):Gain(A)=Info(D)-Info_A(D).
    通過A來作為節點分類獲取了多少信息

    • 樹以代表訓練樣本的單個節點開始(步驟1)
    • 如果樣本都在同一個類,則該節點成為樹葉,并用該類標號(步驟2和3)
    • 否則,算法使用稱為信息增益的基于熵的度量作為啟發信息,選擇能夠最好的將樣本分類的屬性(步驟6).該屬性成為該節點的“測試”或“判定”屬性(步驟7)
    • 在算法的該版本中,所有的屬性都是分類的,即離散值。連續屬性必須離散化。
    • 對測試屬性的每個已知的值,創建一個分支,并據從劃分樣本(步驟8-10)
    • 算法使用同樣的過程,遞歸的形成每個劃分上的樣本的判定樹。一旦一個屬性出現在一個結點時,就不必該節點的任何后代上考慮它(步驟13)
    • 遞歸劃分步驟劃分條件僅當下列條件之一停止。
    • (a)給定結點的所有樣本屬于同一類(步驟2和3)
    • (b)沒有剩余屬性可以用來進一步劃分樣本(步驟4),在此情況下,使用多數表決(步驟5)
    • 這涉及將給定結點轉換成樹葉,并用樣本中的多數所在的類標記它

    3.1.4 樹葉剪枝(避免overfitting)

    • 先剪枝
    • 后剪枝

    3.1.5 決策樹的優點

    • 直觀
    • 便于理解
    • 小規模數據集有效

    3.1.6 決策樹的缺點

    • 處理連續變量不好
    • 類別較多時,錯誤增加的較快
    • 可規模性一般

    3.1.7 代碼實現

    Python 機器學習庫:scikit-learn
    簡單高效的數據挖掘和機器學習庫
    對所有用戶開放,根據不同需求,高度可重用性
    基于Numpy、SciPy、matplotlib,開源

    • 數據
    RID,age,income,student,credit_rating,Class_buys_computer 1,youth,high,no,fair,no 2,youth,high,no,excellent,no 3,middle_aged,high,no,fair,yes 4,senior,medium,no,fair,yes 5,senior,low,yes,fair,yes 6,senior,low,yes,excellent,no 7,middle_aged,low,yes,excellent,yes 8,youth,medium,no,fair,no 9,youth,low,yes,fair,yes 10,senior,medium,yes,fair,yes 11,youth,medium,yes,excellent,yes 12,middle_aged,medium,no,excellent,yes 13,middle_aged,high,yes,fair,yes 14,senior,medium,no,excellent,no
    • 代碼
    from sklearn.feature_extraction import DictVectorizer import csv from sklearn import preprocessing from sklearn import tree from sklearn.externals.six import StringIOallElectronicsData = open(r'D:\IDEA\ML\MachineLearningBasics\DataSets\AllElectronics.csv', 'rb') reader = csv.reader(allElectronicsData) headers = reader.next()print 'headers' print(headers)featureList = [] labelList = []for row in reader:labelList.append(row[len(row) - 1])rowDict = {}for i in range(1, len(row) - 1):rowDict[headers[i]] = row[i]featureList.append(rowDict)print 'featureList' print(featureList)vec = DictVectorizer() dummyX = vec.fit_transform(featureList).toarray()print("dummyX:" + str(dummyX)) print(vec.get_feature_names()) print("labelList:" + str(labelList))lb = preprocessing.LabelBinarizer() dummyY = lb.fit_transform(labelList) print("dummyY:" + str(dummyY))clf = tree.DecisionTreeClassifier(criterion='entropy') clf = clf.fit(dummyX, dummyY) print('clf:' + str(clf))with open("allElectronicInformationGainOri.dot", 'w') as f:f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f) oneRowX = dummyX[0, :] print('oneRowX:' + str(oneRowX))newRowX = oneRowX newRowX[0] = 1 newRowX[2] = 0 print('newRowX:' + str(newRowX))# predictedY = clf.predict(newRowX) # print('predictedY:' + str(predictedY))
    • 結果

    3.2 鄰近取樣

    鄰近取樣(Nearest Neighbor)

    3.2.1 最鄰近規則分類(K-Nearest Neighbor) KNN算法

    Cover和Hart在1968年提出最初的鄰近算法
    分類(Classification)算法
    輸入基于實例的學習(instance-based learning),懶惰學習(Lazy Learning)

    3.2.2 算法詳述

  • 為了判斷未知實例的類別,以所有已知類別的實例作為參照
  • 選擇參數K
  • 計算未知實例與所有已知實例的距離
  • 選擇最近K個已知實例
  • 根據少數服從多數的投票法則(majority-voting),讓未知實例歸類為K個最鄰近樣本中最多數的類別
  • 3.2.3 關于距離衡量方法

    • Euclidean Distance 定義
    • 其他距離衡量:余弦值(COS),相關度(correlation),曼哈頓距離(Manhattan Distance)

    3.2.4 算法評價

    • 優點:簡單,易于理解,容易實現,通過對K的選擇可具備丟噪音數據的健壯性
    • 缺點:需要大量空間存儲所有已知實例,算法復雜度高(需要比較所有已知實例與要分類的實例)
    • 當其樣本分布不平衡時,比如其中一類樣本過大(實例數量過多)占主導時,新的未知實例容易被歸類為這個主導樣本,因為這類樣本實例的數量過大,但這個新的未知實例并不接近目標樣本

    3.2.5 KNN算法應用

    最鄰近規則分類KNN(K-Nearest Neighbor)算法應用

    • SKLearnExample.py
    # Example of KNN implemented from sklearn import neighbors from sklearn import datasetsknn = neighbors.KNeighborsClassifier() iris = datasets.load_iris() print iris knn.fit(iris.data, iris.target) predictedLabel = knn.predict([[0.1, 0.2, 0.3, 0.4]]) print predictedLabel

    3.2.6 Iris(虹膜)數據集介紹

    • 150個實例
    • sepal length:萼片長度,sepal width:萼片寬度,petal length:花瓣長度,petal width:花瓣寬度
    • 類別:setosa,versicolor,virginica

    3.2.7 代碼實現

    # coding=utf-8 import csv import random import math import operator# filename 文件名稱 # split 分割 # trainingSet 訓練集 # testSet 測試集 def loadDataset(filename, split, trainingSet=[], testSet=[]):with open(filename, 'rb') as csvFile:lines = csv.reader(csvFile)dataset = list(lines)for x in range(len(dataset) - 1):for y in range(4):dataset[x][y] = float(dataset[x][y])if random.random() < split:trainingSet.append(dataset[x])else:testSet.append(dataset[x])# instance1 第一個坐標 # instance2 第二個坐標 # length 維數 def euclideanDistance(instance1, instance2, length):distance = 0for x in range(length):distance += pow((instance1[x] - instance2[x]), 2)return math.sqrt(distance)# 獲取K個最近的實例 def getNeighbors(trainingSet, testInstance, k):distances = []length = len(testInstance) - 1for x in range(len(trainingSet)):dist = euclideanDistance(testInstance, trainingSet[x], length)distances.append((trainingSet[x], dist))distances.sort(key=operator.itemgetter(1))neighbors = []for x in range(k):neighbors.append(distances[x][0])return neighborsdef getResponse(neighbors):class_votes = {}for x in range(len(neighbors)):response = neighbors[x][-1]if response in class_votes:class_votes[response] += 1else:class_votes[response] = 1sorted_votes = sorted(class_votes.iteritems(), key=operator.itemgetter(1), reverse=True)return sorted_votes[0][0]# 獲取準確率 def getAccuracy(testSet, predictions):correct = 0for x in range(len(testSet)):if testSet[x][-1] == predictions[x]:correct += 1return (correct / float(len(testSet))) * 100.0def main():training_set = []test_set = []split = 0.67loadDataset(r'D:\IDEA\ML\MachineLearningBasics\DataSets\iris.data.txt', split, training_set, test_set)print 'Train Set:' + repr(len(training_set))print 'Test Set:' + repr(len(test_set))predictions = []k = 3for x in range(len(test_set)):neighbors = getNeighbors(training_set, test_set[x], k)result = getResponse(neighbors)predictions.append(result)print '>> predicted=' + repr(result) + ',actual=' + repr(test_set[x][-1])accuracy = getAccuracy(test_set, predictions)print 'Accuracy:' + repr(accuracy) + '%'main()

    3.3 支持向量機

    支持向量機(Support Vector Machine,SVM)

    3.3.1 原理簡介

    • 最早于1963年被提出,深度學習出現之前(2012),SVM被認為機器學習中近十年來,最成功、表現最好的算法。
    • 機器學習的一般框架:訓練集,提取特征向量, 結合一定的算法(分類器:比如決策樹,KNN),得到結果
    • SVM尋找區分兩類的超平面(hyper plane),使邊際(margin)最大
    • 總共可以有多少個超平面?無數個
    • 如何選取邊際最大的超平面(Max Margin Hyper plane)?
    • 超平面到一側最近點的距離等于到另一側最近點的距離,兩側的兩個超平面平行
    • 線性可區分(linear separable)和線性不可區分(linear inseparable)

    3.3.2 定義與公式建立

    • 一般情況
    超平面可定義為:W * X + b = 0 W:Weight Vector,權重 W={w1,w2,w3,w4...wn} n:特征值的個數 X:訓練實例 b:bias,偏好
    • 二維平面
    假設二維特征向量:x=(x1,x2) 把b想象成額外的weight 超平面的方程變為:w0 + w1*x1 + w2*x2 = 0 超平面右上方的點滿足:w0 + w1*x1 + w2*x2 > 0 超平面左下方的點滿足:w0 + w1*x1 + w2*x2 < 0
    • 所有坐落在邊際的兩邊的超平面上的向量被成為支持向量(support vectors)

    from sklearn import svmx = [[2, 0], [1, 1], [2, 3]] y = [0, 0, 1] clf = svm.SVC(kernel='linear') clf.fit(x, y) print clf # get support vectors print clf.support_vectors_ # get indices of support vectors print clf.support_ # get number of support vectors for each class print clf.n_support_

    3.3.3 SVM算法特性

    • 訓練好的模型的算法復雜度是由支持向量的個數決定的,而不是由數據的維度決定的。所以SVM不容易產生Overfitting。
    • SVM訓練出來的模型完全依賴于支持向量(Support Vector),即使訓練集里面所有非支持向量被去除,重復訓練過程,結果依然會得到完全一樣的模型。
    • 一個SVM如果訓練得出的支持向量個數比較少,SVM訓練出來的模型容易被泛化

    3.3.4 線性不可分情況

    • 數據集在空間中對應的向量不可被一個超平面區分

    兩個步驟來解決

    • 利用一個非線性的映射,把源數據集中的向量轉化到一個更高維度的空間
    • 在這個高維度的空間中,找一個線性的超平面來根據線性可分的情況處理

    • 如何選擇合理的非線性轉化把數據轉化到高維度?
    • 如何解決計算內積時算法復雜度非常高的問題?

    3.3.5 具體實現

    print __doc__ import numpy as np import pylab as pl from sklearn import svm# create 40 separable points np.random.seed(0) x = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]] y = [0] * 20 + [1] * 20# fit the model clf = svm.SVC(kernel='linear') clf.fit(x, y)# get the separating hyper plane w = clf.coef_[0] a = -w[0] / w[1] xx = np.linspace(-5, 5) yy = a * xx - (clf.intecept_[0]) / w[1]# plot the parallels to the separating hyper plane the pass through the support vectors b = clf.support_vectors_[0] yy_down = a * xx + (b[1] - a * b[0]) b = clf.support_vectors[-1] yy_up = a * xx + (b[1] - a * b[0])print "w:", w print "a:", a print "support_vectors:", clf.support_vectors_ print "clf.coef_", clf.coef_# plot the line,the points,and the nearest vectors the plane pl.plot(xx, yy, 'k-') pl.plot(xx, yy_down, 'k--') pl.plot(xx, yy_up, 'k--')pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80, facecolor='none') pl.scatter(x[:, 0], x[:, 1], c=y, cmap=pl.cm.Paired) pl.axis('tight') pl.show()

    3.4 神經網絡算法

    神經網絡算法(Neural Network)

    3.4.1 算法詳述

    • 背景:以人腦中的神經網絡為啟發,歷史上出現多個不同的版本,最著名的算法是1980年的Back Propagation,被使用在多層向前神經網絡上

    • 多層向前神經網絡Multilayer Feed-Forward Neural Network

    • 多層向前神經網絡由以下部分組成:輸入層(Input Layer),隱藏層(hidden layer),輸入層()

    • 每層由單元(units)組成

    • 輸入層(Input Layer)是由訓練集的實例特征向量傳入

    • 經過連接點的權重(weight)傳入下一層,一層的輸出是另一層的輸入

    • 隱藏層的個數可以是任意的,輸入層有一層,輸出層有一層

    • 每個單元也可以被稱作神經結點,根據生物學來定義

    • 以上稱為兩層的神經網絡(輸入層不算)

    • 一層中加權的求和,根據非線性方程轉化輸出

    • 作為多層向前神經網絡,理論上,如果有足夠多的隱藏層和足夠大的訓練集,理論上可模擬出任何方程。

    3.4.2 設計神經網絡結構

    • 使用神經網絡設計數據之前,必須確定神經網絡的層數,以及每層單元的個數
    • 特征向量在傳入輸入層時,通常先被標準化(normalize)0到1之間,為了加速學習的過程
    • 離散型變量可以被編碼成每一個輸入單元對應一個特征值可能賦的值,比如:特征值A可能取三個值(a0,a1,a2),可以使用三個輸入單元來代表A;如果A=a0,那么代表a0的單元值就取1,其他取0;如果A=a1,那么代表a1的單元值就取1,其他取0,以此類推
    • 神經網絡可以用來做分類問題(Classification)問題,也可以解決回歸問題(regression)問題
    • 對于分類問題,如果是兩類,可以用一個輸入單元表示,0和1分別代表兩類
    • 如果多于兩類,每一個類別用一個輸入單元表示,輸入層的單元數量通常等于類別數量
    • 沒有明確的規則來設計最好有多少個隱藏層,根據實驗測試及誤差以及準確度來改進
    • 交叉驗證方法(Cross Validation)

    3.4.3 Backpropagation算法

    • 通過迭代性來處理訓練集中的實例
    • 對比經過神經網絡后,輸入值預測值(predicted value)與真實值(target Value)之間
    • 反方向(輸出層-隱藏層-輸入層)來以最小化誤差來更新每個連接的權重
    • 算法詳細介紹
    輸入:D:數據集,學習率(Learning rate),一個層向前神經網路 輸出:一個訓練好的神經網路(a trained neural network) 初始化權重(weights)和偏向(bias) :隨機初始化到-1到1之間,或者-0.5到0.5之間,每個單元由一個偏向

    3.4.4 非線性轉化方程(Non-linear transformation function )

    • sigmoid 函數(S曲線)用來做Activation Function
    • 雙曲線函數(tanh)
    • 邏輯函數(logic function)

    3.4.5 神經網絡算法應用

    # coding=utf-8 import numpy as np# 雙曲線函數 def tanh(x):return np.tanh(x)# 雙曲線函數-導數 def tanh_deriv(x):return 1.0 - np.tanh(x) * np.tanh(x)# 邏輯函數 def logistic(x):return 1 / (1 + np.exp(-x))# 邏輯函數-導數 def logistic_derivative(x):return logistic(x) * (1 - logistic(x))class NeuralNetwork:def __init__(self, layers, activation='tanh'):''':param layers: A list containing the number of units in each layerShould be at least two layers:param activation: The activation function to be used.Can be "Logistic" or "tanh"'''if activation == 'logistic':self.activation = logisticself.activation_deriv = logistic_derivativeelif activation == 'tanh':self.activation = tanhself.activation_deriv = tanh_derivself.weights = []for i in range(1, len(layers) - 1):self.weights.append((2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)self.weights.append((2 * np.random.random((layers[i] + 1, layers[i + 1])) - 1) * 0.25)def fit(self, x, y, learning_rate=0.2, epochs=10000):x = np.atleast_2d(x) # numpy arraytemp = np.ones([x.shape[0], x.shape[1] + 1])temp[:, 0:-1] = x # adding the bias unit to the input layersx = tempy = np.array(y)for k in range(epochs):i = np.random.randint(x.shape[0])a = [x[i]]for l in range(len(self.weights)): # going forward network,for each layera.append(self.activation(np.dot(a[l], self.weights[l])))error = y[i] - a[-1] # compute the error at the top layerdeltas = [error * self.activation_deriv(a[-1])] # for output layer# starting back propagationfor l in range(len(a) - 2, 0, -1):deltas.append(deltas[-1].dot(self.weights[l].T) * self.activation_deriv(a[l]))deltas.reverse()for i in range(len(self.weights)):layer = np.atleast_2d(a[i])delta = np.atleast_2d(deltas[i])self.weights[i] += learning_rate * layer.T.dot(delta)def predict(self, x):x = np.array(x)temp = np.ones(x.shape[0] + 1)a = tempfor l in range(0, len(self.weights)):a = self.activation(np.dot(a, self.weights[l]))return a
    • 簡單非線性關系數據集測試(XOR)
    XY
    0,00
    0,11
    1,01
    1,11
    # coding=utf-8 from NeuralNetwork import NeuralNetwork import numpy as np''' 輸入層:兩個神經元 隱藏層:兩個神經元 輸出層:一個神經元 ''' nn = NeuralNetwork([2, 2, 1], 'tanh') x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([0, 1, 1, 0]) nn.fit(x, y) for i in [[0, 0], [0, 1], [1, 0], [1, 1]]:print i, nn.predict(i)

    4 監督學習-回歸

    4.1 簡單線性回歸

    簡單線性回歸(Simple Linear Regression)

    4.1.1 前提介紹

    統計量:描述數據特征

    • 集中趨勢衡量:均值(mean),中位數(medium)、眾數(mode)
    • 離散程度衡量:方差(variance),標準差(standard deviation)
    • 回歸(Regression):Y變量為連續型(continuous numerical variable),如房價、人數、降雨量
    • 分類(Classification):Y變量為類別型(categorical variable),如顏色類別,電腦品牌,有無信譽
    • 簡單線性回歸很多做決定的過程,通常是根據兩個或多個變量之間的關系
    • 回歸分析(Regression Analysis)用來建立方程,模擬兩個或者多個變量之間如何關聯
    • 被預測的變量叫做因變量(dependent variable),輸出(output)
    • 被用來預測的變量叫做自變量(Independent variable),輸入(input)
    • 簡單線性回歸包含一個自變量和一個因變量,兩個變量的關系用一條直線來模擬。如果包含兩個以上自變量,則稱多元回歸分析(multiple regression)
    • 簡單線性回歸模型被用來描述因變量和自變量以及偏差(error)之間關系的模型叫做回歸模型
    • 簡單線性回歸方程:E(y) = B0 + B1 * x
    方程對應的圖像是一條直線,稱為回歸線 B0是回歸線的截距 B1是回歸線的斜率 E(y)是在一個給定x值下y的期望(均值)
    • 正向線性關系
    • 負向線性關系
    • 無關系
    • 線性回歸分析流程
    • 關于偏差的假定
    偏差是一個隨即變量,均值為0 偏差的方差對于所有的自變量X是一樣的 偏差的值是獨立的 偏差滿足正態分布

    4.1.2 簡單線性模型舉例

    • 汽車賣家做電視廣告數量與賣出汽車的數量
    • 如何計算適合簡單線性回歸模型的最佳回歸線?

    • python代碼實現
    # coding=utf-8 import numpy as np # 科學計算包def fitSLR(x, y):"""計算簡單線性回歸模型的最佳回歸線:param x:數組類型:param y:數組類型:return:最佳回歸線參數:y = b0 + b1 * x"""n = len(x) # 數據長度denominator = 0 # 分母numerator = 0 # 分子for i in range(0, n):numerator += (x[i] - np.mean(x)) * (y[i] - np.mean(y))denominator += (x[i] - np.mean(x)) ** 2print 'numerator:', numeratorprint 'denominator:', denominatorb1 = numerator / float(denominator)# b0 = np.mean(y) / float(np.mean(x))b0 = np.mean(y) - b1 * np.mean(x)return b0, b1def predict(x, b0, b1):return b0 + x * b1x = [1, 3, 2, 1, 3] y = [14, 24, 18, 17, 27]b0, b1 = fitSLR(x, y) print "intercept:", b0, "slope:", b1# 假設一周廣告數量為6,預測的汽車銷量是多少? x_test = 6 y_test = predict(x_test, b0, b1) print "y_test:", y_test

    4.2 多元回歸分析(Multiple Regression)

  • 與簡單線性回歸分析(simple linear regression)的區別:多個自變量x
  • 多元回歸模型
  • 多元回歸方程
  • 估計多元回歸方程
  • 估計流程(與簡單線性回歸類似)
  • 估計方法:使sum of squares最小,運算與簡單線性回歸類似,涉及到線性代數和矩陣代數的運算
  • 例子:一家公司送貨,X1表示運輸里程,X2表示運輸次數,Y表示總運輸時間
  • 估計模型
    • Time = b0 + b1 * Miles + b2 * Deliveries
    • Time = -0.869 + 0.0611 * Miles + 0.923 * Deliveries
    • b0:
    • b1:平均每多送一英里,運輸時間延長0.0611小時
    • b2:平均每多一次運輸,運輸時間延長0.923小時
  • 預測:若一個運輸任務是跑102英里,運輸6次,預計10.9小時
  • 關于誤差的分布
  • dataset and code
  • 100,4,9.3 50,3,4.8 100,4,8.9 100,2,6.5 50,2,4.2 80,2,6.2 75,3,7.4 65,4,6.0 90,3,7.6 90,2,6.1

    python源代碼

    # coding=utf-8 from numpy import genfromtxt # 將CSV數據轉換成Numpy Arrays import numpy as np from sklearn import datasets, linear_modeldataPath = r'D:\IDEA\ML\MachineLearningBasics\DataSets\Delivery.csv' deliveryData = genfromtxt(dataPath, delimiter=',') # 文件路徑,分隔符print 'data:' print deliveryDataX = deliveryData[:, :-1] # 所有行且除最后一列之外的數據 Y = deliveryData[:, -1] # 所有行的最后一列print 'X:' print X print 'Y:' print Yregr = linear_model.LinearRegression() regr.fit(X, Y)print 'Coefficients:' print regr.coef_ # 參數預測 print 'intercept:' print regr.intercept_ # 截面或截距xPred = [[102, 6]] yPred = regr.predict(xPred) print 'predicted y:' print yPred
  • 如果自變量中有分類型變量(Categorical Data),該如何處理?
  • 100,4,0,1,0,9.3 50,3,1,0,0,4.8 100,4,0,1,0,8.9 100,2,0,0,1,6.5 50,2,0,0,1,4.2 80,2,0,1,0,6.2 75,3,0,1,0,7.4 65,4,1,0,0,6 90,3,1,0,0,7.6

    4.3 非線性回歸-logistic regression

  • 概率(Probability):對一件事情發生的可能性的衡量
    • 范圍:0 <= P <= 1
    • 計算方法:根據個人置信;根據歷史數據;根據模擬數據
    • 條件概率
    • 例子
  • 基本模型

    • 向量表示
    • 處理二值數據,引入Sigmoid函數時曲線平滑化

    • 預測函數
    • 用概率表示:正例(y=1)
    • 用概率表示:反例(y=0)
  • Cost 函數
    • 線性回歸



  • 梯度下降方法實現
  • # coding=utf-8 import numpy as np import random# m denotes the number of examples here, not the number of features def gradientDescent(x, y, theta, alpha, m, numIterations):"""梯度下降方法:param x:矩陣,每一行代表一個實例:param y:一維向量:param theta:向量值,最終要學習的值:param alpha:學習率:param m:實例的總個數:param numIterations:重復次數:return:"""xTrans = x.transpose() # 計算轉置矩陣for i in range(0, numIterations):hypothesis = np.dot(x, theta) # 內積,預測值loss = hypothesis - y# ave cost per example (the 2 in 2*m doesn't really matter here)# but to be consistent with the gradient, I include itcost = np.sum(loss ** 2) / (2 * m) # 逐漸減少print ("Iteration: %d / Cost: %f" % (i, cost))# ave gradient per examplegradient = np.dot(xTrans, loss) / m# updatetheta = theta - alpha * gradientreturn thetadef genData(numPoints, bias, variance):"""生成數據:param numPoints:有多少個實例:param bias:偏好值:param variance:方差:return:"""x = np.zeros(shape=(numPoints, 2)) # 初始化numPoints行,2列y = np.zeros(shape=numPoints) # 初始化numPoints行,1列# basically a straight linefor i in range(0, numPoints): # [0,numPoints)# bias featurex[i][0] = 1 # 每一行的第一列為1x[i][1] = i # 每一行的第二列為行號# cur target variabley[i] = (i + bias) + random.uniform(0, 1) * variance #return x, y# generate 100 points with a bias of 25 and 10 variance as a bit of noisex, y = genData(100, 25, 10) print 'x:' print x print 'y:' print y m, n = np.shape(x) # x的行數和列數 n_y = np.shape(y) # y的長度 print 'x shape:', str(m), ' ', str(n) print 'y length:', str(n_y)numIterations = 100000 alpha = 0.0005 theta = np.zeros(n) theta = gradientDescent(x, y, theta, alpha, m, numIterations) print theta

    4.3 回歸中的相關度和R平方值

  • 皮爾遜相關系數(Pearson Correlation Coefficient)
    • 衡量兩個值線性相關強度的量,取值范圍 [-1,1]
    • 正相關:> 0,負相關:< 0,無相關性:= 0


  • R平方值
    • 定義:決定系數,反應因變量的全部變異,能通過回歸關系被自變量解釋的比例
    • 描述:如R平方為0.8,則表示回歸關系可以解釋因變量80%的變異,換句話說,如果我們能控制自變量不變,則因變量的變異程度會減少80%
    • 簡單線性回歸:R^2 = r * r
    • 多元線性回歸:
    # coding=utf-8 import numpy as np from astropy.units import * import mathdef ComputeCorrelation(X, Y):"""計算相關度:param X: 向量1:param Y: 向量2:return:相關度"""xBar = np.mean(X) # 均值yBar = np.mean(Y) # 均值SSR = 0varX = 0varY = 0for i in range(0, len(X)):diffXXBar = X[i] - xBardiffYYBar = Y[i] - yBarSSR += (diffXXBar * diffYYBar)varX += diffXXBar ** 2varY += diffYYBar ** 2SST = math.sqrt(varX * varY)return SSR / SST# Polynomial Regression def polyFit(x, y, degree):results = {}coeffs = np.polyfit(x, y, degree)# Polynomial Coefficientsresults['polynomial'] = coeffs.tolist()# r.squaredp = np.poly1d(coeffs)# fit values,and meanyhat = p(x)ybar = np.sum(y) / len(y)ssreg = np.sum((yhat - ybar) ** 2)sstot = np.sum((y - ybar) ** 2)results['determination'] = ssreg / sstotreturn resultstestX = [1, 3, 8, 7, 9] testY = [10, 12, 24, 21, 34] print 'r:', ComputeCorrelation(testX, testY) print 'r^2:', str(ComputeCorrelation(testX, testY) ** 2) print polyFit(testX, testY, 1)['determination']

    5 非監督學習

    非監督學習(Unsupervised Learning)

    5.1 聚類(Clustering):k-means算法

  • 歸類:聚類(Clustering)屬于非監督學習(unsupervised learning),無類別標記(Class Label)
  • 舉例
  • K-mean算法
    • Clustering中的經典算法,數據挖掘十大經典算法之一
    • 算法接收參數K,將事先輸入的N個數據對象劃分為K個聚類以便使所獲得的聚類滿足:同一聚類中的對象相似度較高,而不同聚類中對象相似度較小
    • 算法思想:以空間中K個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果
  • 算法描述:
    (1)適當選擇C個類的初始中心
    (2)在第K次迭代中,對任意一個樣本,求其到C各中心的距離,將該樣本歸到距離最短的中心所在的類。
    (3)利用均值等方法更新該類的中心值
    (4)對于所有的C個聚類中心,如果(2)(3)的迭代法更新后,值保持不變,則迭代結束,否則繼續迭代
  • 算法流程
    輸入:K,data[n]
    (1) 選擇K個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1]
    (2) 對于data[0]…data[n],分別與c[0]…c[k-1]比較,假定與c[i]差值最小,就標記為i
    (3) 對于所有標記為i點,重新計算c[i]={所有標記為i的data[j]之和} / 標記為i的個數
    (4) 重復(2)(3),直到所有c[i]值的變化小于給定閾值
  • 算法特點
    • 優點速度快,簡單
    • 缺點:最終結果跟初始點選擇相關,容易陷入局部最優,需要確定K值
  • Python代碼實現
  • # coding=utf-8 import numpy as np# Function: K Means def KMeans(x, k, maxIt):"""K-mean算法:param x: 數據集:param k: K個聚類:param maxIt: 最大迭代次數:return: 最多迭代次數"""numPoints, numDim = x.shape # 矩陣的行和列dataSet = np.zeros((numPoints, numDim + 1))dataSet[:, :-1] = x # 所有行+除去最后一列# Initialize centroids randomly#centroids = dataSet[np.random.randint(numPoints, size=k), :] # 隨機選取中心點,隨機K行+所有列centroids = dataSet[0:2, :]# Randomly assign labels to initial centroidscentroids[:, -1] = range(1, k + 1) # 初始化中心點[1,k)# Initialize book keeping varsiterations = 0 # 迭代次數oldCentroids = None# Run the Main k-Means Algorithmwhile not shouldStop(oldCentroids, centroids, iterations, maxIt):print 'Iterations:\n', iterationsprint 'dataSet:\n', dataSetprint 'centroids:\n', centroids# Save old centroids for convergence test.oldCentroids = np.copy(centroids)iterations += 1# Assign labels to each data points base on centroidsupdateLabels(dataSet, centroids)# Assign centroids base on dataPoint labelcentroids = getCentroids(dataSet, k)return dataSetdef shouldStop(oldCentroids, centroids, iterations, maxIt):"""迭代是否停止:param oldCentroids: 舊中心點:param centroids: 現中心點:param iterations: 現迭代次數:param maxIt: 最大迭代次數:return: true or false"""if iterations > maxIt:return Truereturn np.array_equal(oldCentroids, centroids)def updateLabels(dataSet, centroids):numPoints, numDim = dataSet.shapefor i in range(0, numPoints):dataSet[i, -1] = getLabelFromClosestCentroid(dataSet[i, :-1], centroids)def getLabelFromClosestCentroid(dataSetRow, centroids):label = centroids[0, -1]minDist = np.linalg.norm(dataSetRow - centroids[0, :-1])for i in range(1, centroids.shape[0]):dist = np.linalg.norm(dataSetRow - centroids[i, :-1])if dist < minDist:minDist = distlabel = centroids[i, -1]print 'minDist:', minDistreturn labeldef getCentroids(dataSet, k):result = np.zeros((k, dataSet.shape[1]))for i in range(1, k + 1):oneCluster = dataSet[dataSet[:, -1] == i, :-1]result[i - 1, :-1] = np.mean(oneCluster, axis=0)result[i - 1, -1] = ireturn resultx1 = np.array([1, 1]) x2 = np.array([2, 1]) x3 = np.array([4, 3]) x4 = np.array([5, 4]) testX = np.vstack((x1, x2, x3, x4))result = KMeans(testX, 2, 10) print "final result:\n", result

    5.2 聚類(Clustering):層次聚類

  • 假設有N個待聚類的樣本,對于層次聚類來說
    (1) (初始化)把每個樣本歸為一類,計算兩個類之間的距離,也就是樣本與樣本之間的相似度
    (2) 尋找各個類之間最近的兩個類,把他們歸為一類,這樣類的總數就少了一個
    (3) 重新計算新生成的這個類與各個舊類之間的相似度
    (4) 重復2和3直到所有的樣本歸為一類,結束
  • 整個聚類過程其實是建立了一棵樹,在建立的過程中,可以通過在第二步上設置一個閾值,當最近的兩個類大于這個閾值,則認為迭代可以終止。另外關鍵的一步就是第三步,如何判斷兩個類之間的相似度有多種方法。
    • SingleLinkage:又叫做nearest-neighbor,就是取兩個類中距離最近的兩個樣本的距離作為這兩個集合的距離,也就是說,最近兩個樣本之間的距離越小,這兩個類之間的相似度就越大。容易造成一種叫做鏈式(chaining)的效果,兩個聚類明明從大局上離得比較遠,但是由于其中個別的點距離比較近就被合并了,并且這樣合并之后,鏈式效果會進一步擴大,最后會得到比較松散的聚類。
    • completeLinkage:這個則完全是SingleLinkage的反面極端,取兩個集合中距離最遠的兩個點的距離作為兩個集合的距離,其效果也是剛好相反的,限制非常大,兩個聚類即使已經很接近了但是只要有不配合的點存在,就頑固到底,老死不相合并,也是不太好的辦法,這兩種相似度的定義方法的共同問題就是只考慮了某個有特點的數據,而沒有考慮類內數據的整體特點。
    • average-linkage:這種方法就是把兩個集合中的點的距離全部放在一起求一個平均值,也能得到相對合適的結果。
    • average-linkage:一個變種就是取兩兩距離的中值,與取均值相比更加能夠解除個別偏離樣本對結果的干擾。

    6 小結

    機器學習(Machine Learning)

  • 概念:多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、算法復雜度等多門學科,專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構,使之不斷改善自身的性能。
  • 學科定位:人工智能(Artificial Intelligence)的核心,是計算機具有智能的根本途徑,其應用遍及人工智能的各個領域,主要使用歸納和綜合,而不是演繹
  • 定義
    • 探究和開發一系列算法,使計算機不需要外部明顯的指示,可以自己通過數據來學習和建模,并且利用建好的模型和新的輸入來進行預測的學科。
    • 一門不需要外部程序指示而讓計算機有能力自我學習的學科。
    • 機器學習是一門人工智能的科學,該領域主要研究對象是人工智能,特別是如何在經驗中改善具體算法的性能。
    • 機器學習是對能通過經驗,自動改進的計算機算法的研究
  • 學習:針對經驗E、一系列任務T、一定表現的衡量P,如果隨經驗E的積累,針對定義好的任務T可以提高表現P,就說計算機具有學習能力。例如,下棋、語音識別、自動駕駛
  • 總結

    以上是生活随笔為你收集整理的软件研发工程师转行机器学习之路的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。