『科学计算』层次聚类实现

层次聚类理论自行百度,这里是一个按照我的理解的简单实现,

我们先看看数据,

啤酒名 热量 钠含量 酒精 价格Budweiser 144.00 19.00 4.70 .43Schlitz 181.00 19.00 4.90 .43Ionenbrau 157.00 15.00 4.90 .48Kronensourc 170.00 7.00 5.20 .73Heineken 152.00 11.00 5.00 .77Old-milnaukee 145.00 23.00 4.60 .26Aucsberger 175.00 24.00 5.50 .40Strchs-bohemi 149.00 27.00 4.70 .42Miller-lite 99.00 10.00 4.30 .43Sudeiser-lich 113.00 6.00 3.70 .44Coors 140.00 16.00 4.60 .44Coorslicht 102.00 15.00 4.10 .46Michelos-lich 135.00 11.00 4.20 .50Secrs 150.00 19.00 4.70 .76Kkirin 149.00 6.00 5.00 .79Pabst-extra-l 68.00 15.00 2.30 .36Hamms 136.00 19.00 4.40 .43Heilemans-old 144.00 24.00 4.90 .43Olympia-gold- 72.00 6.00 2.90 .46Schlite-light 97.00 7.00 4.20 .47 

程序如下,

import numpy as np
import pandas as pd

data = pd.read_csv(‘./bear.txt‘, delim_whitespace=True)
X = np.array(data.ix[:,1:])
names = [[name] for name in data.ix[:,0]]

