失踪人口回归
前言
最近学的内容主要是Python,内容比较杂:numpy,pandas,PyQt,数据挖掘等等,正好找个机会写个小项目练练手。
先上效果图,(项目链接在文章最后):
提示:以下是本篇文章正文内容
一、关于KMeans聚类以及KMeans++的原理?
网上介绍这个最最基本的聚类方法的教程和视频等实在太多了,不便啰嗦。
推荐两个:
1、【机器学习】K-means(非常详细)这篇文章偏数学逻辑,建议反复阅读
2、什么是 K-Means(K均值聚类)?【知多少】这是个视频,简单易懂地理解KMeans的原理
二、核心内容
1、数据集介绍
链接:https://pan.baidu.com/s/1Se-RrBko7v-UdMvTK_I77g
提取码:ygtl
特征量有十维,target为聚类目标量,可用来后期校验结果正确性
2、核心代码
import numpy as np
import pandas as pd
import random
# 读取数据
read_df = pd.read_csv('text_datas.csv')
target = read_df.iloc[:, -1]
data = read_df.iloc[:, 1:-1]
k = 7
n = data.shape[0]
dis = np.zeros([n, k + 1])
# 随机选取中心
center = np.array([data.iloc[random.randint(0, n - 1), :]])
while center.shape[0] <= k - 1:
temp_dis = np.zeros([n, center.shape[0]])
# 求样本点到聚类中心点的距离
for i in range(center.shape[0]):
temp_dis[::, i] = ((data - center[i]) ** 2).sum(axis=1)
# 计算其和最近的一个“种子点”的距离
D = np.min(temp_dis, axis=1)
# 把这些距离加起来,取一个能落在其中的随机值R
R = random.uniform(0, D.sum())
for i in range(D.shape[0]):
R -= D[i]
if R <= 0:
break
# 此时的点就是下一个“种子点”
center = np.append(center, np.array([data.iloc[i, :]]), axis = 0)
iter_ = 500
while iter_ > 0:
# 求样本点到聚类中心点的距离
for i in range(center.shape[0]):
dis[::, i] = ((data - center[i]) ** 2).sum(axis=1)
# 归类
dis[:, -1] = np.argmin(dis[:, :-1], axis=1)
# 求新的聚类中心
new_center = np.zeros_like(center)
for j in range(k):
new_center[j, :] = data.values[dis[:, -1] == j, :].mean(axis=0)
# 如果点簇不再变动
if (center==new_center).all():
break
center = new_center
iter_ -= 1
print('循环{}次'.format(500-iter_))
#pca降维
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newData = pca.fit_transform(data)
newData = pd.DataFrame(newData)
# 可视化
import matplotlib.pyplot as plt
x = np.array(newData.iloc[:, 0])
y = np.array(newData.iloc[:, 1])
# 原数据
plt.subplot(2,1,1)
plt.scatter(x, y, c=np.array(target))
# 预测数据
plt.subplot(2,1,2)
plt.scatter(x, y, c=dis[:, -1])
plt.show()
运行结果截图:
3、完整项目
对核心代码做“亿点点”的改造和包装之后就做成了文章开头的样子,截图如下:
项目完整代码下载链接:
结语
创作不易,如果您觉得写得还行,还请点赞、评论、收藏走一波。