1. 程式人生 > >統計學習方法——感知機演算法(基於R語言)

統計學習方法——感知機演算法(基於R語言)

演算法2.1

train <- function(mat) {

  nr <- nrow(mat)
  nc <- ncol(mat)

  w0 <- matrix(0,nc - 1,1)
  b0 <- 0      
  n <- 1       #學習率

  study_count <- 0
  nochange_count <- 0
  nochange_upper_limit <- 100000       #連續分類正確次數上限
  study_total <- 10000                 #學習次數總數

  while (TRUE
) { nochange_count <- nochange_count + 1 if (nochange_count > nochange_upper_limit) {break} #連續分類正確次數大於上限時,將跳出while迴圈,認為訓練完成 index <- sample(nr,1,replace = FALSE) img <- mat[index,1:(nc-1)] yi <- mat[index,nc] result <- (img %*% w0 + b0) *yi if (result <= 0
) { img <- matrix(mat[index,1:(nc-1)],nc-1,1) w0 <- w0 + n * yi * img b0 <- b0 + n * yi study_count <- study_count + 1 if (study_count > study_total) {break} ##學習次數超過10000次,將跳出while迴圈,認為訓練完成 nochange_count <- 0 ##分類錯誤的話,nochange_count重歸0
} #print(index) } wb <- list(w0 = w0,b0 = b0) return (wb) } mat <- matrix(c(3,3,1,4,3,1,1,1,-1),nrow = 3,byrow = TRUE)#例題 mat # debug(train) #除錯 # train(mat) # undebug(train) wb <- train(mat) wb #$w0 # [,1] #[1,] 1 #[2,] 1 #$b0 #[1] -3 ###predict function predict <- function(test_mat) { result <- NULL for ( i in 1:nrow(test_mat)){ result_1 <- test_mat[i,] %*% wb$w0 + wb$b0 result_1 <- ifelse(result_1 > 0,1,-1) result <- rbind(result,result_1) } return(result) } test_ <- matrix(seq(-100,99,by = 1),100,2,byrow = TRUE) predict(test_)

演算法2.2

#計算gram矩陣
caculate_gram <- function(mat) {

  mat_g <- mat[,-ncol(mat)]    ##最後一列為標籤值
  #mat_g
  mat_gr <- matrix(0,nrow(mat_g),nrow(mat_g))
  for (i in 1:nrow(mat_g)) {
    for (j in 1:nrow(mat_g)) {
      mat_gr[i,j] <- mat_g[i,] %*% mat_g[j,]
    }
  }
  return(mat_gr)
}

matr <- matrix(seq(1:1000),100,10)
caculate_gram(matr)
#計算gram矩陣結束

mat <- matrix(c(3,3,1,4,3,1,1,1,-1),nrow = 3,byrow = TRUE)#例題
gram_mat <- caculate_gram(mat)      #計算gram矩陣
train_2 <- function(mat) {

  nr <- nrow(mat)
  nc <- ncol(mat)

  alpha <- matrix(0,nr,1)
  b0 <- 0
  n <- 1     #學習率

  study_count <- 0
  nochange_count <- 0
  nochange_upper_limit <- 100000       #連續分類正確次數上限
  study_total <- 10000                 #學習次數總數

  while (TRUE) {
    nochange_count <- nochange_count + 1
    if (nochange_count > nochange_upper_limit) {break}    #連續分類正確次數大於上限時,將跳出while迴圈,認為訓練完成

    index <- sample(nr,1,replace = FALSE)
    yi <- mat[index,nc]

    result <- yi * (sum(alpha * mat[,nc] * gram_mat[index,]) + b0)

    if (result <= 0) {

      alpha[index,1] <- alpha[index,1] + n
      b0 <- b0 + n * yi

      study_count <- study_count + 1

      if (study_count > study_total) break      ##學習次數超過10000次,將跳出while迴圈,認為訓練完成   

      nochange_count <- 0                       ##分類錯誤的話,nochange_count重歸0
    }
    print(index)
  }

  #計算w
  w <- 0
  for (k in 1:nr) {
    w0 <- alpha[k,1] * mat[k,-nc] * mat[k,nc]
    w <- w + w0 
  }

  #print(index)

  wb <- list(alpha = alpha,w = w,b0 = b0, nochange_count = nochange_count,study_count = study_count)
  return (wb)
}

wb <- train_2(mat)
wb         #演算法有多個解
#$w
#[1] 2 1

#$b0
#[1] -5

#$nochange_count
#[1] 100001

#$study_count
#[1] 11

#predict function
predict <- function(test_mat) {

  result <- NULL
  for ( i in 1:nrow(test_mat)){

    result_1 <-  test_mat[i,] %*% wb$w + wb$b0 
    result_1 <- ifelse(result_1 > 0,1,-1)

    result <- rbind(result,result_1)
  }
  return (result)
}

test_ <- matrix(seq(-100,99,by = 1),100,2,byrow = TRUE)
predict(test_)

相關推薦

統計學習方法——感知演算法基於R語言

演算法2.1 train <- function(mat) { nr <- nrow(mat) nc <- ncol(mat) w0 <- matrix(0,nc - 1,1) b0 <- 0

統計學習方法感知(附簡單模型程式碼)

1. 感知機模型 輸入為例項的特徵向量, 輸出為例項的類別, 取+1和-1;感知機對應於輸入空間中將例項劃分為正負兩類的分離超平面, 屬於判別模型;匯入基於誤分類的損失函式;利用梯度下降法對損失函式進行極小化;感知機學習演算法具有簡單而易於實現的優點, 分為原始形式和對偶形式;1957年由Ros

感知演算法Perceptron Learning Algorithm和程式碼實現Python

PLA演算法是機器學習中最為基礎的演算法,與SVM和Neural Network有著緊密的關係。                            &n

感知演算法SVM簡化版

1 演算法概述 1.1 工作原理 感知機是二類分類線性模型,在特徵空間中,用一個超平面將正類、負類分離,我們所要做的就是求得這個超平面。使用指示函式sign作為輸入到輸出的對映,sign(w·x+b)

《深度學習精要基於R語言》高清中文版PDF+高清英文版PDF+源代碼

dbd 語言 process sha http com cto oss RoCE 下載:https://pan.baidu.com/s/11zySQB5f0s9SXNgJdBOphg 更多最新的資料:http://blog.51cto.com/3215120 《深度學習精要

分享《深度學習精要基於R語言》+PDF+源碼+Joshua F.Wiley+高蓉

blog aaa 講解 pro 高清 water tex href ces 下載:https://pan.baidu.com/s/14UlxD5VJRY92UpP7Wr6Taw 更多最新的資料:http://blog.51cto.com/14087171 《深度學習精要(基

中文分詞實踐基於R語言

    背景:分析使用者在世界盃期間討論最多的話題。     思路:把使用者關於世界盃的帖子拉下來,然後做中文分詞+詞頻統計,最後將統計結果簡單做個標籤雲,效果如下:          後續:中文分詞是中文資訊處理的基礎,分詞之後,其實還有特別多有趣的文字挖掘工作可

統計學習方法》筆記七2 支援向量——線性支援向量

本系列筆記內容參考來源為李航《統計學習方法》 線性不可分的通常情況是訓練資料中有一些特異點,將這些點去除後,剩下的大部分樣本點組成的結合是線性可分的。即某些樣本點不能滿足函式間隔≥1的約束條件,據此,對每個樣本點引入鬆弛變數,使函式間隔加上鬆弛變數≥1。 對偶演算法 支援向量 合頁損失

【NLP】基於統計學習方法角度談談CRF

作者:白寧超 2016年8月2日13:59:46 【摘要】:條件隨機場用於序列標註,資料分割等自然語言處理中,表現出很好的效果。在中文分詞、中文人名識別和歧義消解等任務中都有應用。本文源於筆者做語句識別序列標註過程中,對條件隨機場的瞭解,逐步研究基於自然語言處理方面的應用。成文主要源於自然語言處理

線性判別--感知演算法perceptron algorithm

  感知器演算法是一種線性判別演算法,它適用於二分類模型。在這個模型中,輸入向量x\mathbf{x}x首先使用一個固定的非線性變換得到一個特徵向量ϕ(x)\phi(\mathbf{x})ϕ(x),接著用這個特徵向量構造一個線性模型: (1)y(x)=f(wTϕ

機器學習——感知模型附完整程式碼

感知機是這一種二類線性分類模型,其輸入例項的特徵向量,輸出為例項的類別,取+1和-1二值。感知機模型和LR模型(https://blog.csdn.net/u014571489/article/details/83387681 ) 一樣都是二分模型,但是目標函式(損失函式)不一樣。 感知

統計學習方法:核函式Kernel function

作者:桂。 時間:2017-04-26  12:17:42 前言 之前分析的感知機、主成分分析(Principle component analysis, PCA)包括後面看的支撐向量機(Support vector machines, SVM),都有用到核函式。核函式是將訊號對映到高維

統計學習方法 k 近鄰演算法(附簡單模型程式碼)

1. k 近鄰演算法 k近鄰法(k-nearest neighbor, k-NN) 是一種基本分類與迴歸方法。  k近鄰法的輸入為例項的特徵向量, 對應於特徵空間的點; 輸出為例項的類別, 可以取多類。 k近鄰法假設給定一個訓練資料集, 其中的例項類別已定。 分類時, 對新的例項, 根

感知演算法PLA程式碼實現

[TOC] ### 1. 引言 在這裡主要實現感知機演算法(PLA)的以下幾種情況: - PLA演算法的原始形式(二分類) - PLA演算法的對偶形式(二分類) - PLA演算法的作圖(二維) - PLA演算法的多分類情況(包括one vs. rest 和one vs. one 兩種情況) - PLA演算法

【機器學習演算法基於R語言的多元線性迴歸分析

多元線性迴歸的適用條件: (1)自變數對應變數的變化具有顯著影響 (2)自變數與應變數間的線性相關必須是真實的,而非形式上的 (3)自變數之間需有一定的互斥性 (4)應具有完整的統計資料 訓練資料:csv格式,含有19維特徵 資料下載地址:http://pan.baidu

光條中心線提取-Steger演算法基於Hessian矩陣

採用結構光進行掃描檢測時,需要提取鐳射條紋的中心線,本文采用經典的Steger演算法提取光條中心。 Steger演算法原理 Steger演算法基於Hessian矩陣,能夠實現光條中心亞畫素精度定位:首先通過Hessian矩陣能夠得到光條的法線方向,然後在法線

機器學習之聚類演算法層次聚類

層次聚類也叫連通聚類方法,有兩個基本方法:自頂而下和自底而上。自頂而將所有樣本看做是同一簇,然後進行分裂。自底而上將初所有樣本看做不同的簇,然後進行凝聚。這種聚類的中心思想是:離觀測點較近的點相比離觀測點較遠的點更可能是一類。 這種方法首先會生成下面的樹

Apriori演算法基於R的應用示例

這裡我們採用上文的資料集,利用R來做一個簡單的應用示例: TID 項集 T1 I1, I2, I5 T2 I2, I4 T3 I2, I3 T4 I1, I2, I4 T5 I1, I3 T6  I2, I3 T7 I1, I3 T8 I1, I2, I3, I5 T9

機器學習——支援向量SVMSupport Vector Machine

1、SVM演算法特徵 (1)訓練好的模型的演算法複雜度是由支援向量的個數決定的,而不是由資料的維度決定。所以,SVM不太容易產生overfitting。 (2)SVM訓練出來的模型完全依賴於支援向量(

Liblinear機器學習庫教程詳解基於Python API

前言 Liblinear機器學習庫主要實現SVM演算法,在處理大規模資料時速度快,但也有缺點,就是太吃記憶體,部落格 https://blog.csdn.net/roguesir/article/details/79793569 中介紹了在Mac Python