julei3.py-20180824

本文介绍了一种结合TF-IDF和K-Means算法进行文本聚类的方法。首先利用TF-IDF提取文本特征,然后通过K-Means实现自动聚类。此外,还探讨了如何选择合适的K值,并展示了聚类结果。
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 18 11:01:41 2018

@author: wenyun.wxw
"""

# coding=utf-8  
""" 
Created on 2016-01-06 @author: Eastmount  
"""  
  
import time          
import re          
import os  
import sys
import codecs
import shutil
import numpy as np
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer 
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans 
import pandas as pd 
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

#if __name__ == "__main__":
    
#########################################################################
#                           第一步 计算TFIDF

#文档预料 空格连接
corpus = []

#读取预料 一行预料为一个文档
for line in open('分词结果.csv','r',encoding='ansi').readlines():
    #print(line)
    corpus.append(line.strip())
#print corpus
#time.sleep(1)

#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer()
 
#该类会统计每个词语的tf-idf权值
transformer = TfidfTransformer()
 
#第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
 
#获取词袋模型中的所有词语  
words = vectorizer.get_feature_names()
 
#将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()
#    from sklearn.feature_extraction import DictVectorizer
#    DV = DictVectorizer(sparse=False)
#    weight = DV.fit_transform(tfidf)
#    weight = tfidf

#    #打印特征向量文本内容
#    print('Features length: ' + str(len(words)))
#    resName = "分词结果2.csv"
#    result = codecs.open(resName, 'w', 'utf-8')
#    for j in range(len(words)):
#        result.write(words[j] + ' ')
#    result.write('\r\n\r\n')
# 
#    #打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
#    for i in range(len(weight)):
#       # print(u"-------这里输出第",i,u"类文本的词语tf-idf权重------")
#        for j in range(len(words)):
#            #print weight[i][j],
#            result.write(str(weight[i][j]) + ' ')
#        result.write('\r\n\r\n')
# 
#    result.close()
 
 
########################################################################
#                               第二步 聚类Kmeans   
#---------选K------------------
#手肘法:画sse与K的图,拐点处为最佳K
SSE = []  # 存放每次结果的误差平方和
#K的上限为20
kmax=20
for k in range(1,kmax):
    estimator = KMeans(n_clusters=k,init='k-means++')  # 构造聚类器
    estimator.fit(weight)
    SSE.append(estimator.inertia_)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(range(1,kmax),SSE,'o-')
plt.show()
#效果不好,看不出来拐点

#轮廓系数法,轮廓系数最大的k最佳
 
Scores = []  # 存放轮廓系数
for k in range(2,kmax):
    estimator = KMeans(n_clusters=k,init='k-means++')  # 构造聚类器
    estimator.fit(weight)
    Scores.append(silhouette_score(weight,estimator.labels_,metric='euclidean'))
plt.xlabel('k')
plt.ylabel('轮廓系数')
plt.plot(range(2,kmax),Scores,'o-')
plt.show()
#k=10时相对最大

#---------聚类------------------
#print('Start Kmeans:')
clf = KMeans(n_clusters=6,init='k-means++')
s = clf.fit(weight)
print(s)
 
#6个中心点
centers=clf.cluster_centers_


#分类结果:每个样本所属的簇
#print(clf.labels_)
label=clf.labels_

#    i = 1
#    while i <= len(clf.labels_):
#        print(i, clf.labels_[i-1])
#        i = i + 1

#Kmeans的sse
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print(clf.inertia_)

 
file = open('分类结果k=6.csv','w')
for i in list(range(len(label))):
    file.write(','.join((str(label[i]),str(ratecontent[i])))+'\n')
file.close()  

#把每类分开,k=1,2,...6
def divide(word,k):
    word_part=[]
    for i in range(len(label)):
        if label[i]==k:
            word_part.append(word[i])
    
    #合并所有词        
    wordall=[]
    for w in word_part:
        wordall.extend(w)
    
    #词频统计    
    wordcount= {} #字典
    for item in wordall:
      if item not in wordcount:
        wordcount[item] = 1
      else:
        wordcount[item] += 1

    #根据词频从高到低排序
    wordcount_sort=sorted(wordcount.items(),key=lambda item:item[1],reverse=True)
    
    #可视化词云   
    #按照词频决定字的大小,fit_words接受的参数为字典,注意必须为字典可以直接使用结巴分词带频率的结果
    wordcloud = WordCloud(background_color="white",font_path="file:///C:/windows/Fonts/MSYH.TTC",
               width=1000, height=860, margin=2).fit_words(wordcount)
    #perferences图片inline改为qt5
    plt.imshow(wordcloud) 
    plt.axis("off")
    plt.savefig('分类(k=6)-'+str(k)+'.png')
    
    file = open('词频统计_分类(k=6)'+str(k)+'.csv','w')
    for i in list(range(len(wordcount_sort))):
        file.write(','.join((wordcount_sort[i][0],str(wordcount_sort[i][1])))+'\n')
    file.close()
    
    return 0

for k in range(6):
    divide(word,k)
    

 

内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
### Java程序运行时找不到或无法加载主类的问题分析与解决方法 在Java程序运行时,如果出现“找不到或无法加载主类”的错误,通常是由以下几个原因引起的: 1. **类路径(Classpath)配置错误**:Java虚拟机无法找到指定的主类文件,可能是由于类路径设置不正确导致[^5]。 2. **主类名称拼写错误**:提供的主类名称可能与实际编译后的类名不一致,或者大小写错误[^5]。 3. **缺少`main`方法**:主类中必须包含一个符合规范的`public static void main(String[] args)`方法,否则无法作为入口点[^5]。 4. **打包问题**:如果使用Maven或Gradle构建项目,可能是因为未正确配置插件,导致生成的JAR文件中缺少`Main-Class`属性[^1]。 以下是针对上述问题的具体解决方法: #### 1. 检查类路径配置 确保在运行程序时,类路径中包含编译后的`.class`文件所在的目录。例如: ```bash java -cp ./target/classes com.seelink.julei.ShopApplication ``` 如果使用的是外部库,请确保所有依赖的JAR文件也包含在类路径中。可以使用以下命令: ```bash java -cp ./target/classes:./lib/* com.seelink.julei.ShopApplication ``` #### 2. 验证主类名称 检查`ShopApplication`类是否位于`com.seelink.julei`包下,并且类名的大小写完全匹配。如果类名不匹配或包路径错误,都会导致此问题[^5]。 #### 3. 确保主类中有`main`方法 打开`ShopApplication.java`文件,确认其包含以下方法签名: ```java public static void main(String[] args) { // 程序入口逻辑 } ``` #### 4. 修改Maven配置以正确打包 如果项目是基于Maven构建的,需要确保`spring-boot-maven-plugin`插件已正确配置。根据引用内容,可以在`pom.xml`中添加以下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.seelink.julei.ShopApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 然后重新执行以下命令以生成包含`Main-Class`属性的JAR文件: ```bash mvn clean package ``` #### 5. 检查MANIFEST.MF文件 运行`jar tf target/*.jar`命令,查看JAR文件中的`META-INF/MANIFEST.MF`文件是否包含以下内容: ``` Main-Class: com.seelink.julei.ShopApplication ``` 如果没有,请检查Maven插件配置是否正确。 ### 示例代码 以下是一个完整的Spring Boot项目的`pom.xml`片段: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.0</version> <configuration> <mainClass>com.seelink.julei.ShopApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值