day07课件代码(下)

04-sklearn算法实现聚类

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


def build_data():
    """
    加载数据
    :return:data
    """
    # 加载.txt文件
    # python ---with open
    # numpy ----loadtxt ---数组类型的txt
    # pandas ---read_table
    data = np.loadtxt('./test.txt', delimiter='\t')
    # 将数组转化为矩阵
    data = np.mat(data)
    print('data:\n', data)
    print('data:\n', type(data))

    return data


def show_res(data, y_predict, center):
    """
    结果展示
    :param data: data
    :param y_predict:样本所属类别
    :param center:聚类中心
    :return:
    """
    # 1、创建画布
    plt.figure()
    # 修改RC参数,让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC参数,让其支持负号
    plt.rcParams['axes.unicode_minus'] = False
    # 构建颜色列表
    c_list = ['r', 'g', 'y', 'pink']
    # 构建点的形状列表
    marker_list = ['*', 'o', 'd', 'D']
    # 2、绘图 ---散点图
    for i in range(data.shape[0]):
        plt.scatter(data[i, 0], data[i, 1], c=c_list[y_predict[i]], marker=marker_list[y_predict[i]])

    # 绘制聚类中心
    plt.plot(center[:, 0], center[:, 1], 'bX', markersize=12)
    # 增加title
    plt.title('聚类结果展示')
    # 保存图片
    plt.savefig('./聚类结果展示_sklearn.png')
    # 3、图形展示
    plt.show()


def main():
    """
    主函数
    :return: None
    """
    # 加载数据
    data = build_data()
    # 调用sklearn实现k_means
    # 确定聚类的类别数目
    k = 4
    # (1)实例化算法对象
    km = KMeans(n_clusters=k)
    # (2)训练数据并构建模型
    km.fit(data)
    # (3)进行预测
    y_predict = km.predict(data)

    # 获取聚类中心
    center = km.cluster_centers_

    print('y_predict:\n', y_predict)
    print('center :\n', center)

    show_res(data, y_predict, center)


if __name__ == '__main__':
    main()

05-案例:NBA球员聚类分析.py

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt


def build_data():
    """
    构建数据
    :return:
    """
    nba_data = pd.read_excel("./nba_data.xlsx")

    return nba_data


def box_analysis(data):
    """
    箱线图分析法提出异常值
    :param data: series
    :return: bool_index
    """
    # 确定上四分位数
    qu = data.quantile(q=0.75)
    # 确定下四分位数
    ql = data.quantile(q=0.25)
    # 确定分位数间距
    iqr = qu - ql
    # 确定上限
    up = qu + 1.5 * iqr
    # 确定下限
    low = ql - 1.5 * iqr

    #
    bool_index = (low <= data) & (data <= up)

    return bool_index


def stand_sca(data):
    """
    标准差标准化数据
    :param data: df或者series
    :return: 标准化之后的数据
    """
    data = (data - data.mean()) / data.std()

    return data


def k_means(nba_data, k):
    """
    k_means聚类
    :param nba_data:数据
    :param k: 聚类的类别
    :return: y_predict,center
    """
    # 1、实例化算法对象
    km = KMeans(n_clusters=k)
    # 2、训练数据并构建模型
    km.fit(nba_data)
    # 3、预测
    y_predict = km.predict(nba_data)

    # 获取聚类中心
    center = km.cluster_centers_

    return y_predict, center


