|
|
|
|
@ -23,7 +23,7 @@
|
|
|
|
|
</div>
|
|
|
|
|
<div class="metrics">
|
|
|
|
|
<el-select v-model="input" placeholder="请选择" style="width: 180px" @change="optionData">
|
|
|
|
|
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
|
<el-option v-for="item in algorithmStore.userDataLabel" :key="item" :label="item" :value="item" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="metrics-table" style="margin-top: 10px">
|
|
|
|
|
@ -74,7 +74,6 @@
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-scrollbar>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<div class="main-right">
|
|
|
|
|
<el-scrollbar height="500px" ref="scrollbar" style="padding: 20px">
|
|
|
|
|
@ -156,10 +155,11 @@
|
|
|
|
|
<br />
|
|
|
|
|
聚类分析是一种探索性分析方法,与判别分析不同,聚类分析事先并不知道分类的标准,甚至不知道应该分成几类,而是会根据样本数据的特征,自动进行分类。
|
|
|
|
|
</p>
|
|
|
|
|
<img src="@/assets/images/f1001.png" style="width: 600px;height: 400px;"/>
|
|
|
|
|
<img src="@/assets/images/f1001.png" style="width: 600px; height: 400px" />
|
|
|
|
|
<p>聚类与分类的不同在于,聚类所要求划分的类是未知的</p>
|
|
|
|
|
<img src="@/assets/images/f1002.png" style="width: 600px;height: 300px;"/><br />
|
|
|
|
|
<img src="@/assets/images/f1003.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f1002.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f1003.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<!-- <img src="@/assets/images/f1005.png" style="width: 1100px;height: 400px;"/> -->
|
|
|
|
|
<li style="font-size: 18px">从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。</li>
|
|
|
|
|
<li style="font-size: 18px">从机器学习的角度看,簇相当于隐藏模式。聚类是搜索簇的无监督学习过程。</li>
|
|
|
|
|
@ -172,14 +172,14 @@
|
|
|
|
|
<br />
|
|
|
|
|
一般的规则:
|
|
|
|
|
</p>
|
|
|
|
|
<img src="@/assets/images/f10010.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f10010.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f10011.png" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f10012.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f10012.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<p style="font-weight: 700; font-size: 22px">聚类方法及其在SPSS中的实现</p>
|
|
|
|
|
<p style="font-size: 19px">1.主要的聚类方法:</p>
|
|
|
|
|
<img src="@/assets/images/f10013.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f10013.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<p style="font-size: 19px">2.方法详解:</p>
|
|
|
|
|
<p style="font-size: 17px">(1):K-means聚类</p>
|
|
|
|
|
<p>
|
|
|
|
|
@ -187,13 +187,15 @@
|
|
|
|
|
<br />
|
|
|
|
|
具体步骤如下:
|
|
|
|
|
</p>
|
|
|
|
|
<img src="@/assets/images/f10014.png" style="width: 600px;height: 300px;"/><br />
|
|
|
|
|
<img src="@/assets/images/f10015.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f10014.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f10015.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<p>距离计算规则(欧几里得距离公式):</p>
|
|
|
|
|
<img src="@/assets/images/f10016.png" />
|
|
|
|
|
<p>图解:</p>
|
|
|
|
|
<img src="@/assets/images/f10017.png" style="width: 600px;height: 300px;"/><br />
|
|
|
|
|
<img src="@/assets/images/f10018.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f10017.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f10018.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<p>
|
|
|
|
|
K-means的优缺点:
|
|
|
|
|
<br />
|
|
|
|
|
@ -217,17 +219,19 @@
|
|
|
|
|
<br />
|
|
|
|
|
通过查询整理出了2018年我国各省份的20项基本情况,根据这些指标把这31个省市或地区分成3类。
|
|
|
|
|
</p>
|
|
|
|
|
<img src="@/assets/images/f10019.png" style="width: 600px;height: 300px;"/>
|
|
|
|
|
<img src="@/assets/images/f10019.png" style="width: 600px; height: 300px" />
|
|
|
|
|
<p>分析步骤:分析>>分类>>K-均值聚类>>迭代>>次数>>选项>>勾选统计>>确认</p>
|
|
|
|
|
<img src="@/assets/images/f10020.png" style="width: 600px;height: 400px;"/><br />
|
|
|
|
|
<img src="@/assets/images/f10021.png" style="width: 600px;"/>
|
|
|
|
|
<img src="@/assets/images/f10020.png" style="width: 600px; height: 400px" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f10021.png" style="width: 600px" />
|
|
|
|
|
<p>结果分析:</p>
|
|
|
|
|
<img src="@/assets/images/f10022.png" /><br />
|
|
|
|
|
<img src="@/assets/images/f10022.png" />
|
|
|
|
|
<br />
|
|
|
|
|
<img src="@/assets/images/f10023.png" />
|
|
|
|
|
<p>若不收敛则调大迭代次数</p>
|
|
|
|
|
<img src="@/assets/images/f10024.png" />
|
|
|
|
|
<p>方差分析表:</p>
|
|
|
|
|
<img src="@/assets/images/f10025.png" style="width: 600px;height: 400px;"/>
|
|
|
|
|
<img src="@/assets/images/f10025.png" style="width: 600px; height: 400px" />
|
|
|
|
|
<p>其中聚类均方对应组间均方差,误差均方对应组内均方差,显著性p<0.05时说明此变量分类效果好。由表可知,大部分变量的p<0.05,且组间均方差大于组内均方差,说明各变量在三个类别中的差异大,分类结果可信度高。</p>
|
|
|
|
|
<img src="@/assets/images/f10026.png" />
|
|
|
|
|
<br />
|
|
|
|
|
@ -273,6 +277,8 @@
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import * as portraitModel from "@/api/portraitModel";
|
|
|
|
|
import useAlgorithmStore from "@/store/modules/algorithm.js";
|
|
|
|
|
const algorithmStore = useAlgorithmStore();
|
|
|
|
|
import popModel from "@/views/components/popModal.vue";
|
|
|
|
|
import { htmlPdf } from "@/utils/pdf.js";
|
|
|
|
|
import * as echarts from "echarts";
|
|
|
|
|
@ -281,9 +287,9 @@ import JSZip from "jszip";
|
|
|
|
|
import * as API from "@/api/AI.js";
|
|
|
|
|
import { getUserInfo } from "@/utils/auth";
|
|
|
|
|
import { onMounted, reactive } from "vue";
|
|
|
|
|
const loading1=ref(false)
|
|
|
|
|
const loading2=ref(false)
|
|
|
|
|
const loading3=ref(false)
|
|
|
|
|
const loading1 = ref(false);
|
|
|
|
|
const loading2 = ref(false);
|
|
|
|
|
const loading3 = ref(false);
|
|
|
|
|
const runResultShow = ref(false);
|
|
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
|
|
const dialogVisible = ref(false);
|
|
|
|
|
@ -297,18 +303,18 @@ const formInline2 = reactive({
|
|
|
|
|
value5: "",
|
|
|
|
|
});
|
|
|
|
|
const task = () => {
|
|
|
|
|
let errorNumber=0
|
|
|
|
|
let errorNumber = 0;
|
|
|
|
|
for (let key in formInline2) {
|
|
|
|
|
if (formInline2[key] == "") {
|
|
|
|
|
proxy.$modal.msgError("请填写完整!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(formInline2.value1!=='3'){
|
|
|
|
|
errorNumber=1
|
|
|
|
|
if (formInline2.value1 !== "3") {
|
|
|
|
|
errorNumber = 1;
|
|
|
|
|
}
|
|
|
|
|
if (formInline2.value2 !== input6.value) {
|
|
|
|
|
errorNumber=1
|
|
|
|
|
errorNumber = 1;
|
|
|
|
|
}
|
|
|
|
|
portraitModel
|
|
|
|
|
.submit({
|
|
|
|
|
@ -381,6 +387,7 @@ const addData = (myChart, newData, color) => {
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
getList();
|
|
|
|
|
optionData()
|
|
|
|
|
var chartDom = document.getElementById("main");
|
|
|
|
|
var chartDom2 = document.getElementById("main2");
|
|
|
|
|
myChart = echarts.init(chartDom);
|
|
|
|
|
@ -415,47 +422,49 @@ onMounted(() => {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const optionData = () => {
|
|
|
|
|
loading1.value=true
|
|
|
|
|
API.viewingMetrics({userId:JSON.parse(getUserInfo()).userId,tableName:input.value,algorithmName:'聚类分析'}).then((res)=>{
|
|
|
|
|
tableData.value=[]
|
|
|
|
|
input3.value=''
|
|
|
|
|
res.data.forEach(element => {
|
|
|
|
|
loading1.value = true;
|
|
|
|
|
API.viewingMetrics({ userId: JSON.parse(getUserInfo()).userId, tableName: input.value, algorithmName: "聚类分析" })
|
|
|
|
|
.then((res) => {
|
|
|
|
|
tableData.value = [];
|
|
|
|
|
input3.value = "";
|
|
|
|
|
res.data.forEach((element) => {
|
|
|
|
|
tableData.value.push({
|
|
|
|
|
text:element
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
loading1.value=false
|
|
|
|
|
}).catch(()=>{
|
|
|
|
|
loading1.value=false
|
|
|
|
|
text: element,
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
loading1.value = false;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
.catch(() => {
|
|
|
|
|
loading1.value = false;
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const selectedRows = ref([]);
|
|
|
|
|
const handleSelectionChange = (selection) => {
|
|
|
|
|
selectedRows.value = selection;
|
|
|
|
|
};
|
|
|
|
|
const tableData2=ref([])
|
|
|
|
|
const tableData3=ref([])
|
|
|
|
|
const resTable2=ref()
|
|
|
|
|
const tableData2 = ref([]);
|
|
|
|
|
const tableData3 = ref([]);
|
|
|
|
|
const resTable2 = ref();
|
|
|
|
|
const taskZB = () => {
|
|
|
|
|
flag.value=true
|
|
|
|
|
flag.value = true;
|
|
|
|
|
if (selectedRows.value.length === 0) {
|
|
|
|
|
return
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const sendData = {
|
|
|
|
|
tableName: input.value,
|
|
|
|
|
userId: JSON.parse(getUserInfo()).userId,
|
|
|
|
|
fieldList:selectedRows.value.map(item=>item.text)
|
|
|
|
|
}
|
|
|
|
|
fieldList: selectedRows.value.map((item) => item.text),
|
|
|
|
|
};
|
|
|
|
|
API.analysisDataDisplay(sendData).then((res) => {
|
|
|
|
|
tableLabel.length=0
|
|
|
|
|
tableLabel.length = 0;
|
|
|
|
|
for (const key in res.data[0]) {
|
|
|
|
|
tableLabel.push({
|
|
|
|
|
label: key,
|
|
|
|
|
prop:key
|
|
|
|
|
})
|
|
|
|
|
prop: key,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
tableData2.value=res.data
|
|
|
|
|
flag.value=true
|
|
|
|
|
tableData2.value = res.data;
|
|
|
|
|
flag.value = true;
|
|
|
|
|
// proxy.$modal.msgSuccess("计算完成!");
|
|
|
|
|
tableData2.value = res.data;
|
|
|
|
|
flag.value = true;
|
|
|
|
|
@ -465,7 +474,7 @@ const formInline = reactive({
|
|
|
|
|
user: "",
|
|
|
|
|
region: "",
|
|
|
|
|
});
|
|
|
|
|
const input = ref();
|
|
|
|
|
const input = ref(algorithmStore.userDataLabel[0]);
|
|
|
|
|
const options = ref([]);
|
|
|
|
|
const input2 = ref();
|
|
|
|
|
const options2 = ref([
|
|
|
|
|
@ -517,17 +526,19 @@ const optionData2 = () => {
|
|
|
|
|
method: input3.value,
|
|
|
|
|
userId: JSON.parse(getUserInfo()).userId,
|
|
|
|
|
});
|
|
|
|
|
loading2.value=true
|
|
|
|
|
API.dataPreprocessing(sendData.value).then((res) => {
|
|
|
|
|
loading2.value = true;
|
|
|
|
|
API.dataPreprocessing(sendData.value)
|
|
|
|
|
.then((res) => {
|
|
|
|
|
resTable2.value = res.data;
|
|
|
|
|
tableData2.value = [];
|
|
|
|
|
tableData2.value = res.data;
|
|
|
|
|
proxy.$modal.msgSuccess("预处理成功!");
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
loading2.value=false
|
|
|
|
|
},500)
|
|
|
|
|
}).catch(()=>{
|
|
|
|
|
loading2.value=false
|
|
|
|
|
loading2.value = false;
|
|
|
|
|
}, 500);
|
|
|
|
|
})
|
|
|
|
|
.catch(() => {
|
|
|
|
|
loading2.value = false;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
@ -540,7 +551,7 @@ const clusterAnalysisCalculation = () => {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (input5.value && input6.value && input4.value) {
|
|
|
|
|
loading3.value=true
|
|
|
|
|
loading3.value = true;
|
|
|
|
|
const sendData = {
|
|
|
|
|
k: input5.value,
|
|
|
|
|
t: input6.value,
|
|
|
|
|
@ -604,11 +615,12 @@ const clusterAnalysisCalculation = () => {
|
|
|
|
|
addData(myChart2, res.data.centroid[key], "red");
|
|
|
|
|
});
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
loading3.value=false
|
|
|
|
|
},500)
|
|
|
|
|
loading3.value = false;
|
|
|
|
|
}, 500);
|
|
|
|
|
});
|
|
|
|
|
}).catch(()=>{
|
|
|
|
|
loading3.value=false
|
|
|
|
|
})
|
|
|
|
|
.catch(() => {
|
|
|
|
|
loading3.value = false;
|
|
|
|
|
});
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|