Perceptron演算法—C語言
本篇介紹第三個演算法,感知機演算法,同樣僅介紹兩個主要函式:預測函式和訓練函式。
需要說明,本演算法仍使用隨機梯度下降演算法,與上篇多元線性迴歸有很多相似之處。
演算法介紹
啟用函式可以如下表示:
a
c
t
i
v
a
t
i
o
n
=
b
i
a
s
+
∑
i
=
1
n
w
e
i
g
h
t
i
×
x
i
activation = bias + \sum_{i=1}^{n}weight_i×x_i
activation=bias+i=1∑nweighti×xi
階躍函式
p
r
e
d
i
c
t
i
o
n
=
1.0
I
F
a
c
t
i
v
a
t
i
o
n
≥
0.0
E
L
S
E
0.0
prediction = 1.0 IF activation ≥ 0.0 ELSE 0.0
prediction=1.0IFactivation≥0.0ELSE0.0
函式
讀取csv
- 以下三個函式分別為獲取行數、獲取列數、獲取文字內容。
double **dataset;
int row,col;
int get_row(char *filename)//獲取行數
{
char line[1024];
int i = 0;
FILE* stream = fopen(filename, "r");
while(fgets(line, 1024, stream)){
i++;
}
fclose(stream);
return i;
}
int get_col(char *filename)//獲取列數
{
char line[1024];
int i = 0;
FILE* stream = fopen(filename, "r");
fgets(line, 1024, stream);
char* token = strtok(line, ",");
while(token){
token = strtok(NULL, ",");
i++;
}
fclose(stream);
return i;
}
void get_two_dimension(char* line, double** data, char *filename)
{
FILE* stream = fopen(filename, "r");
int i = 0;
while (fgets(line, 1024, stream))//逐行讀取
{
int j = 0;
char *tok;
char* tmp = strdup(line);
for (tok = strtok(line, ","); tok && *tok; j++, tok = strtok(NULL, ",\n")){
data[i][j] = atof(tok);//轉換成浮點數
}//字串拆分操作
i++;
free(tmp);
}
fclose(stream);//檔案開啟後要進行關閉操作
}
EXAMPLE
int main()
{
char filename[] = "data.csv";
char line[1024];
double **data;
int row, col;
row = get_row(filename);
col = get_col(filename);
data = (double **)malloc(row * sizeof(int *));
for (int i = 0; i < row; ++i){
data[i] = (double *)malloc(col * sizeof(double));
}//動態申請二維陣列
get_two_dimension(line, data, filename);
printf("row = %d\n", row);
printf("col = %d\n", col);
int i, j;
for(i=0; i<row; i++){
for(j=0; j<col; j++){
float mean = (float)(sum / length);
return mean;
}
隨機梯度下降估計迴歸係數
更新方程:
KaTeX parse error: Undefined control sequence: \ at position 29: …iction-expected\̲ ̲
b 1 ( t + 1 ) = b 1 ( t ) − l e a r n i n g r a t e × e r r o r ( t ) × x 1 ( t ) b_1(t+1) = b_1(t) - learning\space rate × error(t) × x_1(t) b1(t+1)=b1(t)−learning rate×error(t)×x1(t)
b 0 ( t + 1 ) = b 0 ( t ) − l e a r n i n g r a t e × e r r o r ( t ) b_0(t+1) = b_0(t) - learning\space rate × error(t) b0(t+1)=b0(t)−learning rate×error(t)
// 引數為:資料集、每個資料集屬性個數(帶label)、權重、學習率、epoch、train_size
void train_weights(double **data, int col,double *weights, double l_rate, int n_epoch, int train_size) {
int i;
for (i = 0; i < n_epoch; i++) {
int j = 0;//遍歷每一行
for (j = 0; j < train_size; j++) {
double yhat = predict(col,data[j], weights);
double err = data[j][col - 1] - yhat;
weights[0] += l_rate * err;
int k;
for (k = 0; k < col - 1; k++) {
weights[k + 1] += l_rate * err * data[j][k];
}
}
}
for (i = 0; i < col; i++) {
printf("weights[%d]=%f\n",i, weights[i]);
}
}
預測函式
// 引數:樣本屬性個數、樣本、權重
double predict(int col,double *array, double *weights) {//預測某一行的值
double activation = weights[0];
int i;
for (i = 0; i < col - 1; i++)
activation += weights[i + 1] * array[i];
double output = 0.0;
if (activation >= 0.0)
output = 1.0;
else
output = 0.0;
return output;
}
相關文章
- 排序演算法-C語言實現排序演算法C語言
- PID演算法的C語言實現演算法C語言
- C語言演算法之猴子吃桃C語言演算法
- C語言C語言
- 聊聊C語言/C++—程式和程式語言C語言C++
- 最短路徑——dijkstra演算法程式碼(c語言)演算法C語言
- 最短路徑——floyd演算法程式碼(c語言)演算法C語言
- C語言實現九大排序演算法C語言排序演算法
- 試題 演算法提高 質數2(C語言)演算法C語言
- C語言字串C語言字串
- C語言(一)C語言
- C語言: returnC語言
- C語言 typedefC語言
- C語言與嵌入式C語言的區別C語言
- C語言學習方法,怎麼學習C語言?C語言
- 經典排序演算法的 C語言 | Java 實現排序演算法C語言Java
- C語言演算法之17:細胞生命遊戲C語言演算法遊戲
- go語言與c語言的相互呼叫GoC語言
- 1901:The C programming language !(C語言)C語言
- C語言教程——03 C語言結構C語言
- C語言:extern用法C語言
- C語言版本迭代C語言
- C語言 截圖C語言
- C語言 - 字串拼接C語言字串
- C語言加強C語言
- c語言複習C語言
- c語言入門C語言
- C語言位操作C語言
- 初識C語言C語言
- c語言筆記C語言筆記
- C語言基礎C語言
- c語言作業C語言
- C語言 共用體C語言
- C語言 備份C語言
- C語言指標C語言指標
- Linux-C語言LinuxC語言
- c語言_遞迴C語言遞迴
- C語言陣列C語言陣列