python 聚类 均值聚类 层次聚类

K均值聚类

数据

|国别 森林覆盖率(%) 林木蓄积量(亿立方米) 草原面积(万公顷)
中国 12.5 93.5 31908
美国 30.4 202 23754
日本 67.2 24.8 58
德国 28.4 14 599
英国 8.6 1.5 1147
法国 26.7 16 1288
意大利 21.1 3.6 514
加拿大 32.7 192.8 2385
澳大利亚 13.9 10.5 45190
前苏联 41.1 841.5 37370
捷克 35.8 8.9 168
波兰 27.8 11.4 405
匈牙利 17.4 2.5 129
南斯拉夫 36.3 11.4 640
罗马尼亚 26.7 11.3 447
保加利亚 34.7 2.5 200
印度 20.5 29 1200
印尼 84 33.7 1200
尼日利亚 16.1 0.8 2090
墨西哥 24.6 32.6 7450
巴西 67.6 238 15900

 import  numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import preprocessing as pp
import matplotlib.pyplot as plt
#  防止乱码
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体
plt.rcParams["axes.unicode_minus"] = False

# 读取文件
data = pd.read_excel("data.xlsx")
a = data.iloc[:, 1:]
a.columns = ['covery_persentage', 'storage', 'square']
a = a.values  # 转化为nparray
print(a)
## 簇内利差和拐点法
# 确定最佳簇 cluster     即 在不同的k值下计算利差和  通过可视化找到拐点
TSSE = []
k = 10
for i in range(1, k+1):
    SSE = []
    md = KMeans(n_clusters=i)
    md.fit(a)
    labels = md.labels_
    centers = md.cluster_centers_
    for label in set(labels)    :
        SSE.append(np.sum((a[labels == label, :] - centers[label, :])**2))  # 离差平方和运输
    TSSE.append(np.sum(SSE))
plt.plot(range(1, k+1), TSSE, )
plt.show()  # 根据图像 取簇为4


md =KMeans(n_clusters=4)
md.fit(a) # 求解模型
labels = md.labels_ +1   # 提取聚类标签 [2 3 1 1 1 1 1 1 4 2 1 1 1 1 1 1 1 1 1 1 3]
centers = md.cluster_centers_  # 提取聚类中心,每一行是一个聚类中心
print(labels, '\n', centers)
## 层次聚类
```python
import pandas as pd
from sklearn import preprocessing as pp
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体
plt.rcParams["axes.unicode_minus"] = False

data = pd.read_excel("data.xlsx")
a = data.iloc[:, 1:].values
# print(data.iloc[:, 1:])
b = pp.minmax_scale(a)  # 数据规格化 x-min/ max-min  每一列的min'  max
d = sch.distance.pdist(b) # 求对象之间两两距离向量
dd = sch.distance.squareform(d) # 转化为矩阵格式
z = sch.linkage(d) # 生成聚类树
# print(z)
s = [str(i+1) for i in range(21)]
plt.rc('font', size=16)
sch.dendrogram(z, labels= data.iloc[:, 0].values)
plt.show()

![在这里插入图片描述](https://img-blog.csdnimg.cn/84fdbac2fab149308bdbc47f4668d51d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-R546w5paH5YyWZnU=,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1规格化变换 每个指标的最大值最小值 数据减去min除以极差
2. 标准化变换 每个数据减去该行的均值除以该行的 标准差

样本间亲疏程度的测距计算
绝对值距离 样本对应的bij相减再相加取绝对值 Minkowski
欧氏距离 平方相加开根号
切比雪夫距离
马氏距离 mahalanobis

相关系数 ,由标准化矩阵计算的相关系数
夹角余弦和 皮尔逊相关系数

scipy.cluster.hierarchy模块的层次聚类
sch.distance.pdist(A, 生成两两间的距离
Z=sch.linkage( 包含聚类树信息的(n-1)/4 矩阵 # 生成聚类树 第一二列 两两连接生成一个新类的对象
第三列为两两对象之间的连接距离 第四列为当前列中初始对象的个数
T = fcluster(Z, t)利用z,给定阀值创建聚类
H = dendrogram(z, p) 根据数据矩阵z画出聚类树状图, p为节点个数


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值