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、输出结论
return_min
发布了131 篇原创文章 · 获赞 24 · 访问量 4847
私信
关注