没有合适的资源?快使用搜索试试~ 我知道了~
【Bisecting K-means算法】{1} —— 使用Python实现Bisecting K-means算法并处理Iris...
1 下载量 156 浏览量
2020-12-21
06:24:41
上传
评论
收藏 97KB PDF 举报
温馨提示
试读
4页
此处基于Bisecting K-means算法处理Iris数据集 bisecting_kmeans.py模块: import numpy as np class KMeansClassifier(): """初始化KMeansClassifier类""" def __init__(self, k=3, initCent='random', max_iter=500): # 类的成员数据(变量前用下划线) self._k = k # 中心点 self._initCent = initCent # 生成初始中心点 self
资源推荐
资源详情
资源评论
【【Bisecting K-means算法】算法】{1} —— 使用使用Python实现实现
Bisecting K-means算法并处理算法并处理Iris数据集数据集
此处基于此处基于Bisecting K-means算法处理算法处理Iris数据集数据集
bisecting_kmeans.py模块:模块:
import numpy as np
class KMeansClassifier():
"""初始化KMeansClassifier类"""
def __init__(self, k=3, initCent='random', max_iter=500):
# 类的成员数据(变量前用下划线)
self._k = k # 中心点
self._initCent = initCent # 生成初始中心点
self._max_iter = max_iter # 最大迭代次数
self._clusterAssment = None # 点分配结果
self._labels = None
self._sse = None # 误差平方和
def _calEDist(self, arrA, arrB):
"""计算欧氏距离,参数为两个一维数组"""
return np.math.sqrt(sum(np.power(arrA-arrB, 2)))
def _calMDist(self, arrA, arrB):
"""计算曼哈顿距离,参数为两个一维数组"""
return sum(np.abs(arrA-arrB))
def _randCent(self, data_X, k):
"""随机选取k个质心,返回一个k*n的质心矩阵"""
n = data_X.shape[1] # 特征的维度
centroids = np.empty((k,n)) # 使用numpy生成一个k*n的矩阵,用于存储质心
for j in range(n):
minJ = min(data_X[:, j])
rangeJ = float(max(data_X[:, j] - minJ))
centroids[:, j] = (minJ + rangeJ * np.random.rand(k, 1)).flatten() # 使用flatten函数展平嵌套列表(nested list)
return centroids
def fit(self, data_X):
"""参数为m*n维矩阵"""
if not isinstance(data_X, np.ndarray):
data_X = np.asarray(data_X)
m = data_X.shape[0] # 样本的个数
self._clusterAssment = np.zeros((m,2)) # 一个m*2维矩阵,矩阵第一列存储样本点所属的簇的索引值,第二列存储该点与所属
簇的质心的平方误差
if self._initCent == 'random':
self._centroids = self._randCent(data_X, self._k)
clusterChanged = True
for _ in range(self._max_iter):
clusterChanged = False
for i in range(m): # 将每个样本点分配到离它最近的质心所属的簇
minDist = np.inf # 首先将minDist置为一个无穷大的数
minIndex = -1 # 将最近质心的下标置为-1
for j in range(self._k): # k次迭代用于寻找最近的质心
arrA = self._centroids[j,:] arrB = data_X[i,:] distJI = self._calEDist(arrA, arrB) # 计算误差值
if distJI minDist**2:
clusterChanged = True
self._clusterAssment[i,:] = minIndex, minDist**2
if not clusterChanged: # 若所有样本点所属的簇都不改变,则已收敛,结束迭代
break
# 更新质心,将每个簇中的点的均值作为质心
for i in range(self._k):
index_all = self._clusterAssment[:,0] # 取出样本所属簇的索引值
value = np.nonzero(index_all==i) # 取出所有属于第i个簇的索引值
ptsInClust = data_X[value[0]] # 取出属于第i个簇的所有样本点
self._centroids[i,:] = np.mean(ptsInClust, axis=0) # 计算均值
资源评论
weixin_38589774
- 粉丝: 4
- 资源: 953
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功