# 无监督学习: 聚类,将无标记的样本进行分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.cluster import KMeans
import pandas as pd
#--数据准备
import tushare as ts
data=ts.get_hist_data('601518',start='2017-010-26',end='2018-06-22',ktype='D')
datay=pd.DataFrame(columns=['滞后两天','滞后一天','当天涨跌情况'],index=range(len(data)-2))
for i in range(2,len(data)):
datay.iloc[i-2,0]=data.iloc[i-2,6]
datay.iloc[i-2,1]=data.iloc[i-1,6]
if data.iloc[i,6]>0:
datay.iloc[i-2,2]=1
else:
datay.iloc[i-2,2]=0
x=np.array(np.array(datay.iloc[:,[0,1]]).tolist())
#------------------可视化数据情况
plt.figure()
plt.scatter(x[:,0],x[:,1],marker='o',facecolors='yellow',edgecolors='k',s=20)
x_min,x_max=min(x[:,0])-1,max(x[:,0])+1
y_min,y_max=min(x[:,1])-1,max(x[:,1])+1
plt.title('Input Data')
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
#-----初始化一个 k-means 对象,并利用数据训练
kmeans=KMeans(init='k-means++',n_clusters=4,n_init=10)# 这里设置划分为4个类别
kmeans.fit(x)
#------ 测试出可视化边界(生成网格点坐标数据)
step_size=0.01
x_values,y_values=np.meshgrid(np.arange(x_min,x_max,step_size),np.arange(y_min,y_max,step_size))
yhat=kmeans.predict(np.c_[x_values.ravel(),y_values.ravel()])
#------ 网格数据评估了点的标记结果,画图看分布
yhat=yhat.reshape(x_values.shape)
plt.figure()
plt.clf()
plt.imshow(yhat,interpolation='nearest',extent=(x_values.min(),x_values.max(),y_values.min(),y_values.max()),cmap=plt.cm.Paired,aspect='auto',origin='lower')
plt.scatter(x[:,0],x[:,1],marker='o',facecolor='none',edgecolors='k',s=30)
得到将样本划分为4中类别的图,并且网格点数据预测分类情况如上图
#----- 四种类别的中心点画出来
cent=kmeans.cluster_centers_# 获得训练后模型四类中心点位置坐标
plt.scatter(cent[:,0],cent[:,1],marker='o',s=100,linewidths=3,color='k',zorder=10,facecolors='r')
plt.title('Centoids and boundaries obtaned using KMeans')
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.show()
图中红色点的位置即为四中类别的 中心点位置
至此将二维平面的所有点都可以划分到四中类别中去。
领取专属 10元无门槛券
私享最新 技术干货