Huang Chao's Blog

  • 首页

  • 标签

  • 分类

  • 归档

手写Kmeans

发表于 2019-09-22 分类于 Python 阅读次数:
本文字数: 2.3k 阅读时长 ≈ 2 分钟

kmeans.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
手写kmeans
"""
import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import make_blobs
import typing


class KMeans:
def __init__(self, k: int):
self.k = k
self._centers = None

def fit(self, nda: np.ndarray, n_iters=10, callback: typing.Callable = None):
n_features = nda.shape[1]
centers = self.random_centers(self.k, n_features)

for i in range(n_iters):
labels = self.assign(centers, nda)
centers = self.update(nda, labels, self.k)
if callback:
callback(nda, labels, i)

def predict(self, nda: np.ndarray):
return self.assign(self.centers, nda)

@property
def centers(self):
if not self._centers:
raise AttributeError("Call 'fit' before reference to centers.")
return self._centers

@staticmethod
def random_centers(k, n_features):
return np.random.random((k, n_features))

@staticmethod
def assign(centers, nda):
n = nda.shape[0]
labels = np.empty(n)
for i, arr in enumerate(nda):
labels[i] = KMeans.nearest_center(centers, arr)
return labels

@staticmethod
def update(nda, labels, k):
centers = np.empty(k)
for i in range(k):
center = KMeans.cal_center(nda, labels, i)
centers[i] = center
return centers

@staticmethod
def distance(arr1, arr2):
return np.sum((arr1 - arr2) ** 2)

@staticmethod
def cal_center(nda, labels, i):
return np.mean(nda[labels == i])

@staticmethod
def nearest_center(centers, nda):
j = -1
min_dis = np.PINF
for i, center in enumerate(centers):
dis = KMeans.distance(center, nda)
if dis < min_dis:
min_dis = dis
j = i
return j


def my_plot(nda, labels, i):
if i % 10 == 0:
plt.scatter(nda[:, 0], nda[:, 1], c=labels)
plt.title("i = %s" % i)
plt.savefig("%s.png" % i)


def main():
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state=9)

kmeans = KMeans(4)
kmeans.fit(X, n_iters=40, callback=my_plot)


if __name__ == '__main__':
main()
阅读全文 »

软件设计原则小记

发表于 2019-09-20 分类于 Memo 阅读次数:
本文字数: 445 阅读时长 ≈ 1 分钟

1. 单一职责原则

  • 一个类只有一个职责,只有一个原因引起变化

  • 最大的好处是复用,类、接口拆得够小,复用的可能就越大

  • 需求变化引起的修改少

2. 里氏替换原则

  • 父类出现的地方子类都可以出现

  • 子类必须实现父类的所有方法

  • 为了实现面向接口/面向抽象编程

3. 依赖倒置原则

  • 高层依赖不依赖低层,依赖于抽象

  • 抽象不依赖于细节,细节依赖于抽象

  • 本质就是面向接口编程

  • 接口、抽象的实质就是契约

  • 抽象将不同的实现方式进行和约束和职责划分,是软件设计中的精髓

  • 各个类之间松耦合

阅读全文 »

试谈传统算法与机器学习算法

发表于 2019-09-17 更新于 2019-09-22 分类于 Memo 阅读次数:
本文字数: 987 阅读时长 ≈ 1 分钟

传统的数据结构与算法中的算法一般定义是$^{1}$:

非形式地说,算法(algorithm)就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。

我们也可以把算法看成是用于求解良说明的计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。

阅读全文 »

Linux安装python3

发表于 2019-08-10 更新于 2019-08-17 分类于 Memo 阅读次数:
本文字数: 989 阅读时长 ≈ 1 分钟

环境

CentOS 6

linux原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。

输入命令Python,查看得知是Python2.6版本

下面介绍如何在保留原python2的情况下,安装python3

安装python3

下载依赖包

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

阅读全文 »

Python作图简介

发表于 2019-03-19 更新于 2019-08-11 分类于 Python 阅读次数:
本文字数: 5.2k 阅读时长 ≈ 5 分钟

设置作图方式

如果你使用的IDE是spyder,可以通过如图的位置进行设置,设置完成后重启spyder以使设置生效


或者你可以通过运行下面的命令进行快速设置

1
2
#在console中输出图片
%matplotlib inline
1
2
#在单独窗口中输出图片
%matplotlib qt5

工具简介

下面我会基于两个工具来介绍python的基本作图。

阅读全文 »

Postgresql实现动态的行转列

发表于 2018-09-20 更新于 2019-08-11 分类于 SQL 阅读次数:
本文字数: 3.8k 阅读时长 ≈ 3 分钟

问题

在数据处理中,常遇到行转列的问题,比如有如下的问题:
有这样的一张表
“Student_score”表:

姓名 课程 分数
张三 数学 83
张三 物理 93
张三 语文 80
李四 语文 74
李四 数学 84
李四 物理 94

我们想要得到像这样的一张表:

姓名 数学 物理 语文
李四 84 94 74
张三 83 93 80
阅读全文 »

SQL知识点总结

发表于 2018-09-08 更新于 2019-08-10 分类于 SQL 阅读次数:
本文字数: 8.2k 阅读时长 ≈ 7 分钟

SQL简介

什么是数据库(database)

保存有组织的数据的容器(通常是一个文件或一组文件)。

什么是SQL

SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL用于访问和处理数据库的标准的计算机语言。

SQL语言分4类:

  • 数据查询语言(DQL):select,from,where
  • 数据操纵语言(DML):insert,update,delete
  • 数据定义语言(DDL):create,alter,drop
  • 数据控制语言(DCL):grant,revoke,commit,rollback,savepoint
阅读全文 »
Huang Chao

Huang Chao

7 日志
3 分类
11 标签
E-Mail
Creative Commons
© 2019 Huang Chao | 22k | 20 分钟
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v7.3.0
|
0%