From eb2bd9b867c54baf907d028b95a6db672928111e Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 18:56:46 +0800 Subject: [PATCH 01/80] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20submission?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/.keep diff --git a/assignment-3/submission/.keep b/assignment-3/submission/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 9f1c7a58e8fb0a3a97f9183e52f8a75fc6e715ee Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 18:57:38 +0800 Subject: [PATCH 02/80] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2019210680053?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/19210680053/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/19210680053/.keep diff --git a/assignment-3/submission/19210680053/.keep b/assignment-3/submission/19210680053/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 28a0720eaf950402e97b63a6a49f7f4e4c2bec85 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 19:02:23 +0800 Subject: [PATCH 03/80] =?UTF-8?q?KMeans=E4=BB=A5=E5=8F=8A=E4=B8=80?= =?UTF-8?q?=E7=BB=B4=E4=BA=8C=E7=BB=B4=E6=95=B0=E6=8D=AEGMM=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/19210680053/source.py | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 assignment-3/submission/19210680053/source.py diff --git a/assignment-3/submission/19210680053/source.py b/assignment-3/submission/19210680053/source.py new file mode 100644 index 0000000..4155b56 --- /dev/null +++ b/assignment-3/submission/19210680053/source.py @@ -0,0 +1,157 @@ +import numpy as np +from scipy.stats import multivariate_normal + + +class KMeans(object): + def __init__(self, n_clusters): + self.cluNum = n_clusters + + def fit(self, train_data): + # first set the initial centers by random selection + self.train_data = train_data + numSamples, dim = self.train_data.shape + # step1: init the center + self.centroids = np.zeros((self.cluNum, dim)) + for i in range(self.cluNum): + index = int(np.random.uniform(0, numSamples)) + self.centroids[i, :] = self.train_data[index, :] + clusterAssment = np.mat(np.zeros((numSamples, 2))) + clusterChanged = True + + while clusterChanged: + clusterChanged = False + ## for each sample + for i in range(numSamples): + minDist = 100000.0 + minIndex = 0 + ## step 2: find the centroid who is closestfor each centroid + for j in range(self.cluNum): + distance = self.euclDistance(self.centroids[j, :], self.train_data[i, :]) + if distance < minDist: + minDist = distance + minIndex = j + + ## step 3: update its cluster + if clusterAssment[i, 0] != minIndex: + clusterChanged = True + clusterAssment[i, :] = minIndex, minDist ** 2 + ## step 4: update centroids + for j in range(self.cluNum): + pointsInCluster = np.array(self.train_data[np.nonzero(clusterAssment[:, 0].A == j)[0]]) + if len(pointsInCluster) != 0: + self.centroids[j, :] = np.mean(pointsInCluster, axis=0) + + + def predict(self, test_data): + self.test_data = test_data + numSamples, dim = self.test_data.shape + m_res = [] + for i in range(numSamples): + distance = [self.euclDistance(self.test_data[i, :], self.centroids[j, :]) for j in range(self.cluNum)] + clus_type = distance.index(min(distance)) + m_res.append(clus_type) + return np.array(m_res) + + def euclDistance(self, vector1, vector2): + return np.sqrt(sum(np.power(vector2 - vector1, 2))) + + +class GaussianMixture: + # covariance: ndarray + + def __init__(self, n_clusters, reg_cov: float = 1e-06): + self.cluNum = n_clusters + self.max_iter = 200 + self.reg_cov = reg_cov + self.alpha = (np.ones(n_clusters) / n_clusters) + self.sigma2 = (np.ones(n_clusters)) + + def fit(self, train_data): + sampleN, sample_fea = train_data.shape + if sample_fea == 1: + train_data = self.normalize(train_data) + print(train_data) + self.gamma = np.ones((train_data.shape[0], self.cluNum)) / self.cluNum + self.mu = (np.arange(self.cluNum) - self.cluNum // 2) * (train_data.max() - train_data.min()) / self.cluNum + sigma2_ = self.sigma2 + mu_ = self.mu + while True: + # gamma.shape(N, K) + self.gamma = (0.1 * self.gamma + 0.9 * self.phi(train_data, self.mu).T * self.alpha / ( + self.phi(train_data, self.mu).T * self.alpha).sum( + axis=1).reshape(train_data.shape[0], 1)) + # mu.shape(1, K) + self.mu = (0.1 * self.mu + 0.9 * np.matmul(train_data, self.gamma) / self.gamma.sum(axis=0)) + # sigma2.shape(1,K) + self.sigma2 = (0.1 * self.sigma2 + 0.9 * ( + self.gamma * (train_data.reshape(train_data.shape[0], 1) - self.mu) ** 2).sum( + axis=0) / self.gamma.sum(axis=0)) + # alpha.shape(1, K) + self.alpha = (0.1 * self.alpha + 0.9 * self.gamma.sum(axis=0) / train_data.shape[0]) + if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1: + break + mu_ = self.mu + sigma2_ = self.sigma2 + # # reg covariance depend on dimension of the features + elif sample_fea == 2: + self.reg_cov = self.reg_cov * np.identity(sample_fea) + self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) + # there should be n_clusters covariance and each one's size depend on feature + self.covariance = np.zeros((self.cluNum, sample_fea, sample_fea)) + for k in range(self.cluNum): + # make the variance equals to 1 as diagonal + np.fill_diagonal(self.covariance[k], 1) + self.weight = np.ones(self.cluNum) / self.cluNum + p_mat = np.zeros((sampleN, self.cluNum)) + for i in range(self.max_iter): + for j in range(self.cluNum): + self.covariance += self.reg_cov + g = multivariate_normal(mean=self.means[j], cov=self.covariance[j]) + p_mat[:, j] = self.weight[j] * g.pdf(train_data) + total_n = p_mat.sum(axis=1) + total_n[total_n == 0] = self.cluNum + p_mat /= total_n.reshape(-1, 1) + if sample_fea == 2: + for j in range(self.cluNum): + N_k = np.sum(p_mat[:, j], axis=0) + self.means[j] = (1 / N_k) * np.sum(train_data * p_mat[:, j].reshape(-1, 1), axis=0) + + self.covariance[j] = (1 / N_k) * np.dot( + (p_mat[:, j].reshape(-1, 1) * (train_data - self.means[j])).T, + (train_data - self.means[j])) + self.reg_cov + self.weight[j] = N_k / sampleN + else: + print("one and two dimension data is accepted") + + def predict(self, test_data): + sampleN, sample_fea = test_data.shape + if sample_fea == 1: + test_data = self.normalize(test_data) + gamma = (self.phi(test_data, self.mu).T * self.alpha / (self.phi(test_data, self.mu).T * self.alpha).sum( + axis=1).reshape(test_data.shape[0], 1)) + return gamma.argmax(axis=1) + elif sample_fea == 2: + p_mat = np.zeros((test_data.shape[0], self.cluNum)) + for j in range(self.cluNum): + # self.covariance += self.reg_cov + g = multivariate_normal(mean=self.means[j], cov=self.covariance[j]) + p_mat[:, j] = self.weight[j] * g.pdf(test_data) + + total_n = p_mat.sum(axis=1) + total_n[total_n == 0] = self.cluNum + p_mat /= total_n.reshape(-1, 1) + return np.argmax(p_mat, axis=1) + else: + print("one and two dimension data is accepted") + + def normalize(self, data): + flat_data = data.flatten() + nor_data = (flat_data - flat_data.mean()) / np.sqrt(flat_data.var()) + return nor_data + + def phi(self, data, mu): + # phi.shape(K, N) + mu = (np.arange(self.cluNum) - self.cluNum // 2) * (data.max() - data.min()) / self.K + phi = (1 / np.sqrt(2 * np.pi * self.sigma2.reshape(self.cluNum, 1)) * np.exp( + - (data - mu.reshape(self.cluNum, 1)) ** 2 / (2 * self.sigma2.reshape(self.cluNum, 1)))) + return phi -- Gitee From 0d8b4a41945eaee4951ee4d40325dcaaad7706d3 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:24:27 +0800 Subject: [PATCH 04/80] add assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 assignment-3/submission/19210680053/README.md diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md new file mode 100644 index 0000000..2d21e48 --- /dev/null +++ b/assignment-3/submission/19210680053/README.md @@ -0,0 +1,12 @@ +# Assignment 3 + +## 1.KMeans 模型结构 +本次实验首先对KMeans模型进行实现 +### 类中心点的初始化 +在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 +初始化数据中心 +$$ +{C_1,C_2,...,C_cluNum} +$$ +### 数据到中心的距离以及分类 + -- Gitee From 48cb43f71555346268ade0827d82d9dd888d933e Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:27:31 +0800 Subject: [PATCH 05/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 2d21e48..d012866 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -6,7 +6,7 @@ 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 初始化数据中心 $$ -{C_1,C_2,...,C_cluNum} +{{C_1,C_2,...,C_(cluNum)}} $$ ### 数据到中心的距离以及分类 -- Gitee From 2dc595b4d2a7d4b37241bf6d508732a4b0bd8cce Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:27:59 +0800 Subject: [PATCH 06/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index d012866..41af81b 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -6,7 +6,7 @@ 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 初始化数据中心 $$ -{{C_1,C_2,...,C_(cluNum)}} +{C_1,C_2,...,C_(cluNum)} $$ ### 数据到中心的距离以及分类 -- Gitee From a849bc5586cebb354b3e4e996f034d80decaaed5 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:28:48 +0800 Subject: [PATCH 07/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 41af81b..a63ef4f 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -6,7 +6,7 @@ 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 初始化数据中心 $$ -{C_1,C_2,...,C_(cluNum)} +{{C_1,C_2,...,C_{cluNum}}} $$ ### 数据到中心的距离以及分类 -- Gitee From cd60eea23e55fce3a673f190e076a7b86ec0fdcc Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:30:19 +0800 Subject: [PATCH 08/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a63ef4f..c3dc872 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -6,7 +6,7 @@ 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 初始化数据中心 $$ -{{C_1,C_2,...,C_{cluNum}}} +{{{C_1,C_2,...,C_{cluNum}}}} $$ ### 数据到中心的距离以及分类 -- Gitee From df104ce56c77331b36ec71d3005ab8bc3e9b5545 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:31:18 +0800 Subject: [PATCH 09/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index c3dc872..081f81a 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -4,9 +4,11 @@ 本次实验首先对KMeans模型进行实现 ### 类中心点的初始化 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 + + 初始化数据中心 $$ -{{{C_1,C_2,...,C_{cluNum}}}} +\begin{{{C_1,C_2,...,C_{cluNum}}}}\end $$ ### 数据到中心的距离以及分类 -- Gitee From 214d181d6b8c1167b3f3bb8a0615d9d62862b870 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:32:24 +0800 Subject: [PATCH 10/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 081f81a..0e2a57f 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -8,7 +8,7 @@ 初始化数据中心 $$ -\begin{{{C_1,C_2,...,C_{cluNum}}}}\end +{{{C_1,C_2,...,C_{cluNum}}}} $$ ### 数据到中心的距离以及分类 -- Gitee From e831f8b701dd55b373824118f91fe61d1d80525d Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:36:51 +0800 Subject: [PATCH 11/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 0e2a57f..e4f4499 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -5,10 +5,12 @@ ### 类中心点的初始化 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 - -初始化数据中心 +得到如下初始化数据中心 $$ {{{C_1,C_2,...,C_{cluNum}}}} $$ ### 数据到中心的距离以及分类 +接着计算训练集中每个对象到各个中心的欧式距离, +$$ +euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})**2}} -- Gitee From 3c50a18ca62cb13003d0a2d262dbc9ed42be7741 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:37:07 +0800 Subject: [PATCH 12/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index e4f4499..b98f490 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -13,4 +13,4 @@ $$ 接着计算训练集中每个对象到各个中心的欧式距离, $$ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})**2}} - +$$ -- Gitee From 7cdf59554a24876e12aedc298e587cf6fbe2bab6 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:40:08 +0800 Subject: [PATCH 13/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index b98f490..3a5adce 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -6,11 +6,11 @@ 在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 得到如下初始化数据中心 -$$ -{{{C_1,C_2,...,C_{cluNum}}}} +$$\begin{Bmatrix} +{{{C_1,C_2,...,C_{cluNum}}}}\end{Bmatrix} $$ ### 数据到中心的距离以及分类 接着计算训练集中每个对象到各个中心的欧式距离, $$ -euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})**2}} +euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ -- Gitee From ddf8f9b12992a1b57ee5819425155495f7faa96c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 21:52:15 +0800 Subject: [PATCH 14/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 3a5adce..725e930 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -3,7 +3,7 @@ ## 1.KMeans 模型结构 本次实验首先对KMeans模型进行实现 ### 类中心点的初始化 -在给定类簇数目(cluNum)以及数据维度(dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 +在给定类簇数目(cluNum)以及数据维度(N*dim)之后,首先随机从数据集中选取cluNum行数据,作为若干个类的中心点 得到如下初始化数据中心 $$\begin{Bmatrix} @@ -14,3 +14,6 @@ $$ $$ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ +对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 +### 中心点更新 +根据clusterAssment的第一列数据,分别得到距离每个C_k,1= Date: Sun, 13 Jun 2021 21:52:37 +0800 Subject: [PATCH 15/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 725e930..6e27273 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,4 +16,4 @@ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个C_k,1= Date: Sun, 13 Jun 2021 21:53:34 +0800 Subject: [PATCH 16/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 6e27273..258464f 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,4 +16,4 @@ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个$$C_k,1= Date: Sun, 13 Jun 2021 21:54:15 +0800 Subject: [PATCH 17/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 258464f..f207f22 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,4 +16,4 @@ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个{C_k},{1= Date: Sun, 13 Jun 2021 21:54:44 +0800 Subject: [PATCH 18/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index f207f22..d45b7b7 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,4 +16,4 @@ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个${C_k},{1= Date: Sun, 13 Jun 2021 22:01:42 +0800 Subject: [PATCH 19/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index d45b7b7..40e3f6c 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,4 +16,6 @@ euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1= Date: Sun, 13 Jun 2021 22:03:05 +0800 Subject: [PATCH 20/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 40e3f6c..b460c8e 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -18,4 +18,9 @@ $$ ### 中心点更新 根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1= Date: Sun, 13 Jun 2021 22:05:24 +0800 Subject: [PATCH 21/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index b460c8e..3c59bc6 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -23,4 +23,8 @@ $$ if clusterAssment[i, 0] != minIndex: clusterChanged = True clusterAssment[i, :] = minIndex, minDist ** 2 -``` \ No newline at end of file +``` +此时输出cluNum个中心点作为模型训练结果 +$$\begin{Bmatrix} +C_1,C_2,C_3,...C_{cluNum}\end{Bmatrix} +$$ \ No newline at end of file -- Gitee From 5f7516740c9efb057649869373d79ed97c9d84f7 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 22:06:36 +0800 Subject: [PATCH 22/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 3c59bc6..81d5a5f 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -12,7 +12,7 @@ $$ ### 数据到中心的距离以及分类 接着计算训练集中每个对象到各个中心的欧式距离, $$ -euclDistance={\sqrt {\sum_{n=1}^{dim} (X_{it}-C_{it})^2}} +euclDistance_i={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -- Gitee From 3653891a15ea25da9f1ef103036761aa83f1f13c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Sun, 13 Jun 2021 22:07:01 +0800 Subject: [PATCH 23/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 81d5a5f..2e7d3c9 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -12,7 +12,7 @@ $$ ### 数据到中心的距离以及分类 接着计算训练集中每个对象到各个中心的欧式距离, $$ -euclDistance_i={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} +euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -- Gitee From d341f7e75fb3b0c2bbbddbfa2ca4cae653bdda0a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 08:55:42 +0800 Subject: [PATCH 24/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 2e7d3c9..46b72ac 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,9 +16,9 @@ euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1= Date: Mon, 14 Jun 2021 08:56:25 +0800 Subject: [PATCH 25/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 46b72ac..6b12e3b 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,7 +16,7 @@ euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1\geqk\leqcluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ +根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1$\geqk\$leqcluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ ### 循环停止条件 设置clusterchanged作为循环标志,即对于所有点的clusterAssment中距离最近中心点$C_k$的下标k不再发生改变,则循环结束 ```python @@ -29,7 +29,7 @@ $$\begin{Bmatrix} C_1,C_2,C_3,...C_{cluNum}\end{Bmatrix} $$ ### 模型预测 -'''python +```python def predict(self, test_data): self.test_data = test_data numSamples, dim = self.test_data.shape @@ -39,6 +39,6 @@ $$ clus_type = distance.index(min(distance)) m_res.append(clus_type) return np.array(m_res) -''' +``` 通过计算测试集每个对象距离所有中心点的欧式距离,每个点会被归类到距其最近的中心点所属类中 . -- Gitee From ae36d9b808046158e50f3ecaa2967b608b32a927 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 08:57:01 +0800 Subject: [PATCH 26/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 6b12e3b..b46e21a 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,7 +16,7 @@ euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1$\geqk\$leqcluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ +根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1\geq k\leq cluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ ### 循环停止条件 设置clusterchanged作为循环标志,即对于所有点的clusterAssment中距离最近中心点$C_k$的下标k不再发生改变,则循环结束 ```python -- Gitee From 75dac6190348e2160814d35c8fd578e55d84c347 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 08:57:18 +0800 Subject: [PATCH 27/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index b46e21a..bf8fb85 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -16,7 +16,7 @@ euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ 对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 -根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1\geq k\leq cluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ +根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1\leq k\leq cluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ ### 循环停止条件 设置clusterchanged作为循环标志,即对于所有点的clusterAssment中距离最近中心点$C_k$的下标k不再发生改变,则循环结束 ```python -- Gitee From 466e28b5f390c215df449ea2bc90d7a38ac58f5e Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:17:42 +0800 Subject: [PATCH 28/80] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/19210680053/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/19210680053/img/.keep diff --git a/assignment-3/submission/19210680053/img/.keep b/assignment-3/submission/19210680053/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From a1a3f5ec6b9f8cb2a5d2cbd2f0663f6b8e5effe5 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:21:03 +0800 Subject: [PATCH 29/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index bf8fb85..61540b0 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -40,5 +40,14 @@ $$ m_res.append(clus_type) return np.array(m_res) ``` -通过计算测试集每个对象距离所有中心点的欧式距离,每个点会被归类到距其最近的中心点所属类中 -. +通过计算测试集每个对象距离所有中心点的欧式距离,每个点会被归类到距其最近的中心点所属类中。 + +## 2.GaussianMixture 模型结构 +本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 +###1维数据 +###2维数据 +####进行每个聚类的均值以及协方差矩阵初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$\begin{Mmatrix}Minimum value/2,Maximum value/2\end{Mmatrix}$之间生成随机数 +```python +self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) + +``` \ No newline at end of file -- Gitee From 4067bf98659580f7feb5bfbb0a7480ba6cccbb5a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:21:45 +0800 Subject: [PATCH 30/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 61540b0..a1cd457 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -46,7 +46,7 @@ $$ 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 ###1维数据 ###2维数据 -####进行每个聚类的均值以及协方差矩阵初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$\begin{Mmatrix}Minimum value/2,Maximum value/2\end{Mmatrix}$之间生成随机数 +####进行每个聚类的均值以及协方差矩阵初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[Minimum value/2,Maximum value/2]$之间生成随机数 ```python self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) -- Gitee From fbe913a90b26ebb52c612e5d8a032657cb5ced06 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:22:23 +0800 Subject: [PATCH 31/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a1cd457..6589846 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -46,7 +46,7 @@ $$ 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 ###1维数据 ###2维数据 -####进行每个聚类的均值以及协方差矩阵初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[Minimum value/2,Maximum value/2]$之间生成随机数 +####进行每个聚类的均值以及协方差矩阵初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 ```python self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) -- Gitee From f32b761bb9569551cf73ca771bd3ffbb332e09ac Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:29:16 +0800 Subject: [PATCH 32/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 6589846..d68d610 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -46,8 +46,17 @@ $$ 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 ###1维数据 ###2维数据 -####进行每个聚类的均值以及协方差矩阵初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 +####进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 ```python self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) -``` \ No newline at end of file +``` +每个协方差矩阵令其矩阵对角线取值为1,非对角线取值为0 +每个聚类具有等权重 +```python + self.weight = np.ones(self.cluNum) / self.cluNum +``` +#### E step +$$ +\gamma_k^(i)= \pi_kN(x^(i)|\Miu_k,\Sum_k)/\Sum_{k=1}^ +$$ \ No newline at end of file -- Gitee From e39c271669fe27a31ce0c07355cec2ffa4140c86 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:29:39 +0800 Subject: [PATCH 33/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index d68d610..7737cb0 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,5 +58,5 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step $$ -\gamma_k^(i)= \pi_kN(x^(i)|\Miu_k,\Sum_k)/\Sum_{k=1}^ +\Gamma_k^i= \pi_kN(x^(i)|\Miu_k,\Sum_k)/\Sum_{k=1}^ $$ \ No newline at end of file -- Gitee From 92cd5be5a8db203b29150ea922b73f631f76ae49 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:30:13 +0800 Subject: [PATCH 34/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 7737cb0..c4ecfa9 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,5 +58,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step $$ -\Gamma_k^i= \pi_kN(x^(i)|\Miu_k,\Sum_k)/\Sum_{k=1}^ +\Gamma_k^{i}= \pi_kN(x^(i)|\Miu_k,\Sum_k)/\Sum_{k=1}^ + $$ \ No newline at end of file -- Gitee From cc03857d1ab48cb15c870e24f87be4c7997655d3 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:30:27 +0800 Subject: [PATCH 35/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index c4ecfa9..77a0c2d 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,6 +58,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step $$ -\Gamma_k^{i}= \pi_kN(x^(i)|\Miu_k,\Sum_k)/\Sum_{k=1}^ +\Gamma_k^{i} $$ \ No newline at end of file -- Gitee From fcb70890914928a68b7fb4f0e98307c47c0f702c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:30:52 +0800 Subject: [PATCH 36/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 77a0c2d..fa34f58 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,6 +58,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step $$ -\Gamma_k^{i} +\Gamma_k $$ \ No newline at end of file -- Gitee From e4c329772749562a9aef253f77809aa8dbf675e2 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:31:10 +0800 Subject: [PATCH 37/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index fa34f58..6d69a75 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,6 +58,7 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step $$ -\Gamma_k + +\Gamma_{k} $$ \ No newline at end of file -- Gitee From 20e92e11518b0e070462683c3ee6669c29f25091 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:31:50 +0800 Subject: [PATCH 38/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 6d69a75..184cd25 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -59,6 +59,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= #### E step $$ -\Gamma_{k} +\gamma_{k}= \pi_kN(x^(i)|\miu_k,\sum_k)/\Sum_{k=1}^ $$ \ No newline at end of file -- Gitee From e107aff4ed0c90864bb5af45bf6b5efcebca8c1a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:32:15 +0800 Subject: [PATCH 39/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 184cd25..a5eee75 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -59,6 +59,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= #### E step $$ -\gamma_{k}= \pi_kN(x^(i)|\miu_k,\sum_k)/\Sum_{k=1}^ +\gamma_k $$ \ No newline at end of file -- Gitee From 976cb340d6091a473ba9fab5d0e02675e26b0e02 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:33:47 +0800 Subject: [PATCH 40/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a5eee75..b98099c 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -59,6 +59,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= #### E step $$ -\gamma_k +$$\gamma_{Relu}(t) = \text{ReLU}(t + 0.5) - \text{ReLU}(t - 0.5).$$ $$ \ No newline at end of file -- Gitee From 9038fe6bf0cfa1c53d90fb0d515a621fed2d8ee3 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:36:30 +0800 Subject: [PATCH 41/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index b98099c..c0f9758 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -59,6 +59,6 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= #### E step $$ -$$\gamma_{Relu}(t) = \text{ReLU}(t + 0.5) - \text{ReLU}(t - 0.5).$$ +$$\gamma_{k}^(i) = \pi_{k}N(x^(i),\sum_{k})/\sum_{k=1}^{K}N(x^{(i)}|\miu_{k},\sum_k}- \text{ReLU}(t - 0.5).$$ $$ \ No newline at end of file -- Gitee From 6438c2b3119dd84ccb3cb6d672e9a527cd12d739 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:37:43 +0800 Subject: [PATCH 42/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index c0f9758..3fc199c 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -57,8 +57,5 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= self.weight = np.ones(self.cluNum) / self.cluNum ``` #### E step -$$ - -$$\gamma_{k}^(i) = \pi_{k}N(x^(i),\sum_{k})/\sum_{k=1}^{K}N(x^{(i)}|\miu_{k},\sum_k}- \text{ReLU}(t - 0.5).$$ -$$ \ No newline at end of file +$$\gamma_{k}^(i) = $$ -- Gitee From 79252ba467d90fd83e9e1bc979ddc62cb37589ea Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:38:13 +0800 Subject: [PATCH 43/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 3fc199c..41db74c 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,4 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^(i) = $$ +$$\gamma_{k}^{(i)} = $$\pi_{k}N(x^(i),\sum_{k})$$ -- Gitee From 5701d70982501194653f63e1e1126b55694122fd Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:38:39 +0800 Subject: [PATCH 44/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 41db74c..4ecf08f 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,4 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^{(i)} = $$\pi_{k}N(x^(i),\sum_{k})$$ +$$\gamma_{k}^{(i)} = \pi_{k}N(x^(i),\sum_{k})$$ -- Gitee From ebc12701b4b3ac8b25421d87415ad9ce27524e6a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:39:52 +0800 Subject: [PATCH 45/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 4ecf08f..d45594d 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,4 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^{(i)} = \pi_{k}N(x^(i),\sum_{k})$$ +$$\gamma_{k}^{(i)} = \pi_{k}N(x^{(i)}|\mu_{k},\sum_{k})$$ -- Gitee From 2a001f88d5eb088df8f4ea36df0089e86927ef75 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:40:29 +0800 Subject: [PATCH 46/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index d45594d..771543a 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,4 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^{(i)} = \pi_{k}N(x^{(i)}|\mu_{k},\sum_{k})$$ +$$\gamma_{k}^{(i)} = \pi_{k}N(x^{(i)}|\mu_{k},\sum{k})$$ -- Gitee From 71cd8dda2b3fe4f0f610bdaf84c4576793cf8b4d Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:42:43 +0800 Subject: [PATCH 47/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 771543a..a2850f0 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,4 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^{(i)} = \pi_{k}N(x^{(i)}|\mu_{k},\sum{k})$$ +$$\gamma_{k}^{(i)} = \pi_{k}N(x^{(i)}|\mu_{k},\Sigma{k})/\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma{k})$$ -- Gitee From 17b5ed43158f00541fdf01fda689e92827914b9c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:44:05 +0800 Subject: [PATCH 48/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a2850f0..f652b99 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,4 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^{(i)} = \pi_{k}N(x^{(i)}|\mu_{k},\Sigma{k})/\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma{k})$$ +$$\gamma_{k}^{(i)} = \frac{\pi_{k}N(x^{(i)}|\mu_{k},\Sigma{k})}{\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma{k})}$$ -- Gitee From a98d66dc875c610d6995cafc02cb1dc034bc171a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 09:59:33 +0800 Subject: [PATCH 49/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index f652b99..10dfe26 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -58,4 +58,12 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= ``` #### E step -$$\gamma_{k}^{(i)} = \frac{\pi_{k}N(x^{(i)}|\mu_{k},\Sigma{k})}{\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma{k})}$$ +$$\gamma_{k}^{(i)} = \frac{\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})}{\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma_{k})}$$ +$N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$pi_{k}$每个cluster对应weight,通过上式计算得到第i个数据样本点落在第k个聚类中的概率 +#### M step +通过计算cluster k 中的样本数来进行权重更新$\pi_{k}$ +$$\N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ +$$\pi_{k}=\frac{N_{k}}{N} +并对每个cluster的均值以及协方差matrix进行更新 +$$\mu_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^(i)x^{(i)}}{N_{k}}$$ +$$\Sigma_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^(i)(x^{(i)}-\mu_{k})(x^{(i)}-\mu_{k})^{T}}{N_{k}}$$ \ No newline at end of file -- Gitee From 27a9b7e88066f363da6021bb8d3de9456172ff97 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:00:43 +0800 Subject: [PATCH 50/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 10dfe26..4b965b1 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -63,7 +63,7 @@ $N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$ #### M step 通过计算cluster k 中的样本数来进行权重更新$\pi_{k}$ $$\N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ -$$\pi_{k}=\frac{N_{k}}{N} +$$\pi_{k}=\frac{N_{k}}{N}$$ 并对每个cluster的均值以及协方差matrix进行更新 $$\mu_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^(i)x^{(i)}}{N_{k}}$$ $$\Sigma_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^(i)(x^{(i)}-\mu_{k})(x^{(i)}-\mu_{k})^{T}}{N_{k}}$$ \ No newline at end of file -- Gitee From 1e8debc773db75788c677bc827d088ba62e1e707 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:02:55 +0800 Subject: [PATCH 51/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 4b965b1..5ccd9c9 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -63,7 +63,17 @@ $N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$ #### M step 通过计算cluster k 中的样本数来进行权重更新$\pi_{k}$ $$\N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ -$$\pi_{k}=\frac{N_{k}}{N}$$ +$$Weight_{k}=\frac{N_{k}}{N}$$ 并对每个cluster的均值以及协方差matrix进行更新 -$$\mu_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^(i)x^{(i)}}{N_{k}}$$ -$$\Sigma_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^(i)(x^{(i)}-\mu_{k})(x^{(i)}-\mu_{k})^{T}}{N_{k}}$$ \ No newline at end of file +$$\mu_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^{(i)}x^{(i)}}{N_{k}}$$ +$$\Sigma_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^{(i)}(x^{(i)}-\mu_{k})(x^{(i)}-\mu_{k})^{T}}{N_{k}}$$ + +```python +N_k = np.sum(p_mat[:, j], axis=0) +self.weight[j] = N_k / sampleN +self.means[j] = (1 / N_k) * np.sum(train_data * p_mat[:, j].reshape(-1, 1), axis=0) + +self.covariance[j] = (1 / N_k) * np.dot( + (p_mat[:, j].reshape(-1, 1) * (train_data - self.means[j])).T, + (train_data - self.means[j])) + self.reg_cov +``` \ No newline at end of file -- Gitee From ac5209a22f49bc1e43829725b02627eb4962d503 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:39:42 +0800 Subject: [PATCH 52/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 5ccd9c9..541e58e 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -45,6 +45,34 @@ $$ ## 2.GaussianMixture 模型结构 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 ###1维数据 +####数据正则化 +对于一维数据,首先进行数据正则化处理,以及形式上转化为一维数据 +```python + def normalize(self, data): + flat_data = data.flatten() + nor_data = (flat_data - flat_data.mean()) / np.sqrt(flat_data.var()) + return nor_data +``` +####进行数据的每个聚类均值、方差(而非协方差矩阵)以及对应权重初始化 +对于一维数据均值初始化,采用方式是:生成关于0对称array * 训练集中均值 +```python +self.mu = (np.arange(self.cluNum) - self.cluNum // 2) * (train_data.max() - train_data.min()) / self.cluNum +``` +对于方差初始化,cluNum个聚类全部取值为1; +对于权重,赋予每个聚类等权重 +#### E step and M step +E step与M step同2D数据思想相同 +但在M step中进行每个cluster均值与方差更新时,会赋予旧均值、旧方差0.1的权重;新均值方差0.9的权重,进行迭代更新 +####迭代停止条件 +模型通过设置阈值,使得$\begin{Bmatrix}\Sigma_{k},\pi_{k},\mu_{k}\end{Bmatrix}$均收敛来作为停止条件 +```python + if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1e-3: + break +``` +####模型预测 +$$ +由train_data得到每个聚类的均值、方差以及对应权重,同样进行$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}{\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ +数据会被归至该类。 ###2维数据 ####进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 ```python @@ -62,8 +90,8 @@ $$\gamma_{k}^{(i)} = \frac{\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})}{\sum_{k=1}^{K}N $N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$pi_{k}$每个cluster对应weight,通过上式计算得到第i个数据样本点落在第k个聚类中的概率 #### M step 通过计算cluster k 中的样本数来进行权重更新$\pi_{k}$ -$$\N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ -$$Weight_{k}=\frac{N_{k}}{N}$$ +$$N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ +$$\pi_{k}=\frac{N_{k}}{N}$$ 并对每个cluster的均值以及协方差matrix进行更新 $$\mu_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^{(i)}x^{(i)}}{N_{k}}$$ $$\Sigma_{k}=\frac{\sum_{i=1}^{cluNum}\gamma_{k}^{(i)}(x^{(i)}-\mu_{k})(x^{(i)}-\mu_{k})^{T}}{N_{k}}$$ @@ -76,4 +104,10 @@ self.means[j] = (1 / N_k) * np.sum(train_data * p_mat[:, j].reshape(-1, 1), axis self.covariance[j] = (1 / N_k) * np.dot( (p_mat[:, j].reshape(-1, 1) * (train_data - self.means[j])).T, (train_data - self.means[j])) + self.reg_cov -``` \ No newline at end of file +``` +####迭代条件 +模型可通过使得$\begin{Bmatrix}\Sigma_{k},\pi_{k},\mu_{k}\end{Bmatrix}$均收敛来作为停止条件,此处进行最大训练次数来作为模型训练的终止条件。 +####模型预测 +由train_data得到每个聚类的均值、协方差矩阵以及对应权重 +$prob_{k,i}=\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})$ +对于训练集中数据点i,寻求在所有中心点中令上式最大化的中心点k,数据会被归至该类。 \ No newline at end of file -- Gitee From 69fe7ef0a3a4ec2722bb9a0911710c9af3d584f7 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:40:39 +0800 Subject: [PATCH 53/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 541e58e..4d19b17 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -44,8 +44,8 @@ $$ ## 2.GaussianMixture 模型结构 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 -###1维数据 -####数据正则化 +### 1维数据 +#### 数据正则化 对于一维数据,首先进行数据正则化处理,以及形式上转化为一维数据 ```python def normalize(self, data): @@ -53,7 +53,7 @@ $$ nor_data = (flat_data - flat_data.mean()) / np.sqrt(flat_data.var()) return nor_data ``` -####进行数据的每个聚类均值、方差(而非协方差矩阵)以及对应权重初始化 +#### 进行数据的每个聚类均值、方差(而非协方差矩阵)以及对应权重初始化 对于一维数据均值初始化,采用方式是:生成关于0对称array * 训练集中均值 ```python self.mu = (np.arange(self.cluNum) - self.cluNum // 2) * (train_data.max() - train_data.min()) / self.cluNum @@ -63,13 +63,13 @@ self.mu = (np.arange(self.cluNum) - self.cluNum // 2) * (train_data.max() - trai #### E step and M step E step与M step同2D数据思想相同 但在M step中进行每个cluster均值与方差更新时,会赋予旧均值、旧方差0.1的权重;新均值方差0.9的权重,进行迭代更新 -####迭代停止条件 +#### 迭代停止条件 模型通过设置阈值,使得$\begin{Bmatrix}\Sigma_{k},\pi_{k},\mu_{k}\end{Bmatrix}$均收敛来作为停止条件 ```python if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1e-3: break ``` -####模型预测 +#### 模型预测 $$ 由train_data得到每个聚类的均值、方差以及对应权重,同样进行$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}{\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ 数据会被归至该类。 @@ -105,9 +105,9 @@ self.covariance[j] = (1 / N_k) * np.dot( (p_mat[:, j].reshape(-1, 1) * (train_data - self.means[j])).T, (train_data - self.means[j])) + self.reg_cov ``` -####迭代条件 +#### 迭代条件 模型可通过使得$\begin{Bmatrix}\Sigma_{k},\pi_{k},\mu_{k}\end{Bmatrix}$均收敛来作为停止条件,此处进行最大训练次数来作为模型训练的终止条件。 -####模型预测 +#### 模型预测 由train_data得到每个聚类的均值、协方差矩阵以及对应权重 $prob_{k,i}=\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})$ 对于训练集中数据点i,寻求在所有中心点中令上式最大化的中心点k,数据会被归至该类。 \ No newline at end of file -- Gitee From f02dcfa48b2229deeaf5a467bdfb73a4d0c9f4b3 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:41:25 +0800 Subject: [PATCH 54/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 4d19b17..51d27ec 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -70,8 +70,9 @@ E step与M step同2D数据思想相同 break ``` #### 模型预测 -$$ -由train_data得到每个聚类的均值、方差以及对应权重,同样进行$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}{\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ + +由train_data得到每个聚类的均值、方差以及对应权重,同样进行$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k} +{\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ 数据会被归至该类。 ###2维数据 ####进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 -- Gitee From cf92556def9358db3b20e8da2aac5c18d814fdf7 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:42:45 +0800 Subject: [PATCH 55/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 51d27ec..3417591 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -71,11 +71,12 @@ E step与M step同2D数据思想相同 ``` #### 模型预测 -由train_data得到每个聚类的均值、方差以及对应权重,同样进行$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k} +由train_data得到每个聚类的均值、方差以及对应权重,同样进行 +$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}} {\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ 数据会被归至该类。 -###2维数据 -####进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 +### 2维数据 +#### 进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 ```python self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) -- Gitee From 9adbf8f3f5c1494382cc28ea3ad3f005a9d94d77 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:43:35 +0800 Subject: [PATCH 56/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 3417591..aeb4210 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -72,7 +72,7 @@ E step与M step同2D数据思想相同 #### 模型预测 由train_data得到每个聚类的均值、方差以及对应权重,同样进行 -$frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}} +$\frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}} {\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ 数据会被归至该类。 ### 2维数据 -- Gitee From eacf990fc944127658648039b1d078353918fe1c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:45:00 +0800 Subject: [PATCH 57/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index aeb4210..e891314 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -44,37 +44,6 @@ $$ ## 2.GaussianMixture 模型结构 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 -### 1维数据 -#### 数据正则化 -对于一维数据,首先进行数据正则化处理,以及形式上转化为一维数据 -```python - def normalize(self, data): - flat_data = data.flatten() - nor_data = (flat_data - flat_data.mean()) / np.sqrt(flat_data.var()) - return nor_data -``` -#### 进行数据的每个聚类均值、方差(而非协方差矩阵)以及对应权重初始化 -对于一维数据均值初始化,采用方式是:生成关于0对称array * 训练集中均值 -```python -self.mu = (np.arange(self.cluNum) - self.cluNum // 2) * (train_data.max() - train_data.min()) / self.cluNum -``` -对于方差初始化,cluNum个聚类全部取值为1; -对于权重,赋予每个聚类等权重 -#### E step and M step -E step与M step同2D数据思想相同 -但在M step中进行每个cluster均值与方差更新时,会赋予旧均值、旧方差0.1的权重;新均值方差0.9的权重,进行迭代更新 -#### 迭代停止条件 -模型通过设置阈值,使得$\begin{Bmatrix}\Sigma_{k},\pi_{k},\mu_{k}\end{Bmatrix}$均收敛来作为停止条件 -```python - if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1e-3: - break -``` -#### 模型预测 - -由train_data得到每个聚类的均值、方差以及对应权重,同样进行 -$\frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}} -{\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ -数据会被归至该类。 ### 2维数据 #### 进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 ```python @@ -112,4 +81,35 @@ self.covariance[j] = (1 / N_k) * np.dot( #### 模型预测 由train_data得到每个聚类的均值、协方差矩阵以及对应权重 $prob_{k,i}=\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})$ -对于训练集中数据点i,寻求在所有中心点中令上式最大化的中心点k,数据会被归至该类。 \ No newline at end of file +对于训练集中数据点i,寻求在所有中心点中令上式最大化的中心点k,数据会被归至该类。 +### 1维数据 +#### 数据正则化 +对于一维数据,首先进行数据正则化处理,以及形式上转化为一维数据 +```python + def normalize(self, data): + flat_data = data.flatten() + nor_data = (flat_data - flat_data.mean()) / np.sqrt(flat_data.var()) + return nor_data +``` +#### 进行数据的每个聚类均值、方差(而非协方差矩阵)以及对应权重初始化 +对于一维数据均值初始化,采用方式是:生成关于0对称array * 训练集中均值 +```python +self.mu = (np.arange(self.cluNum) - self.cluNum // 2) * (train_data.max() - train_data.min()) / self.cluNum +``` +对于方差初始化,cluNum个聚类全部取值为1; +对于权重,赋予每个聚类等权重 +#### E step and M step +E step与M step同2D数据思想相同 +但在M step中进行每个cluster均值与方差更新时,会赋予旧均值、旧方差0.1的权重;新均值方差0.9的权重,进行迭代更新 +#### 迭代停止条件 +模型通过设置阈值,使得$\begin{Bmatrix}\Sigma_{k},\pi_{k},\mu_{k}\end{Bmatrix}$均收敛来作为停止条件 +```python + if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1e-3: + break +``` +#### 模型预测 + +由train_data得到每个聚类的均值、方差以及对应权重,同样进行 +$argmax\frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}} +{\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ +的计算,此时数据点i会被归至第k类 -- Gitee From de1d34616dbf9c489b903595293b9f91cc1872f1 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:46:34 +0800 Subject: [PATCH 58/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index e891314..706db2a 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -45,7 +45,8 @@ $$ ## 2.GaussianMixture 模型结构 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 ### 2维数据 -#### 进行每个聚类的均值、协方差矩阵以及对应权重初始化,由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum value)/2,(Maximum value)/2]$之间生成随机数 +#### 进行每个聚类的均值、协方差矩阵以及对应权重初始化 +由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum\quadvalue)/2,(Maximum\quadvalue)/2]$之间生成随机数 ```python self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) @@ -58,7 +59,7 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= #### E step $$\gamma_{k}^{(i)} = \frac{\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})}{\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma_{k})}$$ -$N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$pi_{k}$每个cluster对应weight,通过上式计算得到第i个数据样本点落在第k个聚类中的概率 +$N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$/pi_{k}$每个cluster对应weight,通过上式计算得到第i个数据样本点落在第k个聚类中的概率 #### M step 通过计算cluster k 中的样本数来进行权重更新$\pi_{k}$ $$N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ -- Gitee From 8672646788b4939127d687de1f4d8a5a461dda32 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:47:39 +0800 Subject: [PATCH 59/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 706db2a..6096a20 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -46,7 +46,7 @@ $$ 本次实验要求对1-D 与2-D 数据进行GaussianMixture的实现,所以分别对两种类型数据进行实现 ### 2维数据 #### 进行每个聚类的均值、协方差矩阵以及对应权重初始化 -由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum\quadvalue)/2,(Maximum\quadvalue)/2]$之间生成随机数 +由于初值选择会影响分类效果,因此均值采用介于训练集数据$[(Minimum \quad value)/2,(Maximum \quad value)/2]$之间生成随机数 ```python self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) -- Gitee From edc69dec30a7c07374c290e6aacf887ccda2d9ff Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 10:48:04 +0800 Subject: [PATCH 60/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 6096a20..873aa6c 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -59,7 +59,7 @@ self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size= #### E step $$\gamma_{k}^{(i)} = \frac{\pi_{k}N(x^{(i)}|\mu_{k},\Sigma_{k})}{\sum_{k=1}^{K}N(x^{(i)}|\mu_{k},\Sigma_{k})}$$ -$N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$/pi_{k}$每个cluster对应weight,通过上式计算得到第i个数据样本点落在第k个聚类中的概率 +$N(x^{(i)}|\mu_{k},\Sigma_{k})$采用二维高斯分布进行拟合,再乘以$\pi_{k}$每个cluster对应weight,通过上式计算得到第i个数据样本点落在第k个聚类中的概率 #### M step 通过计算cluster k 中的样本数来进行权重更新$\pi_{k}$ $$N_{k}=\sum_{i=1}^{n}\gamma_{k}^{(i)}$$ -- Gitee From 3e92df86b840888a984d9889cee67d961af596d6 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:06:53 +0800 Subject: [PATCH 61/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 873aa6c..a524338 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -114,3 +114,58 @@ E step与M step同2D数据思想相同 $argmax\frac{N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}} {\sum_{k=1}^{cluNum}N(X_{k}|\mu_{k},\Sigma_{k})Weight_{k}}$ 的计算,此时数据点i会被归至第k类 +## 3.基础实验 +### 3.1数据可视化 +在test_demo.py中进行数据可视化实现 +```python +def pltshow(test_data, res, n_clu): + mark = [[np.random.randint(0, 256) for i in range(3)] for j in range(n_clu)] + marklist = ["#{:02x}{:02x}{:02x}".format(mark[i][0], mark[i][1], mark[i][2]) for i in range(n_clu)] + colorlist = [marklist[i] for i in res] + pyplot.scatter(test[:, 0], test[:, 1], c=colorlist) + pyplot.show() +``` +### 3.2随机二维数据集生成 +通过生成不同均值、方差(协方差矩阵)、以及不同数目高斯分布作为训练集与数据集的二维数据对模型效果进行检验 +当数据分散时,分类效果较准确 ++ 第一类数据,数量为800个,标签为0: + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +3 & 0 \\\\ +0 & 2 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +1 & 2 +\end{array}\right] +\end{array} +$$ + ++ 第二类数据,数量为200个,标签为1: + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 2 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +26 & 28 +\end{array}\right] +\end{array} +$$ + ++ 第三类数据,数量为1000个,标签为2: + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 5 \\\\ +5 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +-25 & -23 +\end{array}\right] +\end{array} +$$ -- Gitee From 34264463e0e1b5151057f7b2cb9c9c2c2d98d5ae Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:54:21 +0800 Subject: [PATCH 62/80] =?UTF-8?q?=E6=95=A3=E7=82=B9=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../submission/19210680053/img/GMM1.png | Bin 0 -> 19059 bytes .../submission/19210680053/img/GMM2.png | Bin 0 -> 21630 bytes .../submission/19210680053/img/KMeans1.png | Bin 0 -> 19045 bytes .../submission/19210680053/img/Test1.png | Bin 0 -> 19387 bytes .../submission/19210680053/img/Test2.png | Bin 0 -> 22759 bytes .../submission/19210680053/img/Train1.png | Bin 0 -> 20684 bytes .../submission/19210680053/img/Train2.png | Bin 0 -> 21995 bytes .../submission/19210680053/img/kmeans2.png | Bin 0 -> 19815 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/19210680053/img/GMM1.png create mode 100644 assignment-3/submission/19210680053/img/GMM2.png create mode 100644 assignment-3/submission/19210680053/img/KMeans1.png create mode 100644 assignment-3/submission/19210680053/img/Test1.png create mode 100644 assignment-3/submission/19210680053/img/Test2.png create mode 100644 assignment-3/submission/19210680053/img/Train1.png create mode 100644 assignment-3/submission/19210680053/img/Train2.png create mode 100644 assignment-3/submission/19210680053/img/kmeans2.png diff --git a/assignment-3/submission/19210680053/img/GMM1.png b/assignment-3/submission/19210680053/img/GMM1.png new file mode 100644 index 0000000000000000000000000000000000000000..f716743bd900ec8229ff10ac5a11baca631403bb GIT binary patch literal 19059 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 PLmDbN_bZehzx;myoR>@A literal 0 HcmV?d00001 diff --git a/assignment-3/submission/19210680053/img/GMM2.png b/assignment-3/submission/19210680053/img/GMM2.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb9604acad5dd5ad40b1d23ab184dd9ebdc668d GIT binary patch literal 21630 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 KbSg0pxBm^^vKS=* literal 0 HcmV?d00001 diff --git a/assignment-3/submission/19210680053/img/Train1.png b/assignment-3/submission/19210680053/img/Train1.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b5e8924d1009a2aa98e634ff369a915003e419 GIT binary patch literal 20684 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 Yd!5-NRx!U9d>II5M>mIRtl!Ol010PrIRF3v literal 0 HcmV?d00001 diff --git a/assignment-3/submission/19210680053/img/Train2.png b/assignment-3/submission/19210680053/img/Train2.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc0c227aa625dc14bbaae3b7ba8190c6e873e08 GIT binary patch literal 21995 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/19210680053/img/kmeans2.png b/assignment-3/submission/19210680053/img/kmeans2.png new file mode 100644 index 0000000000000000000000000000000000000000..f83bb59388ee3babda573eba7504d1ccc0700e7e GIT binary patch literal 19815 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 Date: Mon, 14 Jun 2021 13:56:17 +0800 Subject: [PATCH 63/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a524338..693e66a 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -169,3 +169,38 @@ $$ \end{array}\right] \end{array} $$ + +随机打乱数据集后,前80%作为训练集,后20%作为测试集 +生成训练集如下所示 +Training dataset with 3 Gaussian Distribution +测试集如下所示 +Testing dataset with 3 Gaussian Distribution +Kmeans分类结果如下所示: +Kmeans Classification with 3 Gaussian Distribution +Gmm分类结果如下所示: + + +此时,加大分类难度,再增加一类数据集: + +第四类数据集,数量为1000,标签为3: +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +4 & 3 \\\\ +3 & 4 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +-20 & -21 +\end{array}\right] +\end{array} +$$ + +随机打乱新数据集后,前80%作为训练集,后20%作为测试集 +生成训练集如下所示 + +测试集如下所示 + +Kmeans分类结果如下所示: + + +Gmm分类结果如下所示: \ No newline at end of file -- Gitee From 402e3096fc459b665add92c7c5000fb5a162b850 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 14:05:43 +0800 Subject: [PATCH 64/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 693e66a..f5ba69f 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -171,16 +171,23 @@ $$ $$ 随机打乱数据集后,前80%作为训练集,后20%作为测试集 -生成训练集如下所示 +生成训练集如下所示: + Training dataset with 3 Gaussian Distribution -测试集如下所示 + +测试集如下所示: + Testing dataset with 3 Gaussian Distribution + Kmeans分类结果如下所示: -Kmeans Classification with 3 Gaussian Distribution + +Kmeans Classification with 3 Gaussian Distribution + Gmm分类结果如下所示: +Kmeans Classification with 3 Gaussian Distribution -此时,加大分类难度,再增加一类数据集: +此时,加大分类难度,再增加一类与已有较为接近数据集: 第四类数据集,数量为1000,标签为3: $$ @@ -196,11 +203,19 @@ $$ $$ 随机打乱新数据集后,前80%作为训练集,后20%作为测试集 -生成训练集如下所示 -测试集如下所示 +生成训练集如下所示: + +Kmeans Classification with 4 Gaussian Distribution + +测试集如下所示: + +Kmeans Classification with 4 Gaussian Distribution Kmeans分类结果如下所示: +Kmeans Classification with 3 Gaussian Distribution + +Gmm分类结果如下所示: -Gmm分类结果如下所示: \ No newline at end of file +Kmeans Classification with 3 Gaussian Distribution \ No newline at end of file -- Gitee From 95ec37a03700d753dc586d16b31012fc226fb89c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 14:06:43 +0800 Subject: [PATCH 65/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index f5ba69f..75e3abe 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -218,4 +218,4 @@ Kmeans分类结果如下所示: Gmm分类结果如下所示: -Kmeans Classification with 3 Gaussian Distribution \ No newline at end of file +Kmeans Classification with 3 Gaussian Distribution \ No newline at end of file -- Gitee From b9f7a87dbc9e5ee4117243cfb8b6d52bf30e1c85 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 14:07:35 +0800 Subject: [PATCH 66/80] kmeans --- .../submission/19210680053/img/KMeans2.png | Bin 0 -> 19815 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/19210680053/img/KMeans2.png diff --git a/assignment-3/submission/19210680053/img/KMeans2.png b/assignment-3/submission/19210680053/img/KMeans2.png new file mode 100644 index 0000000000000000000000000000000000000000..f83bb59388ee3babda573eba7504d1ccc0700e7e GIT binary patch literal 19815 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 Date: Mon, 14 Jun 2021 14:16:20 +0800 Subject: [PATCH 67/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 75e3abe..17bb221 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -173,19 +173,19 @@ $$ 随机打乱数据集后,前80%作为训练集,后20%作为测试集 生成训练集如下所示: -Training dataset with 3 Gaussian Distribution +Training dataset with 3 Gaussian Distribution 测试集如下所示: -Testing dataset with 3 Gaussian Distribution +Testing dataset with 3 Gaussian Distribution Kmeans分类结果如下所示: -Kmeans Classification with 3 Gaussian Distribution +Kmeans Classification with 3 Gaussian Distribution Gmm分类结果如下所示: -Kmeans Classification with 3 Gaussian Distribution +Kmeans Classification with 3 Gaussian Distribution 此时,加大分类难度,再增加一类与已有较为接近数据集: @@ -206,16 +206,25 @@ $$ 生成训练集如下所示: -Kmeans Classification with 4 Gaussian Distribution +Kmeans Classification with 4 Gaussian Distribution 测试集如下所示: -Kmeans Classification with 4 Gaussian Distribution +Kmeans Classification with 4 Gaussian Distribution Kmeans分类结果如下所示: -Kmeans Classification with 3 Gaussian Distribution +Kmeans Classification with 3 Gaussian Distribution -Gmm分类结果如下所示: +GMM分类结果如下所示: + +Kmeans Classification with 3 Gaussian Distribution + +此时,GMM分类结果优于KMeans,原因是给出数据本身服从二维高斯分布。 + +KMeans的迭代停止条件是计算欧氏距离,直至每一cluster中心点不再发生变化,当存在两类数据中心点较为接近时,即便迭代停止,也无法对数据点进行有效区分; + +而在给定数据服从二维高斯分布,符合GMM也是假定数据服从高斯分布假设,此时分类效果更好。 + +## 4.类簇选择 -Kmeans Classification with 3 Gaussian Distribution \ No newline at end of file -- Gitee From 9c843d9fc4f7bce742f1fbc405a5e381d1740667 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 15:56:53 +0800 Subject: [PATCH 68/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 17bb221..93f619c 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -183,7 +183,7 @@ Kmeans分类结果如下所示: Kmeans Classification with 3 Gaussian Distribution -Gmm分类结果如下所示: +GaussianMixture分类结果如下所示: Kmeans Classification with 3 Gaussian Distribution @@ -228,3 +228,11 @@ KMeans的迭代停止条件是计算欧氏距离,直至每一cluster中心点 ## 4.类簇选择 +##Elbow Method 进行优化 + +算法原理是在K 值相对较小的情况下,当选择的k值小于真正的n_clusters时,k每增加1,代价值就会大幅的减小;当选择的k值大于真正的n_cluster时, k每增加1,cost值的变化就不会那么明显。此时,正确的k值就会在这个转折点,类似肘部的地方。 + +对于代价值定义: +$$ +cost = \sum_{k=1}^{n_cluster}\sum_{i=1}^{n}(X_{i,k}-C_{k})^2 +$$ \ No newline at end of file -- Gitee From 4af92564956ae2b92be3f38f1bffff7c2bc11c82 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 16:47:39 +0800 Subject: [PATCH 69/80] elbow --- .../submission/19210680053/img/elbowres1.png | Bin 0 -> 22952 bytes .../submission/19210680053/img/elbowres2.png | Bin 0 -> 24114 bytes .../submission/19210680053/img/elbowtest1.png | Bin 0 -> 20035 bytes .../submission/19210680053/img/elbowtest2.png | Bin 0 -> 22476 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/19210680053/img/elbowres1.png create mode 100644 assignment-3/submission/19210680053/img/elbowres2.png create mode 100644 assignment-3/submission/19210680053/img/elbowtest1.png create mode 100644 assignment-3/submission/19210680053/img/elbowtest2.png diff --git a/assignment-3/submission/19210680053/img/elbowres1.png b/assignment-3/submission/19210680053/img/elbowres1.png new file mode 100644 index 0000000000000000000000000000000000000000..53fe163150b45e1d316bbd75a2f5c0d1f1156b7a GIT binary patch literal 22952 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%0Dw!FeCc&;mjvWPkLkN3VLr`M;vA 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 JS?83{1OOl?0T2KH literal 0 HcmV?d00001 diff --git a/assignment-3/submission/19210680053/img/elbowtest2.png b/assignment-3/submission/19210680053/img/elbowtest2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8c97fcd20a06a34cc5ef7a5194b213f14b1f88 GIT binary patch literal 22476 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 literal 0 HcmV?d00001 -- Gitee From 6e2b5ec95408669c0c0ad7ecd5504061e809e302 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 16:49:00 +0800 Subject: [PATCH 70/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index 93f619c..a47e954 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -14,7 +14,7 @@ $$ $$ euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ -对于每个对象,分别保留其相距最近中心点下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 +对于每个对象,分别保留其相距__最近中心点__下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1\leq k\leq cluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ ### 循环停止条件 @@ -234,5 +234,31 @@ KMeans的迭代停止条件是计算欧氏距离,直至每一cluster中心点 对于代价值定义: $$ -cost = \sum_{k=1}^{n_cluster}\sum_{i=1}^{n}(X_{i,k}-C_{k})^2 -$$ \ No newline at end of file +cost = \sum_{k=1}^{(n_cluster)}\sum_{i=1}^{n}(X_{i,k}-C_{k})^2 +$$ +即对于训练集中每个点,计算它到所属类别中心的欧式距离并进行加总,作为总代价值 + +## 最优类簇数目选择 +$$ +cost chg_{k} = cost_{k} / cost_{k-1}-1 +$$ +选取$cost chg_{k}$最小的k值作为最优分类下的类簇数目进行拟合,分别使用test_demo_elbow中由三个高斯分布和四个高斯分布组合的数据集进行求解, +# 三个高斯分布 + +训练集的实际分布情况 +Elbow Kmeans Classification with 3 Gaussian Distribution + +模型预测 + +Elbow Kmeans Classification with 3 Gaussian Distribution + +# 四个高斯分布 + +训练集的实际分布情况 + +Kmeans Classification with 3 Gaussian Distribution + +模型预测 + +Kmeans Classification with 3 Gaussian Distribution + -- Gitee From 315c44381c18c4f928c99fde201d30aa65a5a4cf Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 17:31:01 +0800 Subject: [PATCH 71/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a47e954..ca53159 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -228,7 +228,7 @@ KMeans的迭代停止条件是计算欧氏距离,直至每一cluster中心点 ## 4.类簇选择 -##Elbow Method 进行优化 +### Elbow Method 进行优化 算法原理是在K 值相对较小的情况下,当选择的k值小于真正的n_clusters时,k每增加1,代价值就会大幅的减小;当选择的k值大于真正的n_cluster时, k每增加1,cost值的变化就不会那么明显。此时,正确的k值就会在这个转折点,类似肘部的地方。 @@ -236,13 +236,23 @@ KMeans的迭代停止条件是计算欧氏距离,直至每一cluster中心点 $$ cost = \sum_{k=1}^{(n_cluster)}\sum_{i=1}^{n}(X_{i,k}-C_{k})^2 $$ -即对于训练集中每个点,计算它到所属类别中心的欧式距离并进行加总,作为总代价值 +即对于训练集中每个点,计算它到所属类别中心的欧式距离平方进行加总,作为总代价值 ## 最优类簇数目选择 + +首先进行总代价变化率: $$ cost chg_{k} = cost_{k} / cost_{k-1}-1 $$ -选取$cost chg_{k}$最小的k值作为最优分类下的类簇数目进行拟合,分别使用test_demo_elbow中由三个高斯分布和四个高斯分布组合的数据集进行求解, +接着计算变化率的变动情况(即凸性) +$$ +cost convex \quad chg_{k} = cost chg_{k} - cost chg_{k-1} +$$ +选取$cost convex \quad chg_{k}$最大的k值作为最优分类下的类簇数目进行拟合,即分类数目为$k-1$到k下降陡峭,分类数目为k到$k+1下降平缓。 + +分别使用test_demo_elbow中由三个高斯分布和四个高斯分布组合的数据集进行求解: + + # 三个高斯分布 训练集的实际分布情况 @@ -250,7 +260,7 @@ $$ 模型预测 -Elbow Kmeans Classification with 3 Gaussian Distribution +Elbow Kmeans Classification with 3 Gaussian Distribution # 四个高斯分布 @@ -262,3 +272,4 @@ $$ Kmeans Classification with 3 Gaussian Distribution +Elbow test的局限性在于其一般适用于k值较小的情况,因此生成二维高斯数据集数目较少。 -- Gitee From b2359613a7920a35a1bdfa9d140b3b9a9efb6d61 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 17:33:06 +0800 Subject: [PATCH 72/80] update assignment-3/submission/19210680053/source.py. --- assignment-3/submission/19210680053/source.py | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/assignment-3/submission/19210680053/source.py b/assignment-3/submission/19210680053/source.py index 4155b56..eb8b9e1 100644 --- a/assignment-3/submission/19210680053/source.py +++ b/assignment-3/submission/19210680053/source.py @@ -5,6 +5,7 @@ from scipy.stats import multivariate_normal class KMeans(object): def __init__(self, n_clusters): self.cluNum = n_clusters + self.distance = 0 def fit(self, train_data): # first set the initial centers by random selection @@ -41,6 +42,9 @@ class KMeans(object): if len(pointsInCluster) != 0: self.centroids[j, :] = np.mean(pointsInCluster, axis=0) + for i in range(len(clusterAssment)): + self.distance += clusterAssment[i, 1] + return self.centroids, clusterAssment, self.distance def predict(self, test_data): self.test_data = test_data @@ -52,16 +56,18 @@ class KMeans(object): m_res.append(clus_type) return np.array(m_res) + def euclDistance(self, vector1, vector2): return np.sqrt(sum(np.power(vector2 - vector1, 2))) + class GaussianMixture: # covariance: ndarray def __init__(self, n_clusters, reg_cov: float = 1e-06): self.cluNum = n_clusters - self.max_iter = 200 + self.max_iter = 1200 self.reg_cov = reg_cov self.alpha = (np.ones(n_clusters) / n_clusters) self.sigma2 = (np.ones(n_clusters)) @@ -88,7 +94,7 @@ class GaussianMixture: axis=0) / self.gamma.sum(axis=0)) # alpha.shape(1, K) self.alpha = (0.1 * self.alpha + 0.9 * self.gamma.sum(axis=0) / train_data.shape[0]) - if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1: + if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1e-3: break mu_ = self.mu sigma2_ = self.sigma2 @@ -102,6 +108,7 @@ class GaussianMixture: # make the variance equals to 1 as diagonal np.fill_diagonal(self.covariance[k], 1) self.weight = np.ones(self.cluNum) / self.cluNum + p_mat = np.zeros((sampleN, self.cluNum)) for i in range(self.max_iter): for j in range(self.cluNum): @@ -111,17 +118,18 @@ class GaussianMixture: total_n = p_mat.sum(axis=1) total_n[total_n == 0] = self.cluNum p_mat /= total_n.reshape(-1, 1) - if sample_fea == 2: + if sample_fea != 1: for j in range(self.cluNum): N_k = np.sum(p_mat[:, j], axis=0) + self.means[j] = (1 / N_k) * np.sum(train_data * p_mat[:, j].reshape(-1, 1), axis=0) self.covariance[j] = (1 / N_k) * np.dot( (p_mat[:, j].reshape(-1, 1) * (train_data - self.means[j])).T, (train_data - self.means[j])) + self.reg_cov self.weight[j] = N_k / sampleN - else: - print("one and two dimension data is accepted") + else: + print("sorry, the model is only designed for 1-D and 2-D data") def predict(self, test_data): sampleN, sample_fea = test_data.shape @@ -155,3 +163,29 @@ class GaussianMixture: phi = (1 / np.sqrt(2 * np.pi * self.sigma2.reshape(self.cluNum, 1)) * np.exp( - (data - mu.reshape(self.cluNum, 1)) ** 2 / (2 * self.sigma2.reshape(self.cluNum, 1)))) return phi + + +class ClusteringAlgorithm: + + def __init__(self): + self.elbow_dict = {} + self.elbow_chg = [] + self.elbow_chg_next = [] + self.bestCluNum = 0 + + def fit(self, train_data): + for i in range(2, 6): + self.km = KMeans(i) + self.elbow_dict[i] = self.km.fit(train_data)[2] + elbow_dist = list(self.elbow_dict.values()) + self.elbow_chg = [(elbow_dist[i] / elbow_dist[i - 1]) - 1 for i in range(1, len(elbow_dist))] + self.elbow_chg_next = [(self.elbow_chg[i] - self.elbow_chg[i - 1]) for i in range(1, len(self.elbow_chg))] + self.bestCluNum = self.elbow_chg.index(max(self.elbow_chg)) + 3 + self.km = KMeans(self.bestCluNum) + self.km.fit(train_data) + return elbow_dist, self.bestCluNum + + def predict(self, test_data): + res = self.km.predict(test_data) + return res + -- Gitee From b3cc172f5cdc5fab2ac08574164f698389006d2e Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 17:35:37 +0800 Subject: [PATCH 73/80] update assignment-3/submission/19210680053/source.py. --- assignment-3/submission/19210680053/source.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/assignment-3/submission/19210680053/source.py b/assignment-3/submission/19210680053/source.py index eb8b9e1..ce8488b 100644 --- a/assignment-3/submission/19210680053/source.py +++ b/assignment-3/submission/19210680053/source.py @@ -74,6 +74,12 @@ class GaussianMixture: def fit(self, train_data): sampleN, sample_fea = train_data.shape + ''' + gamma.shape(N, K) + mu.shape(1, K) + sigma2.shape(1,K) + alpha.shape(1, K) + ''' if sample_fea == 1: train_data = self.normalize(train_data) print(train_data) @@ -82,30 +88,27 @@ class GaussianMixture: sigma2_ = self.sigma2 mu_ = self.mu while True: - # gamma.shape(N, K) + self.gamma = (0.1 * self.gamma + 0.9 * self.phi(train_data, self.mu).T * self.alpha / ( self.phi(train_data, self.mu).T * self.alpha).sum( axis=1).reshape(train_data.shape[0], 1)) - # mu.shape(1, K) + self.mu = (0.1 * self.mu + 0.9 * np.matmul(train_data, self.gamma) / self.gamma.sum(axis=0)) - # sigma2.shape(1,K) + self.sigma2 = (0.1 * self.sigma2 + 0.9 * ( self.gamma * (train_data.reshape(train_data.shape[0], 1) - self.mu) ** 2).sum( axis=0) / self.gamma.sum(axis=0)) - # alpha.shape(1, K) + self.alpha = (0.1 * self.alpha + 0.9 * self.gamma.sum(axis=0) / train_data.shape[0]) if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 1e-3: break mu_ = self.mu sigma2_ = self.sigma2 - # # reg covariance depend on dimension of the features elif sample_fea == 2: self.reg_cov = self.reg_cov * np.identity(sample_fea) self.means = np.random.randint(train_data.min() / 2, train_data.max() / 2, size=(self.cluNum, sample_fea)) - # there should be n_clusters covariance and each one's size depend on feature self.covariance = np.zeros((self.cluNum, sample_fea, sample_fea)) for k in range(self.cluNum): - # make the variance equals to 1 as diagonal np.fill_diagonal(self.covariance[k], 1) self.weight = np.ones(self.cluNum) / self.cluNum @@ -141,7 +144,7 @@ class GaussianMixture: elif sample_fea == 2: p_mat = np.zeros((test_data.shape[0], self.cluNum)) for j in range(self.cluNum): - # self.covariance += self.reg_cov + self.covariance += self.reg_cov g = multivariate_normal(mean=self.means[j], cov=self.covariance[j]) p_mat[:, j] = self.weight[j] * g.pdf(test_data) @@ -158,7 +161,7 @@ class GaussianMixture: return nor_data def phi(self, data, mu): - # phi.shape(K, N) + '''phi.shape(K, N)''' mu = (np.arange(self.cluNum) - self.cluNum // 2) * (data.max() - data.min()) / self.K phi = (1 / np.sqrt(2 * np.pi * self.sigma2.reshape(self.cluNum, 1)) * np.exp( - (data - mu.reshape(self.cluNum, 1)) ** 2 / (2 * self.sigma2.reshape(self.cluNum, 1)))) -- Gitee From 0557651654195e78e312c70d1efffcae26547e4c Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 18:34:19 +0800 Subject: [PATCH 74/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index ca53159..a0b8c66 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -14,7 +14,7 @@ $$ $$ euclDistance_{i,j}={\sqrt {\sum_{t=1}^{dim} (X_{it}-C_{jt})^2}} $$ -对于每个对象,分别保留其相距__最近中心点__下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 +对于每个对象,分别保留其相距 __最近中心点__ 下标以及对应距离平方,存储在clusterAssment中(shape: N*2)的第一列与第二列 ### 中心点更新 根据clusterAssment的第一列数据,分别得到距离每个$C_k$,$1\leq k\leq cluNum$最近的一系列点坐标,因此对于k类数据点求取均值,得到其作为新的$C_k$ ### 循环停止条件 -- Gitee From d667176676629fabfa6d3f24a04cd64a96aef054 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 18:35:21 +0800 Subject: [PATCH 75/80] update assignment-3/submission/19210680053/README.md. --- assignment-3/submission/19210680053/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/README.md b/assignment-3/submission/19210680053/README.md index a0b8c66..6f59e45 100644 --- a/assignment-3/submission/19210680053/README.md +++ b/assignment-3/submission/19210680053/README.md @@ -253,7 +253,7 @@ $$ 分别使用test_demo_elbow中由三个高斯分布和四个高斯分布组合的数据集进行求解: -# 三个高斯分布 +#### 三个高斯分布 训练集的实际分布情况 Elbow Kmeans Classification with 3 Gaussian Distribution @@ -262,7 +262,7 @@ $$ Elbow Kmeans Classification with 3 Gaussian Distribution -# 四个高斯分布 +#### 四个高斯分布 训练集的实际分布情况 -- Gitee From 562fdcce74ffb22f665c64368fc1fca51a492231 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 18:40:25 +0800 Subject: [PATCH 76/80] test demo update --- .../submission/19210680053/test_demo.py | 182 ++++++++++++++++++ .../submission/19210680053/test_demo_elbow.py | 70 +++++++ 2 files changed, 252 insertions(+) create mode 100644 assignment-3/submission/19210680053/test_demo.py create mode 100644 assignment-3/submission/19210680053/test_demo_elbow.py diff --git a/assignment-3/submission/19210680053/test_demo.py b/assignment-3/submission/19210680053/test_demo.py new file mode 100644 index 0000000..f04f54c --- /dev/null +++ b/assignment-3/submission/19210680053/test_demo.py @@ -0,0 +1,182 @@ +import numpy as np +import sys +from source import GaussianMixture, KMeans, ClusteringAlgorithm +from ondGMM import GMM +from matplotlib import pyplot + + +def shuffle(*datas): + data = np.concatenate(datas) + label = np.concatenate([ + np.ones((d.shape[0],), dtype=int) * i + for (i, d) in enumerate(datas)]) + N = data.shape[0] + # idx = np.random.permutation(np.arange(N)) + idx = np.arange(N) + np.random.shuffle(idx) + # random_index = np.random.permutation(N) + # for i in range(N): + # datashu[i,:] = data[idx[i],:] + # labelshu[i] = label[idx[i]] + data = data[idx] + label = label[idx] + return data, label + + +def data_1(): + mean = (1, 2) + cov = np.array([[73, 0], [0, 22]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (16, -5) + cov = np.array([[21.2, 0], [0, 32.1]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (10, 22) + cov = np.array([[10, 5], [5, 10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + data, _ = shuffle(x, y, z) + return (data, data), 3 + + +def data_test(input=3): + mean = (1, 2) + cov = np.array([[3, 0], [0, 2]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (26, 28) + cov = np.array([[2, 0], [0, 2]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (-25, -23) + cov = np.array([[10, 5], [5, 10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + mean = (11, 13) + cov = np.array([[4, 3], [3, 4]]) + q = np.random.multivariate_normal(mean, cov, (1000,)) + if input == 3: + data, label = shuffle(x, y, z) + elif input == 4: + data, label = shuffle(x, y, z, q) + else: + print("only 3 and 4 is accepted") + num = len(data) + train_data, test_data = data[:int(0.8 * num)], data[int(0.8 * num):num] + train_label, test_label = label[:int(0.8 * num)], label[int(0.8 * num):num] + return train_data, test_data, train_label, test_label + + +def data_2(): + train_data = np.array([ + [23, 12, 173, 2134], + [99, -12, -126, -31], + [55, -145, -123, -342], + ]) + return (train_data, train_data), 2 + + +def data_3(): + train_data = np.array([ + [23], + [-2999], + [-2955], + ]) + # train_data = np.array([1.4140995 , -0.72260484, -0.69149465]) + return (train_data, train_data), 2 + + +def test_with_n_clusters(data_fuction, algorithm_class): + (train_data, test_data), n_clusters = data_fuction()[0], data_fuction()[1] + model = algorithm_class(n_clusters) + model.fit(train_data) + res = model.predict(test_data) + assert len( + res.shape) == 1 and res.shape[0] == test_data.shape[0], "shape of result is wrong" + return res + + +def testcase_1_1(): + test_with_n_clusters(data_1, KMeans) + return True + + +def testcase_1_2(): + res = test_with_n_clusters(data_2, KMeans) + return res[0] != res[1] and res[1] == res[2] + + +def testcase_2_1(): + test_with_n_clusters(data_1, GaussianMixture) + return True + + +def testcase_2_2(): + res = test_with_n_clusters(data_3, GMM) + return res[0] != res[1] and res[1] == res[2] + + +def test_all(err_report=False): + testcases = [ + ["KMeans-1", testcase_1_1, 4], + ["KMeans-2", testcase_1_2, 4], + # ["KMeans-3", testcase_1_3, 4], + # ["KMeans-4", testcase_1_4, 4], + # ["KMeans-5", testcase_1_5, 4], + ["GMM-1", testcase_2_1, 4], + ["GMM-2", testcase_2_2, 4], + # ["GMM-3", testcase_2_3, 4], + # ["GMM-4", testcase_2_4, 4], + # ["GMM-5", testcase_2_5, 4], + ] + sum_score = sum([case[2] for case in testcases]) + score = 0 + for case in testcases: + try: + res = case[2] if case[1]() else 0 + except Exception as e: + if err_report: + print("Error [{}] occurs in {}".format(str(e), case[0])) + res = 0 + score += res + print("+ {:14} {}/{}".format(case[0], res, case[2])) + print("{:16} {}/{}".format("FINAL SCORE", score, sum_score)) + + +def pltshow(data, res, n_clu): + mark = [[np.random.randint(0, 256) for i in range(3)] for j in range(n_clu)] + marklist = ["#{:02x}{:02x}{:02x}".format(mark[i][0], mark[i][1], mark[i][2]) for i in range(n_clu)] + colorlist = [marklist[i] for i in res] + pyplot.scatter(data[:, 0], data[:, 1], c=colorlist) + pyplot.show() + + +# def display(data, label, name, labelNum): +# datas = [[] for i in range(labelNum)] +# for i in range(len(data)): +# datas[label[i]].append(data[i]) + +# for each in datas: +# each = np.array(each) +# pyplot.scatter(each[:, 0], each[:, 1]) + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "--report": + test_all(True) + else: + test_all() + + final = data_test(3)#input = 3 or 4 + train, test, train_label, test_label = final[0], final[1], final[2], final[3] + cluster_num = 3 + km = KMeans(cluster_num) + km.fit(train) + kmeans_res = km.predict(test) + gmm = GaussianMixture(cluster_num) + gmm.fit(train) + gmm_res = gmm.predict(test) + # pltshow(train, train_label, cluster_num) + # pltshow(test, test_label, cluster_num) + # pltshow(test, kmeans_res, cluster_num) + # pltshow(test, gmm_res, cluster_num) diff --git a/assignment-3/submission/19210680053/test_demo_elbow.py b/assignment-3/submission/19210680053/test_demo_elbow.py new file mode 100644 index 0000000..b24efe5 --- /dev/null +++ b/assignment-3/submission/19210680053/test_demo_elbow.py @@ -0,0 +1,70 @@ +import numpy as np +from source import KMeans, ClusteringAlgorithm +from matplotlib import pyplot + + +def shuffle(*datas): + data = np.concatenate(datas) + label = np.concatenate([ + np.ones((d.shape[0],), dtype=int) * i + for (i, d) in enumerate(datas)]) + N = data.shape[0] + idx = np.arange(N) + np.random.shuffle(idx) + data = data[idx] + label = label[idx] + return data, label + + +def data_test(input=3): + mean = (1, 2) + cov = np.array([[3, 0], [0, 2]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (26, 28) + cov = np.array([[2, 0], [0, 2]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (-25, -23) + cov = np.array([[10, 5], [5, 10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + mean = (11, 13) + cov = np.array([[4, 3], [3, 4]]) + q = np.random.multivariate_normal(mean, cov, (1000,)) + if input == 3: + data, label = shuffle(x, y, z) + elif input == 4: + data, label = shuffle(x, y, z, q) + else: + print("only 3 and 4 is accepted") + num = len(data) + train_data, test_data = data[:int(0.8 * num)], data[int(0.8 * num):num] + train_label, test_label = label[:int(0.8 * num)], label[int(0.8 * num):num] + return train_data, test_data, train_label, test_label + + +def pltshow(data, res, n_clu): + mark = [[np.random.randint(0, 256) for i in range(3)] for j in range(n_clu)] + marklist = ["#{:02x}{:02x}{:02x}".format(mark[i][0], mark[i][1], mark[i][2]) for i in range(n_clu)] + # marklist = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w'] + colorlist = [marklist[i] for i in res] + pyplot.scatter(data[:, 0], data[:, 1], c=colorlist) + pyplot.show() + + +if __name__ == "__main__": + input_ = 4 + final = data_test(input_) + train, test, train_label, test_label = final[0], final[1], final[2], final[3] + # cluster_num = 3 + clu_test = ClusteringAlgorithm() + elbow_dict, best_num = clu_test.fit(train) + clu_res = clu_test.predict(test) + + km = KMeans(input_) + km.fit(train) + res = km.predict(test) + + pltshow(test, res, input_) + pltshow(test, clu_res, best_num) -- Gitee From 82a6dc2310a619a76093fb21b93caed6d2de5ef6 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 18:42:06 +0800 Subject: [PATCH 77/80] update assignment-3/submission/19210680053/test_demo.py. shanchu unnecessary --- assignment-3/submission/19210680053/test_demo.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/assignment-3/submission/19210680053/test_demo.py b/assignment-3/submission/19210680053/test_demo.py index f04f54c..1dbd114 100644 --- a/assignment-3/submission/19210680053/test_demo.py +++ b/assignment-3/submission/19210680053/test_demo.py @@ -11,13 +11,8 @@ def shuffle(*datas): np.ones((d.shape[0],), dtype=int) * i for (i, d) in enumerate(datas)]) N = data.shape[0] - # idx = np.random.permutation(np.arange(N)) idx = np.arange(N) np.random.shuffle(idx) - # random_index = np.random.permutation(N) - # for i in range(N): - # datashu[i,:] = data[idx[i],:] - # labelshu[i] = label[idx[i]] data = data[idx] label = label[idx] return data, label @@ -83,7 +78,7 @@ def data_3(): [-2999], [-2955], ]) - # train_data = np.array([1.4140995 , -0.72260484, -0.69149465]) + return (train_data, train_data), 2 @@ -152,15 +147,6 @@ def pltshow(data, res, n_clu): pyplot.show() -# def display(data, label, name, labelNum): -# datas = [[] for i in range(labelNum)] -# for i in range(len(data)): -# datas[label[i]].append(data[i]) - -# for each in datas: -# each = np.array(each) -# pyplot.scatter(each[:, 0], each[:, 1]) - if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "--report": test_all(True) -- Gitee From 2b0d149322b4252065226310afd9fb46b8f360a1 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 19:06:42 +0800 Subject: [PATCH 78/80] update assignment-3/submission/19210680053/source.py. --- assignment-3/submission/19210680053/source.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/source.py b/assignment-3/submission/19210680053/source.py index ce8488b..3fd5515 100644 --- a/assignment-3/submission/19210680053/source.py +++ b/assignment-3/submission/19210680053/source.py @@ -176,9 +176,15 @@ class ClusteringAlgorithm: self.elbow_chg_next = [] self.bestCluNum = 0 - def fit(self, train_data): + + def fit(self, train_data): for i in range(2, 6): - self.km = KMeans(i) + mini_loss = 1e8 + '''To guarantee robustness''' + for j in range(50): + self.km = KMeans(i) + if self.km.fit(train_data)[2] < mini_loss: + mini_loss = self.km.fit(train_data)[2] self.elbow_dict[i] = self.km.fit(train_data)[2] elbow_dist = list(self.elbow_dict.values()) self.elbow_chg = [(elbow_dist[i] / elbow_dist[i - 1]) - 1 for i in range(1, len(elbow_dist))] -- Gitee From d7162739e9ed2886d406fe1d73243d9bedb4a3f8 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 19:07:36 +0800 Subject: [PATCH 79/80] update assignment-3/submission/19210680053/source.py. --- assignment-3/submission/19210680053/source.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assignment-3/submission/19210680053/source.py b/assignment-3/submission/19210680053/source.py index 3fd5515..6da8cef 100644 --- a/assignment-3/submission/19210680053/source.py +++ b/assignment-3/submission/19210680053/source.py @@ -176,8 +176,7 @@ class ClusteringAlgorithm: self.elbow_chg_next = [] self.bestCluNum = 0 - - def fit(self, train_data): + def fit(self, train_data): for i in range(2, 6): mini_loss = 1e8 '''To guarantee robustness''' -- Gitee From 4423683f91900d479ef17098a3a5824d65f5966a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 19:08:09 +0800 Subject: [PATCH 80/80] update assignment-3/submission/19210680053/source.py. --- assignment-3/submission/19210680053/source.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/assignment-3/submission/19210680053/source.py b/assignment-3/submission/19210680053/source.py index 6da8cef..5bf9619 100644 --- a/assignment-3/submission/19210680053/source.py +++ b/assignment-3/submission/19210680053/source.py @@ -64,7 +64,6 @@ class KMeans(object): class GaussianMixture: # covariance: ndarray - def __init__(self, n_clusters, reg_cov: float = 1e-06): self.cluNum = n_clusters self.max_iter = 1200 @@ -169,7 +168,6 @@ class GaussianMixture: class ClusteringAlgorithm: - def __init__(self): self.elbow_dict = {} self.elbow_chg = [] -- Gitee