def cluster_step(X,names):
    dis = np.empty([len(X),len(X)])
    for i in range(len(X)):
        for j in range(len(X)):
            dis[i][j] = np.sqrt(np.sum(np.square(X[i] - X[j])))
            if i == j:
                dis[i][j] = 999
    x, y = [(np.argmin(dis))//len(X), np.mod(np.argmin(dis),len(X))]
    X[x] = (X[x] + X[y])/2
    X = np.delete(X, y, axis=0)
    names[x].extend(names[y])
    names.remove(names[y])
    return x, y, X, names, dis

def cluster(X, num, names):
    classes = len(X)
    while classes != num:
        _x, _y, X, names, _dis = cluster_step(X, names)
        with open(‘./result.txt‘, ‘a‘) as f:
            f.write(‘\r‘+str(_x))
            f.write(‘\r‘+str(_y))
            f.write(‘\r‘ + str(_dis[_x,_y]))
            f.write(‘\r‘+str(_dis))
            f.write(‘\r‘+str(names))
            f.flush()
        classes -= 1
    return names

if __name__==‘__main__‘:
    names = cluster(X, 4, names)

规则是每次合并后去中心点(每一步会合并两个位置,取均值做新位置)作为类簇位置,距离使用的是欧式距离。

实际上由于每次合并后下一次的节点会减少,和最初的20个点就对不上了,头疼了好一会,后来想到在每一次迭代中把每一个种类名按照类去合并,这样就不需要在最后利用索引去复原啤酒种类了,感觉挺机智。由于这样直接说不直观,我下面给出中间输出,

[[‘Budweiser‘], [‘Schlitz‘], [‘Ionenbrau‘], [‘Kronensourc‘], [‘Heineken‘], [‘Old-milnaukee‘, ‘Heilemans-old‘], [‘Aucsberger‘], [‘Strchs-bohemi‘], [‘Miller-lite‘], [‘Sudeiser-lich‘], [‘Coors‘], [‘Coorslicht‘], [‘Michelos-lich‘], [‘Secrs‘], [‘Kkirin‘], [‘Pabst-extra-l‘], [‘Hamms‘], [‘Olympia-gold-‘], [‘Schlite-light‘]]
[[‘Budweiser‘], [‘Schlitz‘], [‘Ionenbrau‘], [‘Kronensourc‘], [‘Heineken‘], [‘Old-milnaukee‘, ‘Heilemans-old‘], [‘Aucsberger‘], [‘Strchs-bohemi‘], [‘Miller-lite‘, ‘Schlite-light‘], [‘Sudeiser-lich‘], [‘Coors‘], [‘Coorslicht‘], [‘Michelos-lich‘], [‘Secrs‘], [‘Kkirin‘], [‘Pabst-extra-l‘], [‘Hamms‘], [‘Olympia-gold-‘]]
[[‘Budweiser‘, ‘Old-milnaukee‘, ‘Heilemans-old‘], [‘Schlitz‘], [‘Ionenbrau‘], [‘Kronensourc‘], [‘Heineken‘], [‘Aucsberger‘], [‘Strchs-bohemi‘], [‘Miller-lite‘, ‘Schlite-light‘], [‘Sudeiser-lich‘], [‘Coors‘], [‘Coorslicht‘], [‘Michelos-lich‘], [‘Secrs‘], [‘Kkirin‘], [‘Pabst-extra-l‘], [‘Hamms‘], [‘Olympia-gold-‘]]
[[‘Budweiser‘, ‘Old-milnaukee‘, ‘Heilemans-old‘], [‘Schlitz‘], [‘Ionenbrau‘], [‘Kronensourc‘], [‘Heineken‘], [‘Aucsberger‘], [‘Strchs-bohemi‘], [‘Miller-lite‘, ‘Schlite-light‘], [‘Sudeiser-lich‘], [‘Coors‘, ‘Hamms‘], [‘Coorslicht‘], [‘Michelos-lich‘], [‘Secrs‘], [‘Kkirin‘], [‘Pabst-extra-l‘], [‘Olympia-gold-‘]]
... ... ...

每次list长度减少1,某个子list长度加一这样

查看一下输出,

names
Out[1]:
[[‘Budweiser‘,
‘Old-milnaukee‘,
‘Heilemans-old‘,
‘Secrs‘,
‘Strchs-bohemi‘,
‘Ionenbrau‘,
‘Heineken‘,
‘Kkirin‘,
‘Coors‘,
‘Hamms‘,
‘Michelos-lich‘],
[‘Schlitz‘, ‘Aucsberger‘, ‘Kronensourc‘],
[‘Miller-lite‘, ‘Schlite-light‘, ‘Coorslicht‘, ‘Sudeiser-lich‘],
[‘Pabst-extra-l‘, ‘Olympia-gold-‘]]

时间: 2024-11-10 05:24:36

『科学计算』层次聚类实现的相关文章

『科学计算』通过代码理解SoftMax多分类

SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个样本只有正确的分类才取1,对于损失函数实际上只有m个表达式(m个样本每个有一个正确的分类)相加, 对于梯度实际上是把我们以前的最后一层和分类层合并了: 第一步则和之前的求法类似,1-概率 & 0-概率组成向量,作为分类层的梯度,对batch数据实现的话就是建立一个(m,k)的01矩阵,直接点乘控制开

『科学计算』线性代数部分作业

最小二乘法求解垂足 from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D A=np.array([[1],[2],[3]]) B=np.array([[1],[1],[1]]) x=np.linspace(-0.5,1,10) x.shape=(1,10) xx=A.dot(x) C=A.T.dot(B) AA=np.linalg.inv(A.T.dot(A)

『科学计算_理论』优化算法:梯度下降法&牛顿法

梯度下降法 梯度下降法用来求解目标函数的极值.这个极值是给定模型给定数据之后在参数空间中搜索找到的.迭代过程为: 可以看出,梯度下降法更新参数的方式为目标函数在当前参数取值下的梯度值,前面再加上一个步长控制参数alpha.梯度下降法通常用一个三维图来展示,迭代过程就好像在不断地下坡,最终到达坡底.为了更形象地理解,也为了和牛顿法比较,这里我用一个二维图来表示: 懒得画图了直接用这个展示一下.在二维图中,梯度就相当于凸函数切线的斜率,横坐标就是每次迭代的参数,纵坐标是目标函数的取值.每次迭代的过程

『科学计算_理论』最大似然估计

概述 通俗来讲,最大似然估计,就是利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值. 重要的假设是所有采样满足独立同分布. 求解模型参数过程 假如我们有一组连续变量的采样值(x1,x2,-,xn),我们知道这组数据服从正态分布,标准差已知.请问这个正态分布的期望值为多少时,产生这个已有数据的概率最大? P(Data | M) = ? 根据公式 可得: 对μ求导可得 ,则最大似然估计的结果为μ=(x1+x2+-+xn)/n 由上可知最大似然估计的一般求解过程: (1) 写出似然函数

python科学计算

windows下python科学计算库的下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/(由于C运行库的问题,scipy在linux下可以用pip安装,而windows下不行) matpoltlib:绘图 numpy:矩阵运算 scipy:科学计算,高阶抽象和物理模型 sklearn:科学计算,多种聚类算法. 数据拟合:http://blog.csdn.net/lsldd/article/details/41251583 遗传算法:http://bl

『Python』Numpy学习指南第十章_高端科学计算库scipy入门(系列完结)

简介: scipy包包含致力于科学计算中常见问题的各个工具箱.它的不同子模块相应于不同的应用.像插值,积分,优化,图像处理,,特殊函数等等. scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱.scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作. 在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了.作为非专业程序员,科学家总是喜欢重新发明造轮子

聚类算法:凝聚层次聚类

凝聚层次聚类: 所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇.另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并.对于这里的"最接近",有下面三种定义.我在实现是使用了MIN,该方法在合并时,只要依次取当前最近的点对,如果这个点对当前不在一个簇中,将所在的两个簇合并就行: (1)单链(MIN):定义簇的邻近度为不同两个簇的两个最近的点之间的距离. (2)全链(MAX):定义簇的邻近度为不同两个簇的两个最远的点之间的距离. (3)组平均

聚类:层次聚类

假设有N个待聚类的样本,对于层次聚类来说,步骤:  1.(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度:        2.寻找各个类之间最近的两个类,把他们归为一类(这样类的总数就少了一个):        3.重新计算新生成的这个类与各个旧类之间的相似度:        4.重复2和3直到所有样本点都归为一类,结束 整个聚类过程其实是建立了一棵树,在建立的过程中,可以通过在第二步上设置一个阈值,当最近的两个类的距离大于这个阈值,则认为迭代可以终止.另外关键

机器学习之层次聚类

层次聚类 聚类是将样本进行归类形成K个簇,层次聚类是其中的一种方法.它将数据组成一棵聚类树,过程可以是凝聚形式或分裂形式. 核心思想 凝聚是一开始将每个样本当做一个聚类,接着通过计算将距离最近的两个聚类合并,成为新聚类,每次合并聚类总数减少一个,不断循环合并操作,直到所有聚类合并成一个聚类或当聚类数量到达某预定值或当聚类直接距离达到某阀值后停止合并.而分裂则与凝聚相反,一开始将所有样本当做一个聚类,每次分裂一个聚类,直到满足某条件. 算法步骤 计算n个样本两两之间的距离 构造n个簇 找到最近距离