From 9b52d05e0e7fd151cd19a819039224eee10b354b Mon Sep 17 00:00:00 2001
From: WenDesi <641614152@qq.com>
Date: Fri, 16 Dec 2016 21:51:27 +0800
Subject: [PATCH 1/6] add softmax
---
softmax/softmax.py | 131 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 131 insertions(+)
create mode 100644 softmax/softmax.py
diff --git a/softmax/softmax.py b/softmax/softmax.py
new file mode 100644
index 0000000..b7ddd81
--- /dev/null
+++ b/softmax/softmax.py
@@ -0,0 +1,131 @@
+# encoding=utf8
+
+import math
+import pandas as pd
+import numpy as np
+import random
+import time
+
+from sklearn.model_selection import train_test_split
+from sklearn.metrics import accuracy_score
+
+
+class Softmax(object):
+
+ def __init__(self):
+ self.learning_step = 0.000001 # 学习速率
+ self.max_iteration = 100000 # 最大迭代次数
+ self.weight_lambda = 0.01 # 衰退权重
+
+ def cal_e(self,x,l):
+ '''
+ 计算博客中的公式3
+ '''
+
+ theta_l = self.w[l]
+ product = np.dot(theta_l,x)
+
+ return math.exp(product)
+
+ def cal_probability(self,x,j):
+ '''
+ 计算博客中的公式2
+ '''
+
+ molecule = self.cal_e(x,j)
+ denominator = sum([self.cal_e(x,i) for i in range(self.k)])
+
+ return molecule/denominator
+
+
+ def cal_partial_derivative(self,x,y,j):
+ '''
+ 计算博客中的公式1
+ '''
+
+ first = int(y==j) # 计算示性函数
+ second = self.cal_probability(x,j) # 计算后面那个概率
+
+ return -x*(first-second) + self.weight_lambda*self.w[j]
+
+ def predict_(self, x):
+ result = np.dot(self.w,x)
+ row, column = result.shape
+
+ # 找最大值所在的列
+ _positon = np.argmax(result)
+ m, n = divmod(_positon, column)
+
+ return m
+
+ def train(self, features, labels):
+ self.k = len(set(labels))
+
+ self.w = np.zeros((self.k,len(features[0])+1))
+ time = 0
+
+ while time < self.max_iteration:
+ print('loop %d' % time)
+ time += 1
+ index = random.randint(0, len(labels) - 1)
+
+ x = features[index]
+ y = labels[index]
+
+ x = list(x)
+ x.append(1.0)
+ x = np.array(x)
+
+ derivatives = [self.cal_partial_derivative(x,y,j) for j in range(self.k)]
+
+ for j in range(self.k):
+ self.w[j] -= self.learning_step * derivatives[j]
+
+ def predict(self,features):
+ labels = []
+ for feature in features:
+ x = list(feature)
+ x.append(1)
+
+ x = np.matrix(x)
+ x = np.transpose(x)
+
+ labels.append(self.predict_(x))
+ return labels
+
+
+if __name__ == '__main__':
+
+ print('Start read data')
+
+ time_1 = time.time()
+
+ raw_data = pd.read_csv('../data/train.csv', header=0)
+ data = raw_data.values
+
+ imgs = data[0::, 1::]
+ labels = data[::, 0]
+
+ # 选取 2/3 数据作为训练集, 1/3 数据作为测试集
+ train_features, test_features, train_labels, test_labels = train_test_split(
+ imgs, labels, test_size=0.33, random_state=23323)
+ # print train_features.shape
+ # print train_features.shape
+
+ time_2 = time.time()
+ print('read data cost '+ str(time_2 - time_1)+' second')
+
+ print('Start training')
+ p = Softmax()
+ p.train(train_features, train_labels)
+
+ time_3 = time.time()
+ print('training cost '+ str(time_3 - time_2)+' second')
+
+ print('Start predicting')
+ test_predict = p.predict(test_features)
+ time_4 = time.time()
+ print('predicting cost ' + str(time_4 - time_3) +' second')
+
+ score = accuracy_score(test_labels, test_predict)
+ print("The accruacy socre is " + str(score))
From e766a490e1c2c66e94114c98da95fb2c783c98cc Mon Sep 17 00:00:00 2001
From: WenDesi <641614152@qq.com>
Date: Fri, 16 Dec 2016 21:57:26 +0800
Subject: [PATCH 2/6] add softmax readme
---
README.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/README.md b/README.md
index ef76bba..9495dd7 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@
## 简介
我这里不介绍任何机器学习算法的原理,只是将《统计学习方法》中每一章的算法用我自己的方式实现一遍。
+除了李航书上的算法外,还实现了一些其他机器学习的算法。
那么我们就按章节来了
@@ -56,3 +57,8 @@
### 第九章 EM算法及其推广
正在施工中...
+
+## 额外章节
+###softmax分类器
+博客:[python 实现 softmax分类器(MNIST数据集)](http://blog.csdn.net/wds2006sdo/article/details/53699778)
+
代码:[softmax/softmax.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/softmax/softmax.py)
From ebbf32c94b0218dc6b225daee6a9c44488e9f1e3 Mon Sep 17 00:00:00 2001
From: unknown <温德斯>
Date: Sun, 16 Jul 2017 22:55:57 +0800
Subject: [PATCH 3/6] add hmm
---
hmm/hmm.py | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 238 insertions(+)
create mode 100644 hmm/hmm.py
diff --git a/hmm/hmm.py b/hmm/hmm.py
new file mode 100644
index 0000000..2894f6a
--- /dev/null
+++ b/hmm/hmm.py
@@ -0,0 +1,238 @@
+# encoding=utf8
+
+import numpy as np
+import csv
+
+class HMM(object):
+ def __init__(self,N,M):
+ self.A = np.zeros((N,N)) # 状态转移概率矩阵
+ self.B = np.zeros((N,M)) # 观测概率矩阵
+ self.Pi = np.array([1.0/N]*N) # 初始状态概率矩阵
+
+ self.N = N # 可能的状态数
+ self.M = M # 可能的观测数
+
+ def cal_probality(self, O):
+ self.T = len(O)
+ self.O = O
+
+ self.forward()
+ return sum(self.alpha[self.T-1])
+
+ def forward(self):
+ """
+ 前向算法
+ """
+ self.alpha = np.zeros((self.T,self.N))
+
+ # 公式 10.15
+ for i in range(self.N):
+ self.alpha[0][i] = self.Pi[i]*self.B[i][self.O[0]]
+
+ # 公式10.16
+ for t in range(1,self.T):
+ for i in range(self.N):
+ sum = 0
+ for j in range(self.N):
+ sum += self.alpha[t-1][j]*self.A[j][i]
+ self.alpha[t][i] = sum * self.B[i][self.O[t]]
+
+ def backward(self):
+ """
+ 后向算法
+ """
+ self.beta = np.zeros((self.T,self.N))
+
+ # 公式10.19
+ for i in range(self.N):
+ self.beta[self.T-1][i] = 1
+
+ # 公式10.20
+ for t in range(self.T-2,-1,-1):
+ for i in range(self.N):
+ for j in range(self.N):
+ self.beta[t][i] += self.A[i][j]*self.B[j][self.O[t+1]]*self.beta[t+1][j]
+
+ def cal_gamma(self, i, t):
+ """
+ 公式 10.24
+ """
+ numerator = self.alpha[t][i]*self.beta[t][i]
+ denominator = 0
+
+ for j in range(self.N):
+ denominator += self.alpha[t][j]*self.beta[t][j]
+
+ return numerator/denominator
+
+ def cal_ksi(self, i, j, t):
+ """
+ 公式 10.26
+ """
+
+ numerator = self.alpha[t][i]*self.A[i][j]*self.B[j][self.O[t+1]]*self.beta[t+1][j]
+ denominator = 0
+
+ for i in range(self.N):
+ for j in range(self.N):
+ denominator += self.alpha[t][i]*self.A[i][j]*self.B[j][self.O[t+1]]*self.beta[t+1][j]
+
+ return numerator/denominator
+
+ def init(self):
+ """
+ 随机生成 A,B,Pi
+ 并保证每行相加等于 1
+ """
+ import random
+ for i in range(self.N):
+ randomlist = [random.randint(0,100) for t in range(self.N)]
+ Sum = sum(randomlist)
+ for j in range(self.N):
+ self.A[i][j] = randomlist[j]/Sum
+
+ for i in range(self.N):
+ randomlist = [random.randint(0,100) for t in range(self.M)]
+ Sum = sum(randomlist)
+ for j in range(self.M):
+ self.B[i][j] = randomlist[j]/Sum
+
+ def train(self, O, MaxSteps = 100):
+ self.T = len(O)
+ self.O = O
+
+ # 初始化
+ self.init()
+
+ step = 0
+ # 递推
+ while step
Date: Sun, 16 Jul 2017 23:12:36 +0800
Subject: [PATCH 4/6] add readme hmm
---
README.md | 7 +++++--
weibo.png | Bin 0 -> 16605 bytes
2 files changed, 5 insertions(+), 2 deletions(-)
create mode 100644 weibo.png
diff --git a/README.md b/README.md
index 9495dd7..ceebe06 100644
--- a/README.md
+++ b/README.md
@@ -55,10 +55,13 @@
纯Python代码:[AdaBoost/adaboost.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/adaboost.py)
Python C++代码:[AdaBoost/adaboost_cpp.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/adaboost_cpp.py),[AdaBoost/Sign/Sign/sign.h](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/Sign/Sign/sign.h),[AdaBoost/Sign/Sign/sign.cpp](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/Sign/Sign/sign.cpp)
-### 第九章 EM算法及其推广
-正在施工中...
+### 第十章 EM算法及其推广
+博客:[李航《统计学习方法》第十章——用Python实现隐马尔科夫模型](http://blog.csdn.net/wds2006sdo/article/details/75212599)
+
代码:[hmm/hmm.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/hmm/hmm.py)
+
## 额外章节
+
###softmax分类器
博客:[python 实现 softmax分类器(MNIST数据集)](http://blog.csdn.net/wds2006sdo/article/details/53699778)
代码:[softmax/softmax.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/softmax/softmax.py)
diff --git a/weibo.png b/weibo.png
new file mode 100644
index 0000000000000000000000000000000000000000..20b252cd340f441c164945fa90c0049c78496de5
GIT binary patch
literal 16605
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
OQ&H4Z`1;Z;?Ee7`Kg*f`
literal 0
HcmV?d00001
From 61b73cdde25fdfa585084a4801afb253c97a7106 Mon Sep 17 00:00:00 2001
From: wds2006sdo <641614152@qq.com>
Date: Sun, 16 Jul 2017 23:17:53 +0800
Subject: [PATCH 5/6] add photo
---
README.md | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index ceebe06..77373ed 100644
--- a/README.md
+++ b/README.md
@@ -9,10 +9,8 @@
# lihang_book_algorithm
-
-哇!看到有人star这个项目了
-本来打算把这个项目当成一个备份的
-但既然有人star了,那么就要好好对待啦!!!
+被李航老师肯定啦!!开心!
+
## 简介
我这里不介绍任何机器学习算法的原理,只是将《统计学习方法》中每一章的算法用我自己的方式实现一遍。
@@ -55,7 +53,7 @@
纯Python代码:[AdaBoost/adaboost.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/adaboost.py)
Python C++代码:[AdaBoost/adaboost_cpp.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/adaboost_cpp.py),[AdaBoost/Sign/Sign/sign.h](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/Sign/Sign/sign.h),[AdaBoost/Sign/Sign/sign.cpp](https://github.com/WenDesi/lihang_book_algorithm/blob/master/AdaBoost/Sign/Sign/sign.cpp)
-### 第十章 EM算法及其推广
+### 第十章 隐马尔科夫模型
博客:[李航《统计学习方法》第十章——用Python实现隐马尔科夫模型](http://blog.csdn.net/wds2006sdo/article/details/75212599)
代码:[hmm/hmm.py](https://github.com/WenDesi/lihang_book_algorithm/blob/master/hmm/hmm.py)
From 41ae6fa704cc231081dbe8528a297fe6d494a0f0 Mon Sep 17 00:00:00 2001
From: wds2006sdo <641614152@qq.com>
Date: Sun, 16 Jul 2017 23:18:43 +0800
Subject: [PATCH 6/6] change line
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 77373ed..22270ef 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
# lihang_book_algorithm
被李航老师肯定啦!!开心!
-
+

## 简介
我这里不介绍任何机器学习算法的原理,只是将《统计学习方法》中每一章的算法用我自己的方式实现一遍。