金融数据分析与挖掘实战5.6-5.7

这篇博客介绍了支持向量机(SVM)在汽车评价数据上的应用,通过选取6个特征变量,构建SVM分类模型,训练集准确率为70.27%。同时,展示了自定义K均值聚类算法的过程,通过聚类分析了农村居民人均可支配收入数据。
摘要由CSDN通过智能技术生成
# 5.6 支持向量机
#汽车评价数据,6个特征变量,1个分类标签,共1728条记录
#要求取1690条记录作为训练集,余下的作为测试集,计算预测准确率
import numpy as np
import pandas as pd
import os
os.chdir("C:\\Users\\Administrator\\Desktop")  #更改工作路径,注意双\\ 任何操作前可以先将常用包和路径先设置好
# 1.读取数据
data = pd.read_excel("car.xlsx")
datah = data.head(6)  # 展示前6行
print(datah)   
   a1  a2  a3  a4  a5  a6  d
0   4   4   2   2   3   2  3
1   4   4   2   2   3   3  3
2   4   4   2   2   3   1  3
3   4   4   2   2   2   2  3
4   4   4   2   2   2   3  3
5   4   4   2   2   2   1  3
# 2. 变量选择(因变量和自变量)与数据集划分(训练集和测试集)
x = data.iloc[:1690,:6].values # 训练集自变量
y = data.iloc[:1690,6].values  # 训练集因变量
x1= data.iloc[1691:,:6].values # 测试集自变量
y1= data.iloc[1691:,6].values  # 测试集因变量
# 3.支持向量机分类模型构建
# 导入支持向量机的模块
from sklearn import svm
# 创建支持向量机分类器
clf = svm.SVC(kernel='rbf')  # 核函数的选择,linear 、poly、rbf、sigmoid分别表示线性、多项式、高斯、s核函数
# 用fit来拟合数据
clf.fit(x, y) 
# 考查模型的训练效果
rv=clf.score(x, y)  # 训练集的准确率
# 用训练集学习到的规律应用到测试集上进行预测
R=clf.predict(x1)
# 计算预测值与真实值之间的偏差
Z=R - y1
# 计算预测正确的比例
Rs=len(Z[Z==0])/len(Z)
# 输出预测结果及准确率
print('预测结果为:',R)
print('预测准确率为:',Rs)
预测结果为: [4 3 1 1 3 1 4 3 1 4 3 3 3 3 3 3 3 3 3 3 3 1 3 1 4 3 1 4 3 3 1 3 1 4 3 1 4]
预测准确率为: 0.7027027027027027
# 5.7 K均值聚类
# K表示类别数,选取K个初始类中心,计算每个样本到每个类中心的距离,样本离哪个类别最近就聚到这一类
# 然后重新计算每个类的中心,重新将每个样本按照距离最近原则再进行归类
# 重复上述过程,一直到类别不发生变化为止
# 定义K均值聚类的函数
def K_mean(data,knum):
    #输入:data--聚类特征数据集,要求为数据结构要求为numpy数值数组
    #输入:knum--聚类个数
    #返回值,data后面加一列类别,显示类别
    import pandas as pd
    import numpy as np
    p=len(data[0,:])                  #聚类数据维度
    cluscenter=np.zeros((knum,p))     #定预定义元素为全0的初始聚类中心
    lastcluscenter=np.zeros((knum,p)) #定预定义元素为全0的旧聚类中心
    #初始聚类中心和旧聚类中心初始化,取数据的前knum行作为初始值
    for i in range(knum):
      cluscenter[i,:]=data[i,:]
      lastcluscenter[i,:]=data[i,:]
    #预定义聚类类别一维数组,用于存放每次计算样本的所属类别
    clusindex=np.zeros((len(data)))
    while 1:
        for i in range(len(data)):
              #计算第i个样本到各个聚类中心的欧式距离
              #预定义sumsquare,用于存放第i个样本到各个聚类中心的欧式距离
              sumsquare=np.zeros((knum))
              for k in range(knum):
                  sumsquare[k]=sum((data[i,:]-cluscenter[k,:])**2)
              sumsquare=np.sqrt(sumsquare)
              #第i个样本到各个聚类中心的欧式距离进行升序排序
              s=pd.Series(sumsquare).sort_values()
              #判断第i个样本的类归属(距离最小,即s序列中第0个位置的index)
              clusindex[i]=s.index[0]
        #将聚类结果添加到聚类数据最后一列
        clusdata=np.hstack((data,clusindex.reshape((len(data),1))))
        #更新聚类中心,新的聚类中心为对应类别样本特征的均值
        for i in range(knum):
              cluscenter[i,:]=np.mean(clusdata[clusdata[:,p]==i,:-1],0).reshape(1,p)
        #新的聚类中心与旧的聚类中心相减
        t=abs(lastcluscenter-cluscenter)
        #如果新的聚类中心与旧的聚类中心一致,即聚类中心不发生变化,
#返回聚类结果,并退出循环
        if sum(sum(t))==0:    
            return clusdata
            break
        #如果更新的聚类中心与旧的聚类中心不一致,
#将更新的聚类中心赋给旧的聚类中心,进入下一次循环
        else:
            for k in range(knum):
                lastcluscenter[k,:]=cluscenter[k,:]  

# 调用函数进行运算
D=pd.read_excel('D.xlsx',header=None)
D=D.values
r=K_mean(D,2)
x0=r[r[:,2]==0,0]
y0=r[r[:,2]==0,1]
x1=r[r[:,2]==1,0]
y1=r[r[:,2]==1,1]
import matplotlib.pyplot as plt
plt.plot(x0,y0,'r*')  
plt.plot(x1,y1,'bo')  
[<matplotlib.lines.Line2D at 0x23d6cf71760>]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwWjOiyA-1651217914699)(output_5_1.png)]

# 上述例子是自己写K均值聚类函数,并调用。Python中本身包含K均值聚类模块,可直接运用
# 案例:利用31个地区农村居民人均可支配收入进行聚类分析
data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx') # 读取数据
X=data.iloc[:,1:]    # 选择聚类变量
from sklearn.preprocessing import StandardScaler   #导入标准化的包
scaler = StandardScaler()
scaler.fit(X) 
X=scaler.transform(X)    # 数据标准化处理
from sklearn.cluster import KMeans   # 导入K均值聚类包
model = KMeans(n_clusters = 4, random_state=0, max_iter = 500) # 参数分别表示聚类数,初始状态,最大迭代次数
model.fit(X) 
c=model.labels_  # 获取对象中的label属性
Fs=pd.Series(c,index=data['地区'])
Fs=Fs.sort_values(ascending=True)  # 按聚类数升序排列
print(Fs)
地区
新疆     0
云南     0
山东     0
西藏     0
福建     0
黑龙江    0
海南     0
辽宁     0
内蒙古    0
河北     0
吉林     0
浙江     1
天津     1
江苏     1
甘肃     2
重庆     2
陕西     2
青海     2
贵州     2
四川     2
河南     2
广东     2
湖南     2
湖北     2
宁夏     2
江西     2
安徽     2
山西     2
广西     2
上海     3
北京     3
dtype: int32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈伦2019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值