聚类分析代码总结

Posted ziseweilai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类分析代码总结相关的知识,希望对你有一定的参考价值。

代码

1.自创数据集进行聚类

import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabaz_score


# 创建数据集
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本4个特征,共4个簇,
# 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2, 0.2]
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)

# 数据集可视化
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X)
# 分别尝试n_cluses=234,然后查看聚类效果
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

# 用Calinski-Harabasz Index评估的聚类分数
print(calinski_harabaz_score(X, y_pred))
  1. 相关系数
  • 皮尔逊相关系数
from scipy.stats import pearsonr


x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]

print(pearsonr(x1, x2))
  • 斯皮尔曼相关系数
from scipy.stats import spearmanr


x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]

print(spearmanr(x1, x2))
  1. PCA代码
from sklearn.decomposition import PCA


def pca_demo():
    """
    对数据进行PCA降维
    :return: None
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]

    # 1、实例化PCA, 小数-保留多少信息
    transfer = PCA(n_components=0.9)
    # 2、调用fit_transform
    data1 = transfer.fit_transform(data)

    print("保留90%的信息,降维结果为:
", data1)

    # 1、实例化PCA, 整数——指定降维到的维数
    transfer2 = PCA(n_components=3)
    # 2、调用fit_transform
    data2 = transfer2.fit_transform(data)
    print("降维到3维的结果:
", data2)

    return None


if __name__ == '__main__':
    pca_demo()
  1. example-探究用户对物品类别的喜好细分降维
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score


# 1.获取数据
order_product = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 2 数据基本处理
table1 = pd.merge(order_product, products, on=["product_id", "product_id"])
table2 = pd.merge(table1, orders, on=["order_id", "order_id"])
table = pd.merge(table2, aisles, on=["aisle_id", "aisle_id"])

table = pd.crosstab(table["user_id"], table["aisle"])

table = table[:1000]

# 3.特征工程
transfer = PCA(n_components=0.9)
data = transfer.fit_transform(table)

# 实例化K-means
estimator = KMeans(n_clusters=8, random_state=22)
y_predict = estimator.fit_predict(data)

# 模型评估
print(silhouette_score(data, y_predict))
相关数据集联系邮箱yawei_sia@yeah.net获取

特殊知识点

  • K-means聚类步骤
    • 随机设置K个特征空间内的点作为初始的聚类中心
    • 2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
    • 3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
    • 4、如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程
  • “肘”方法 (Elbow method) — K值确定

    1. 对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和;
    2. 平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。
    3. 在这个平方和变化过程中,会出现一个拐点也即“肘”点,下降率突然变缓时即认为是最佳的k值

      • 在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。
  • k-means算法小结
    • 优点:
      1.原理简单(靠近中心点),实现容易
      2.聚类效果中上(依赖K的选择)
      3.空间复杂度o((N)),时间复杂度o((IKN)) ((N)为样本点个数,(K)为中心点个数,(I)为迭代次数).
    • 缺点:
      1.对离群点,噪声敏感 (中心点易偏移)
      2.很难发现大小差别很大的簇及进行增量计算
      3.结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)
  • 优化算法总结

优化方法 思路
Canopy+kmeans Canopy粗聚类配合kmeans
kmeans++ 距离越远越容易成为新的质心
二分k-means 拆除SSE最大的簇
k-medoids 和kmeans选取中心点的方式不同
kernel kmeans 映射到高维空间
ISODATA 动态聚类
Mini-batch K-Means 大数据集分批聚类

有关数据文件,请联系邮箱:yqwei_sia@yeah.net

以上是关于聚类分析代码总结的主要内容,如果未能解决你的问题,请参考以下文章

吴恩达《机器学习》课程总结(13)聚类

吴恩达《机器学习》课程总结(13)_聚类

《Python机器学习及实践》----无监督学习之数据聚类

《Python机器学习及实践》----无监督学习之数据聚类

数据挖掘——聚类分析总结

聚类算法总结以及python代码实现