def deal_data(nba_data):
    """
    数据处理
    :param nba_data:需要处理的数据
    :return: 数据处理之后的nba_data
    """
    # 2、筛选出需要的特征
    nba_data = nba_data.loc[:, ['时间', '助攻', '得分']]
    # print('nba_data:\n', nba_data)
    # print('*' * 100)
    # 3、检测与处理缺失值
    # res_null = pd.isnull(nba_data).sum()
    # print('缺失值检测结果:\n', res_null)
    # print('*' * 100)

    # 存在 ' '这样特殊字符的缺失值
    nba_data.replace(' ', np.nan, inplace=True)
    # 检测缺失值
    # res_null = pd.isnull(nba_data).sum()
    # print('缺失值检测结果:\n', res_null)
    # 处理缺失值---使用邻居来进行填充
    nba_data.loc[:, '时间'].fillna(method='pad', inplace=True)

    print('*' * 100)
    # 检测缺失值
    # res_null = pd.isnull(nba_data).sum()
    # print('缺失值检测结果:\n', res_null)

    # 获取每一列的元素数据类型
    res_dtypes = nba_data.dtypes
    # print('数据类型:\n', res_dtypes)

    # 将时间列转化为float64类型
    nba_data.loc[:, '时间'] = nba_data.loc[:, '时间'].astype(np.float64)

    # 获取每一列的元素数据类型
    res_dtypes = nba_data.dtypes
    # print('数据类型:\n', res_dtypes)

    # 4、剔除异常值
    bool_index_sj = box_analysis(nba_data.loc[:, '时间'])
    nba_data = nba_data.loc[bool_index_sj, :]

    bool_index_df = box_analysis(nba_data.loc[:, '得分'])
    nba_data = nba_data.loc[bool_index_df, :]

    bool_index_zg = box_analysis(nba_data.loc[:, '助攻'])
    nba_data = nba_data.loc[bool_index_zg, :]

    # print('异常值剔除之后的结果:\n', nba_data)
    # print('*' * 100)

    # 进行构建最终特征
    nba_data.loc[:, '得分/分钟'] = nba_data.loc[:, '得分'] / nba_data.loc[:, '时间']
    nba_data.loc[:, '助攻/分钟'] = nba_data.loc[:, '助攻'] / nba_data.loc[:, '时间']

    nba_data = nba_data.loc[:, ['得分/分钟', '助攻/分钟']]

    # print('构建好特征之后的结果:\n', nba_data)

    # 5、标准化处理
    # for column in nba_data.columns:
    #     nba_data.loc[:, column] = stand_sca(nba_data.loc[:, column])

    return nba_data


def show_res(data, y_predict, center):
    """
    结果展示
    :param data: data
    :param y_predict:样本所属类别
    :param center:聚类中心
    :return:
    """
    # 1、创建画布
    plt.figure()
    # 修改RC参数,让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC参数,让其支持负号
    plt.rcParams['axes.unicode_minus'] = False
    # 构建颜色列表
    c_list = ['r', 'g', 'y', 'pink', 'black']
    # 构建点的形状列表
    marker_list = ['*', 'o', 'd', 'D', 'v']
    # 2、绘图 ---散点图
    for i in range(data.shape[0]):
        plt.scatter(data[i, 0], data[i, 1], c=c_list[y_predict[i]], marker=marker_list[y_predict[i]])

    # 绘制聚类中心
    plt.plot(center[:, 0], center[:, 1], 'bX', markersize=12)
    # 增加title
    plt.title('NBA球员聚类结果展示')
    # 保存图片
    plt.savefig('./NBA球员聚类结果展示.png')
    # 3、图形展示
    plt.show()


def main():
    """
    主函数
    :return:
    """
    # 1、加载数据
    nba_data = build_data()
    # print('nba_data:\n', nba_data)
    # print('nba_data:\n', nba_data.columns)

    nba_data = deal_data(nba_data)
    print('nba_data:\n', nba_data)
    # 6、k-means聚类
    # (1)实例化算法对象 (2)训练数据并构建模型  (3)进行预测
    # 确定聚类类别
    k = 5
    y_predict, center = k_means(nba_data, k)
    # 7、结果展示
    show_res(nba_data.values, y_predict, center)

    # 8、输出结论

if __name__ == '__main__':
    main()

# 1、加载数据
# 2、数据处理
# 3、构建算法模型、并进行预测
# 4、结果展示
# 5、输出结论


发布了132 篇原创文章 · 获赞 24 · 访问量 5186

猜你喜欢

转载自blog.csdn.net/return_min/article/details/103988969
今日推荐